From 723e6584e0dd23861b9f13ef986debe3c9a00f5f Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 22 Feb 2026 00:04:13 +1100 Subject: [PATCH 01/14] fix marketplace nft collection sql queries --- .../src/marketplace/client.edge.test.ts | 59 + .../arcade-ts/src/marketplace/client.edge.ts | 43 +- .../arcade-ts/src/marketplace/filters.test.ts | 62 + packages/arcade-ts/src/marketplace/filters.ts | 29 +- pnpm-lock.yaml | 1195 ++++------------- 5 files changed, 470 insertions(+), 918 deletions(-) diff --git a/packages/arcade-ts/src/marketplace/client.edge.test.ts b/packages/arcade-ts/src/marketplace/client.edge.test.ts index 09fa69a4..b7949375 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.test.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.test.ts @@ -70,4 +70,63 @@ describe("createEdgeMarketplaceClient", () => { expect.stringContaining("FROM tokens"), ); }); + + it("normalizes tokenIds before building SQL IN clause", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + tokenIds: ["0x1"], + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("token_id IN ('1')"); + }); + + it("returns null nextCursor when limit is invalid and no rows are returned", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const result = await client.listCollectionTokens({ + address: "0xabc", + limit: 0, + fetchImages: false, + }); + + expect(result.error).toBeNull(); + expect(result.page?.nextCursor).toBeNull(); + }); + + it("short-circuits invalid orderIds without issuing malformed SQL", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const orders = await client.getCollectionOrders({ + collection: "0xabc", + orderIds: [Number.NaN as unknown as number], + }); + + expect(orders).toEqual([]); + expect(mockedFetchToriisSql).not.toHaveBeenCalled(); + }); }); diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 980286fa..4e7e21f4 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -22,6 +22,7 @@ import { defaultResolveContractImage, defaultResolveTokenImage, inferImageFromMetadata, + normalizeTokenIds, normalizeTokens, parseJsonSafe, } from "./utils"; @@ -90,6 +91,13 @@ const extractRows = (data: any): any[] => { const toSqlList = (values: string[]): string => values.map((value) => `'${escapeSqlValue(value)}'`).join(", "); +const toPositiveInt = (value: number, fallback: number): number => { + if (!Number.isFinite(value)) return fallback; + const intValue = Math.floor(value); + if (intValue <= 0) return fallback; + return intValue; +}; + async function querySql(projectId: string, sql: string): Promise { const result = await fetchToriisSql([projectId], sql); if (result.errors?.length) { @@ -293,14 +301,16 @@ LIMIT 1`, const projectId = ensureProjectId(project, defaultProject); const collection = addAddressPadding(getChecksumAddress(address)); const offset = cursor ? Number.parseInt(cursor, 10) || 0 : 0; + const effectiveLimit = toPositiveInt(limit, DEFAULT_LIMIT); + const normalizedTokenIds = normalizeTokenIds(tokenIds); const conditions = [ `lower(contract_address) = lower('${escapeSqlValue(collection)}')`, ]; - if (tokenIds && tokenIds.length > 0) { + if (normalizedTokenIds.length > 0) { const values = [ - ...new Set(tokenIds.map((value) => escapeSqlValue(value))), + ...new Set(normalizedTokenIds.map((value) => escapeSqlValue(value))), ]; conditions.push( `token_id IN (${values.map((v) => `'${v}'`).join(", ")})`, @@ -311,7 +321,7 @@ LIMIT 1`, FROM tokens WHERE ${conditions.join(" AND ")} ORDER BY token_id -LIMIT ${Math.max(1, Math.floor(limit))} +LIMIT ${effectiveLimit} OFFSET ${Math.max(0, offset)}`; try { @@ -326,7 +336,7 @@ OFFSET ${Math.max(0, offset)}`; ) as NormalizedToken[]; const nextCursor = - rows.length >= limit ? String(offset + rows.length) : null; + rows.length >= effectiveLimit ? String(offset + rows.length) : null; return { page: { tokens: filtered, @@ -357,16 +367,28 @@ OFFSET ${Math.max(0, offset)}`; const category = options.category != null ? categoryValueMap[options.category] : undefined; + const normalizedOrderIds = options.orderIds?.length + ? [ + ...new Set( + options.orderIds + .map((id) => Number(id)) + .filter((id) => Number.isInteger(id) && id >= 0), + ), + ] + : []; + + if (options.orderIds?.length && normalizedOrderIds.length === 0) { + return []; + } + const conditions = [ `lower(collection) = lower('${escapeSqlValue(collection)}')`, ]; if (tokenId !== undefined) { conditions.push(`token_id = '${escapeSqlValue(tokenId)}'`); } - if (options.orderIds?.length) { - conditions.push( - `id IN (${options.orderIds.map((id) => Number(id)).join(", ")})`, - ); + if (normalizedOrderIds.length) { + conditions.push(`id IN (${normalizedOrderIds.join(", ")})`); } if (status !== undefined) { conditions.push(`status = ${status}`); @@ -378,10 +400,13 @@ OFFSET ${Math.max(0, offset)}`; conditions.push(`category = ${category}`); } + const effectiveLimit = options.limit + ? toPositiveInt(options.limit, DEFAULT_LIMIT) + : undefined; const sql = `SELECT id, category, status, expiration, collection, token_id, quantity, price, currency, owner FROM "ARCADE-Order" WHERE ${conditions.join(" AND ")} -ORDER BY id DESC${options.limit ? ` LIMIT ${Math.max(1, Math.floor(options.limit))}` : ""}`; +ORDER BY id DESC${effectiveLimit ? ` LIMIT ${effectiveLimit}` : ""}`; const rows = await querySql(defaultProject, sql); return rows.map(toOrderModel).filter((order) => order.exists()); diff --git a/packages/arcade-ts/src/marketplace/filters.test.ts b/packages/arcade-ts/src/marketplace/filters.test.ts index 263670c3..0d0f6459 100644 --- a/packages/arcade-ts/src/marketplace/filters.test.ts +++ b/packages/arcade-ts/src/marketplace/filters.test.ts @@ -3,6 +3,7 @@ import { aggregateTraitMetadata, buildAvailableFilters, buildPrecomputedFilters, + fetchTraitValues, fetchCollectionTraitMetadata, filterTokensByMetadata, flattenActiveFilters, @@ -195,4 +196,65 @@ describe("marketplace filters helpers", () => { expect(available.Background?.Blue).toBe(20); expect(available.Ring?.Gold).toBe(30); }); + + it("groups OR trait filters before applying collection scope", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + }); + + await fetchCollectionTraitMetadata({ + address: "0x123", + traits: [ + { name: "Rarity", value: "Legendary" }, + { name: "Background", value: "Gold" }, + ], + projects: ["arcade-main"], + }); + + const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(query).toMatch( + /\(\(trait_name = 'Rarity' AND trait_value = 'Legendary'\) OR \(trait_name = 'Background' AND trait_value = 'Gold'\)\)\s+AND token_id LIKE/, + ); + }); + + it("uses unique trait count when multiple values are selected for the same trait", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + }); + + await fetchTraitValues({ + address: "0x123", + traitName: "Background", + otherTraitFilters: [ + { name: "Rarity", value: "Legendary" }, + { name: "Rarity", value: "Epic" }, + ], + projects: ["arcade-main"], + }); + + const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(query).toContain("HAVING COUNT(DISTINCT trait_name) = 1"); + }); + + it("uses exact trait comparisons instead of LIKE wildcards", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + }); + + await fetchTraitValues({ + address: "0x123", + traitName: "Background", + otherTraitFilters: [{ name: "Rarity", value: "Legendary" }], + projects: ["arcade-main"], + }); + + const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(query).toContain("trait_name = 'Rarity'"); + expect(query).toContain("trait_value = 'Legendary'"); + expect(query).not.toContain("trait_name LIKE"); + expect(query).not.toContain("trait_value LIKE"); + }); }); diff --git a/packages/arcade-ts/src/marketplace/filters.ts b/packages/arcade-ts/src/marketplace/filters.ts index 03f5f2f8..9e4513c8 100644 --- a/packages/arcade-ts/src/marketplace/filters.ts +++ b/packages/arcade-ts/src/marketplace/filters.ts @@ -112,13 +112,17 @@ const buildTraitWhereClause = (traits: TraitSelection[]): string => { return "1 = 1"; } - return traits - .map(({ name, value }) => { - const traitName = escapeSqlValue(name); - const traitValue = escapeSqlValue(value); - return `(trait_name LIKE '${traitName}' AND trait_value LIKE '${traitValue}')`; - }) - .join(" OR "); + const conditions = traits.map(({ name, value }) => { + const traitName = escapeSqlValue(name); + const traitValue = escapeSqlValue(value); + return `(trait_name = '${traitName}' AND trait_value = '${traitValue}')`; + }); + + return `(${conditions.join(" OR ")})`; +}; + +const countDistinctTraitNames = (traits: TraitSelection[]): number => { + return new Set(traits.map((trait) => trait.name)).size; }; const buildTraitNamesSummaryQuery = (address: string): string => { @@ -164,6 +168,7 @@ ORDER BY count DESC`; } const whereClause = buildTraitWhereClause(otherTraitFilters); + const distinctTraitCount = countDistinctTraitNames(otherTraitFilters); return `SELECT trait_value, COUNT(*) as count FROM token_attributes WHERE trait_name = '${escapedTraitName}' @@ -173,7 +178,7 @@ WHERE trait_name = '${escapedTraitName}' WHERE ${whereClause} AND token_id LIKE '${paddedAddress}:%' GROUP BY token_id - HAVING COUNT(DISTINCT trait_name) = ${otherTraitFilters.length} + HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount} ) GROUP BY trait_value ORDER BY count DESC`; @@ -208,6 +213,7 @@ ORDER BY trait_name, count DESC`; } const whereClause = buildTraitWhereClause(otherTraitFilters); + const distinctTraitCount = countDistinctTraitNames(otherTraitFilters); return `SELECT trait_name, trait_value, COUNT(*) as count FROM token_attributes WHERE trait_name IN (${traitNamesCondition}) @@ -217,7 +223,7 @@ WHERE trait_name IN (${traitNamesCondition}) WHERE ${whereClause} AND token_id LIKE '${paddedAddress}:%' GROUP BY token_id - HAVING COUNT(DISTINCT trait_name) = ${otherTraitFilters.length} + HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount} ) GROUP BY trait_name, trait_value ORDER BY trait_name, count DESC`; @@ -232,8 +238,9 @@ const buildTraitMetadataQuery = ({ }): string => { const paddedAddress = addAddressPadding(address); const whereClause = buildTraitWhereClause(traits); - const havingClause = traits.length - ? `HAVING COUNT(DISTINCT trait_name) = ${traits.length}` + const distinctTraitCount = countDistinctTraitNames(traits); + const havingClause = distinctTraitCount + ? `HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount}` : ""; return `SELECT trait_name, trait_value, COUNT(*) AS count diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b54413a..ca66af9c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true + autoInstallPeers: false excludeLinksFromLockfile: false catalogs: @@ -91,7 +91,7 @@ importers: version: 3.6.2 tsup: specifier: ^8.3.5 - version: 8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) + version: 8.5.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) turbo: specifier: ^2.5.4 version: 2.5.8 @@ -103,10 +103,10 @@ importers: version: link:../packages/arcade-ts '@cartridge/connector': specifier: 'catalog:' - version: 0.13.5(@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.13.5(@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2))(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) '@cartridge/controller': specifier: 'catalog:' - version: 0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) '@cartridge/penpal': specifier: ^6.2.3 version: 6.2.4 @@ -115,25 +115,25 @@ importers: version: https://codeload.github.com/cartridge-gg/presets/tar.gz/e6a5022 '@cartridge/ui': specifier: 'catalog:' - version: https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) + version: https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(typescript@5.9.2)(zod@3.25.76)) '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 1.8.8(typescript@5.9.2) '@dojoengine/grpc': specifier: 'catalog:' version: 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) '@dojoengine/react': specifier: 'catalog:' - version: 1.8.11(c998c8033210fb011698e80132fb45f4) + version: 1.8.11(849fa0decdfe17b50f0ce7229920519c) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) + version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) '@dojoengine/torii-wasm': specifier: 'catalog:' version: 1.8.2 '@effect-atom/atom-react': specifier: ^0.1.0 - version: 0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) + version: 0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) '@hookform/resolvers': specifier: ^3.10.0 version: 3.10.0(react-hook-form@7.63.0(react@19.2.1)) @@ -163,7 +163,7 @@ importers: version: 5.0.1 '@starknet-react/core': specifier: 'catalog:' - version: 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) '@tanstack/query-async-storage-persister': specifier: ^5.85.3 version: 5.90.2 @@ -190,7 +190,7 @@ importers: version: 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@vercel/node': specifier: ^5.3.24 - version: 5.3.26(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@2.79.2) + version: 5.3.26(@swc/core@1.13.19)(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@4.52.2) chart.js: specifier: ^4.4.8 version: 4.5.0 @@ -259,16 +259,16 @@ importers: version: 3.3.1 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) viem: specifier: ^2.22.9 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.37.8(typescript@5.9.2)(zod@3.25.76) vite-plugin-mkcert: specifier: ^1.17.6 version: 1.17.8(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.6.0(@swc/helpers@0.5.17)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 1.6.0(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vite-plugin-wasm: specifier: ^3.3.0 version: 3.5.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) @@ -287,28 +287,28 @@ importers: version: 9.36.0 '@storybook/addon-docs': specifier: ^10.2.8 - version: 10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/addon-links': specifier: ^10.2.8 - version: 10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + version: 10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@storybook/addon-themes': specifier: ^10.2.8 - version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@storybook/blocks': specifier: ^8.5.0 - version: 8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + version: 8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@storybook/react': specifier: ^10.2.8 - version: 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) + version: 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) '@storybook/react-vite': specifier: ^10.2.8 - version: 10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/test': specifier: ^8.5.0 - version: 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + version: 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@tanstack/react-router-devtools': specifier: ^1.131.8 - version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': specifier: ^1.131.8 version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) @@ -329,7 +329,7 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.11.0(@swc/helpers@0.5.17)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 3.11.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) autoprefixer: specifier: ^10.4.18 version: 10.4.21(postcss@8.5.6) @@ -344,7 +344,7 @@ importers: version: 0.4.21(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-storybook: specifier: 10.2.8 - version: 10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) + version: 10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) globals: specifier: ^15.9.0 version: 15.15.0 @@ -353,10 +353,10 @@ importers: version: 8.5.6 storybook: specifier: ^10.2.8 - version: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + version: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tailwindcss: specifier: ^3.4.3 - version: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + version: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) typescript: specifier: ^5.5.3 version: 5.9.2 @@ -368,13 +368,13 @@ importers: version: 5.4.20(@types/node@20.19.17)(terser@5.44.0) vite-plugin-pwa: specifier: ^1.0.0 - version: 1.0.3(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.0.3(@types/babel__core@7.20.5)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-window@7.3.0) vite-plugin-vercel: specifier: ^9.0.7 - version: 9.0.7(encoding@0.1.13)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 9.0.7(encoding@0.1.13)(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vitest: specifier: ^3.2.4 - version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) + version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) contracts: dependencies: @@ -391,13 +391,13 @@ importers: dependencies: '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + version: 1.8.8(typescript@5.8.3) '@dojoengine/grpc': specifier: 'catalog:' - version: 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + version: 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) + version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1)) '@dojoengine/torii-client': specifier: 'catalog:' version: 1.8.2 @@ -419,7 +419,7 @@ importers: version: 5.90.2(react@19.2.1) '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@types/node': specifier: ^20.11.10 version: 20.19.17 @@ -440,7 +440,7 @@ importers: version: 19.2.1 tsup: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + version: 8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) typedoc: specifier: ^0.27.0 version: 0.27.9(typescript@5.8.3) @@ -452,13 +452,13 @@ importers: version: 5.8.3 vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.6.0(@swc/helpers@0.5.17)(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.6.0(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite-plugin-wasm: specifier: ^3.5.0 version: 3.5.0(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) + version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) packages/collection: {} @@ -472,17 +472,17 @@ importers: dependencies: '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + version: 1.8.8(typescript@5.9.2) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) + version: 1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1)) starknet: specifier: 'catalog:' version: 8.5.4 devDependencies: tsup: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) + version: 8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) packages/orderbook: {} @@ -520,15 +520,6 @@ packages: peerDependencies: ajv: '>=8' - '@asamuzakjp/css-color@4.0.5': - resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} - - '@asamuzakjp/dom-selector@6.6.1': - resolution: {integrity: sha512-8QT9pokVe1fUt1C8IrJketaeFOdRfTOS96DL3EBjE8CRZm3eHnwMlQe2NPoOSEYPwJ5Q25uYoX1+m9044l3ysQ==} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1245,40 +1236,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@5.1.0': - resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-color-parser@3.1.0': - resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-syntax-patches-for-csstree@1.0.14': - resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - '@dojoengine/core@1.8.8': resolution: {integrity: sha512-q0eqP/DXKfpXzV68nCk84yFM2wNawLiuM1NLiq1+VvhqSFuLBk/iDaAOWSBf634RH5/9z0Lrd8S/ZQbrdVEd6w==} hasBin: true @@ -1365,19 +1322,6 @@ packages: '@effect/rpc': ^0.69.0 effect: ^3.17.7 - '@effect/experimental@0.57.5': - resolution: {integrity: sha512-Qk9+LiIGIsL250ky2SIqQrUPOy/ZtWF5kgWgAH2fjghibl8mooSTWtDsKx85Z4FRzftrJwVHtNxPcK+4iz7sGQ==} - peerDependencies: - '@effect/platform': ^0.93.4 - effect: ^3.19.6 - ioredis: ^5 - lmdb: ^3 - peerDependenciesMeta: - ioredis: - optional: true - lmdb: - optional: true - '@effect/opentelemetry@0.59.1': resolution: {integrity: sha512-mG+duN2KLJR6lDwuxEyoZqe5/4aSVnK50MoY87AC/u3hQGiSHxP7tZIORUghKd6JEEODJb4zP8eo7wmW7EGTuw==} peerDependencies: @@ -1407,17 +1351,6 @@ packages: '@opentelemetry/sdk-trace-web': optional: true - '@effect/platform@0.93.4': - resolution: {integrity: sha512-hb4WSBEbk7WVe+aTl04E8ZxK9ZZxb2drI04DYXkTlIaf2Sj4t9vNIHxi1XRAn5KOYQj4OUU9KSd53qbCwKUlzA==} - peerDependencies: - effect: ^3.19.6 - - '@effect/rpc@0.72.2': - resolution: {integrity: sha512-BmTXybXCOq96D2r9mvSW/YdiTQs5CStnd4II+lfVKrMr3pMNERKLZ2LG37Tfm4Sy3Q8ire6IVVKO/CN+VR0uQQ==} - peerDependencies: - '@effect/platform': ^0.93.3 - effect: ^3.19.5 - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -2080,36 +2013,6 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - '@noble/ciphers@0.5.3': resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} @@ -2901,8 +2804,6 @@ packages: '@reown/appkit-utils@1.8.1': resolution: {integrity: sha512-WK+Fy17Qv4Vdx/L9gvCoBd3oikONIcrfkGmstk83+lQcM0krNHLPEA2gWytBOtetW+1bt+IwTaF2m4PKCrgIDw==} - peerDependencies: - valtio: 2.1.5 '@reown/appkit-wallet@1.8.1': resolution: {integrity: sha512-luqzVqQdY+WlxFTQsH0RK53dAYhNfIyyimSkkIcNCnMIWYfq2xseeaKeSwViF+af1ae7tYEqZdq/6ohbMizPaw==} @@ -3327,9 +3228,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -3421,7 +3319,6 @@ packages: peerDependencies: '@tanstack/router-core': ^1.132.21 csstype: ^3.0.10 - solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: @@ -3494,10 +3391,6 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} - engines: {node: '>=18'} - '@testing-library/jest-dom@6.5.0': resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -3600,9 +3493,6 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3630,9 +3520,6 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@16.18.11': resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} @@ -4179,9 +4066,6 @@ packages: resolution: {integrity: sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==} hasBin: true - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -4232,10 +4116,6 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.0.9: - resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} - engines: {node: '>=6.14.2'} - bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -4466,10 +4346,6 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -4478,10 +4354,6 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@5.3.1: - resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -4494,10 +4366,6 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} - data-urls@6.0.0: - resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} - engines: {node: '>=20'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -4701,10 +4569,6 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -5051,9 +4915,6 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} - find-my-way-ts@0.1.6: - resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5170,10 +5031,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-starknet-core@4.0.0: - resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==} - deprecated: Package no longer supported. Please use @starknet-io/get-starknet-core - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5281,14 +5138,6 @@ packages: resolution: {integrity: sha512-hssVL7cGvRNxE/YJ9RwxTsi48xKbX2O6SjPfGyeuFTBGDe/C/akLIjQYpE2Ea1GrSgH4htY0AW9z98w82C6OAA==} engines: {node: '>=16.0.0'} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -5451,9 +5300,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5569,15 +5415,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsdom@27.0.0: - resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} - engines: {node: '>=20'} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5771,9 +5608,6 @@ packages: engines: {node: '>= 18'} hasBin: true - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -5882,19 +5716,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.5: - resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} - multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - multipasta@0.2.7: - resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -5938,10 +5762,6 @@ packages: resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} hasBin: true - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -6087,9 +5907,6 @@ packages: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -6541,9 +6358,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -6576,10 +6390,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -6833,9 +6643,6 @@ packages: peerDependencies: react: ^19.0.0 - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -6932,13 +6739,6 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} - tldts-core@7.0.16: - resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} - - tldts@7.0.16: - resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} - hasBin: true - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -6947,20 +6747,12 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -7331,10 +7123,6 @@ packages: peerDependencies: react: ^19.0.0 - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -7342,10 +7130,6 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -7416,7 +7200,6 @@ packages: peerDependencies: '@vite-pwa/assets-generator': ^1.0.0 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - workbox-build: ^7.3.0 workbox-window: ^7.3.0 peerDependenciesMeta: '@vite-pwa/assets-generator': @@ -7543,10 +7326,6 @@ packages: jsdom: optional: true - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -7556,26 +7335,9 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} - engines: {node: '>=20'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@15.1.0: - resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} - engines: {node: '>=20'} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -7743,13 +7505,6 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -7858,27 +7613,6 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - '@asamuzakjp/css-color@4.0.5': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 - optional: true - - '@asamuzakjp/dom-selector@6.6.1': - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.1.0 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.2 - optional: true - - '@asamuzakjp/nwsapi@2.3.9': - optional: true - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -8612,10 +8346,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@cartridge/connector@0.13.5(@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@cartridge/connector@0.13.5(@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2))(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@cartridge/controller': 0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@cartridge/controller': 0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -8646,18 +8380,18 @@ snapshots: '@cartridge/controller-wasm@0.9.3': {} - '@cartridge/controller@0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@cartridge/controller@0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: '@cartridge/controller-wasm': 0.9.3 '@cartridge/penpal': 6.2.4 '@starknet-io/get-starknet-wallet-standard': 5.0.0-beta.0(typescript@5.9.2)(zod@3.25.76) '@starknet-io/types-js': 0.9.1 '@telegram-apps/sdk': 2.11.3 - '@turnkey/sdk-browser': 4.3.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/ethereum-provider': 2.21.9(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@turnkey/sdk-browser': 4.3.0(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/ethereum-provider': 2.21.9(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) bs58: 6.0.0 cbor-x: 1.6.0 - ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ethers: 6.15.0 micro-sol-signer: 0.5.0 mipd: 0.0.7(typescript@5.9.2) open: 10.2.0 @@ -8700,7 +8434,7 @@ snapshots: dependencies: '@starknet-io/types-js': 0.7.7 - '@cartridge/ui@https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@cartridge/ui@https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(typescript@5.9.2)(zod@3.25.76))': dependencies: '@cartridge/presets': https://codeload.github.com/cartridge-gg/presets/tar.gz/90a5fe0 '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -8736,9 +8470,9 @@ snapshots: starknet: 8.5.4 swr: 2.3.6(react@19.2.1) tailwind-merge: 2.6.0 - tailwindcss-animate: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) + tailwindcss-animate: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -8877,39 +8611,9 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@5.1.0': - optional: true - - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - optional: true - - '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/color-helpers': 5.1.0 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - optional: true - - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-tokenizer': 3.0.4 - optional: true - - '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': - dependencies: - postcss: 8.5.6 - optional: true - - '@csstools/css-tokenizer@3.0.4': - optional: true - - '@dojoengine/core@1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@dojoengine/core@1.8.8(typescript@5.8.3)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) starknet: 8.5.4 zod: 3.25.76 transitivePeerDependencies: @@ -8917,9 +8621,9 @@ snapshots: - typescript - utf-8-validate - '@dojoengine/core@1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@dojoengine/core@1.8.8(typescript@5.9.2)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) starknet: 8.5.4 zod: 3.25.76 transitivePeerDependencies: @@ -8927,30 +8631,6 @@ snapshots: - typescript - utf-8-validate - '@dojoengine/grpc@1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': - dependencies: - '@effect/opentelemetry': 0.59.1(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) - '@grpc/grpc-js': 1.14.0 - '@opentelemetry/api': 1.9.0 - '@protobuf-ts/grpcweb-transport': 2.11.1 - '@protobuf-ts/plugin': 2.11.1 - '@protobuf-ts/runtime': 2.11.1 - '@protobuf-ts/runtime-rpc': 2.11.1 - effect: 3.19.7 - google-protobuf: 3.21.4 - grpc-web: 1.5.0 - starknet: 8.5.4 - transitivePeerDependencies: - - '@effect/platform' - - '@opentelemetry/resources' - - '@opentelemetry/sdk-logs' - - '@opentelemetry/sdk-metrics' - - '@opentelemetry/sdk-trace-base' - - '@opentelemetry/sdk-trace-node' - - '@opentelemetry/sdk-trace-web' - - '@opentelemetry/semantic-conventions' - - supports-color - '@dojoengine/grpc@1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': dependencies: '@effect/opentelemetry': 0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) @@ -8975,18 +8655,18 @@ snapshots: - '@opentelemetry/semantic-conventions' - supports-color - '@dojoengine/react@1.8.11(c998c8033210fb011698e80132fb45f4)': + '@dojoengine/react@1.8.11(849fa0decdfe17b50f0ce7229920519c)': dependencies: - '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@dojoengine/core': 1.8.8(typescript@5.9.2) '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@dojoengine/sdk': 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/sdk': 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@effect-atom/atom': 0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7) - '@effect-atom/atom-react': 0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) + '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76) + '@effect-atom/atom': 0.1.22(effect@3.19.7) + '@effect-atom/atom-react': 0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) '@effect/opentelemetry': 0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) '@latticexyz/utils': 2.2.23 '@opentelemetry/api': 1.9.0 @@ -9023,9 +8703,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@dojoengine/recs@2.0.13(typescript@5.8.3)(zod@3.25.76)': dependencies: - '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@latticexyz/schema-type': 2.0.12(typescript@5.8.3)(zod@3.25.76) '@latticexyz/utils': 2.0.12 mobx: 6.13.7 rxjs: 7.5.5 @@ -9035,9 +8715,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@dojoengine/recs@2.0.13(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@latticexyz/schema-type': 2.0.12(typescript@5.9.2)(zod@3.25.76) '@latticexyz/utils': 2.0.12 mobx: 6.13.7 rxjs: 7.5.5 @@ -9047,16 +8727,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': + '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76)': dependencies: - '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) - '@dojoengine/grpc': 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) + '@dojoengine/core': 1.8.8(typescript@5.9.2) + '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -9084,16 +8764,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))': dependencies: - '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@dojoengine/core': 1.8.8(typescript@5.8.3) '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1)) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.8.3) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -9121,16 +8801,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': + '@dojoengine/sdk@1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))': dependencies: - '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) - '@dojoengine/grpc': 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) + '@dojoengine/core': 1.8.8(typescript@5.9.2) + '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1)) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -9158,9 +8838,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -9174,9 +8854,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -9190,9 +8870,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -9212,9 +8892,9 @@ snapshots: '@dojoengine/torii-wasm@1.8.2': {} - '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.8.3)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -9225,9 +8905,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.9.2)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -9238,9 +8918,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -9263,9 +8943,9 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 - '@effect-atom/atom-react@0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0)': + '@effect-atom/atom-react@0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0)': dependencies: - '@effect-atom/atom': 0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7) + '@effect-atom/atom': 0.1.22(effect@3.19.7) effect: 3.19.7 react: 19.2.1 scheduler: 0.27.0 @@ -9274,30 +8954,10 @@ snapshots: - '@effect/platform' - '@effect/rpc' - '@effect-atom/atom@0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)': + '@effect-atom/atom@0.1.22(effect@3.19.7)': dependencies: - '@effect/experimental': 0.57.5(effect@3.19.7) - '@effect/rpc': 0.72.2(effect@3.19.7) effect: 3.19.7 - '@effect/experimental@0.57.5(effect@3.19.7)': - dependencies: - effect: 3.19.7 - uuid: 11.1.0 - - '@effect/opentelemetry@0.59.1(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7)': - dependencies: - '@effect/platform': 0.93.4(effect@3.19.7) - '@opentelemetry/semantic-conventions': 1.38.0 - effect: 3.19.7 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-node': 2.2.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 2.2.0(@opentelemetry/api@1.9.0) - '@effect/opentelemetry@0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7)': dependencies: '@opentelemetry/semantic-conventions': 1.38.0 @@ -9311,18 +8971,6 @@ snapshots: '@opentelemetry/sdk-trace-node': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': 2.2.0(@opentelemetry/api@1.9.0) - '@effect/platform@0.93.4(effect@3.19.7)': - dependencies: - effect: 3.19.7 - find-my-way-ts: 0.1.6 - msgpackr: 1.11.5 - multipasta: 0.2.7 - - '@effect/rpc@0.72.2(effect@3.19.7)': - dependencies: - effect: 3.19.7 - msgpackr: 1.11.5 - '@esbuild/aix-ppc64@0.21.5': optional: true @@ -9724,20 +9372,20 @@ snapshots: '@kurkle/color@0.3.4': {} - '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@latticexyz/schema-type@2.0.12(typescript@5.8.3)(zod@3.25.76)': dependencies: abitype: 1.0.0(typescript@5.8.3)(zod@3.25.76) - viem: 2.9.20(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.9.20(typescript@5.8.3)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@latticexyz/schema-type@2.0.12(typescript@5.9.2)(zod@3.25.76)': dependencies: abitype: 1.0.0(typescript@5.9.2)(zod@3.25.76) - viem: 2.9.20(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.9.20(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -9804,24 +9452,6 @@ snapshots: '@msgpack/msgpack@3.1.2': {} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - '@noble/ciphers@0.5.3': {} '@noble/ciphers@1.3.0': {} @@ -10604,35 +10234,35 @@ snapshots: '@remix-run/router@1.23.0': {} - '@reown/appkit-common@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4)': + '@reown/appkit-common@1.8.1(typescript@5.9.2)(zod@3.22.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.37.8(typescript@5.9.2)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-common@1.8.1(typescript@5.9.2)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-controllers@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) + '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10661,12 +10291,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-pay@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) lit: 3.3.0 valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) transitivePeerDependencies: @@ -10701,13 +10331,13 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) lit: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -10735,15 +10365,14 @@ snapshots: - typescript - uploadthing - utf-8-validate - - valtio - zod - '@reown/appkit-ui@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit-ui@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: '@phosphor-icons/webcomponents': 2.1.5 - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) lit: 3.3.0 qrcode: 1.5.3 transitivePeerDependencies: @@ -10774,17 +10403,17 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76)': + '@reown/appkit-utils@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.1 - '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) '@wallet-standard/wallet': 1.1.0 '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10813,9 +10442,9 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@reown/appkit-wallet@1.8.1(typescript@5.9.2)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.22.4) '@reown/appkit-polyfills': 1.8.1 '@walletconnect/logger': 2.1.2 zod: 3.22.4 @@ -10824,21 +10453,21 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@reown/appkit@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-pay': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-pay': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.1 - '@reown/appkit-scaffold-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) + '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) bs58: 6.0.0 semver: 7.7.2 valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) optionalDependencies: '@lit/react': 1.0.8(@types/react@19.2.7) transitivePeerDependencies: @@ -10906,10 +10535,6 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/plugin-virtual@3.0.2(rollup@2.79.2)': - optionalDependencies: - rollup: 2.79.2 - '@rollup/plugin-virtual@3.0.2(rollup@4.52.2)': optionalDependencies: rollup: 4.52.2 @@ -10929,6 +10554,14 @@ snapshots: optionalDependencies: rollup: 2.79.2 + '@rollup/pluginutils@5.3.0(rollup@4.52.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.2 + '@rollup/rollup-android-arm-eabi@4.52.2': optional: true @@ -11068,49 +10701,47 @@ snapshots: '@starknet-react/chains@5.0.1': {} - '@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10)': + '@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 5.0.1 '@tanstack/react-query': 5.90.2(react@19.2.1) abi-wan-kanabi: 2.2.4 eventemitter3: 5.0.1 - get-starknet-core: 4.0.0 react: 19.2.1 starknet: 8.5.4 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.8.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)': + '@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 5.0.1 '@tanstack/react-query': 5.90.2(react@19.2.1) abi-wan-kanabi: 2.2.4 eventemitter3: 5.0.1 - get-starknet-core: 4.0.0 react: 19.2.1 starknet: 8.5.4 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@storybook/addon-docs@10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/addon-docs@10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.1) - '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/icons': 2.0.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -11119,31 +10750,31 @@ snapshots: - vite - webpack - '@storybook/addon-links@10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/addon-links@10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@storybook/global': 5.0.0 - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) optionalDependencies: react: 19.2.1 - '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-dedent: 2.2.0 - '@storybook/blocks@8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/blocks@8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@storybook/icons': 1.6.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-dedent: 2.2.0 optionalDependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@storybook/builder-vite@10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/builder-vite@10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) ts-dedent: 2.2.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: @@ -11151,13 +10782,13 @@ snapshots: - rollup - webpack - '@storybook/csf-plugin@10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/csf-plugin@10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) unplugin: 2.3.10 optionalDependencies: esbuild: 0.25.10 - rollup: 2.79.2 + rollup: 4.52.2 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) '@storybook/global@5.0.0': {} @@ -11172,31 +10803,31 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@storybook/instrumenter@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/instrumenter@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@storybook/react-dom-shim@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/react-dom-shim@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@storybook/react-vite@10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/react-vite@10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - '@rollup/pluginutils': 5.3.0(rollup@2.79.2) - '@storybook/builder-vite': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - '@storybook/react': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.2) + '@storybook/builder-vite': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + '@storybook/react': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) empathic: 2.0.0 magic-string: 0.30.19 react: 19.2.1 react-docgen: 8.0.2 react-dom: 19.2.1(react@19.2.1) resolve: 1.22.10 - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) tsconfig-paths: 4.2.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: @@ -11206,29 +10837,29 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)': + '@storybook/react@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) react: 19.2.1 react-docgen: 8.0.2 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@storybook/test@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': + '@storybook/test@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) + '@storybook/instrumenter': 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: @@ -11267,7 +10898,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.13.19': optional: true - '@swc/core@1.13.19(@swc/helpers@0.5.17)': + '@swc/core@1.13.19': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 @@ -11282,15 +10913,9 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.13.19 '@swc/core-win32-ia32-msvc': 1.13.19 '@swc/core-win32-x64-msvc': 1.13.19 - '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - optional: true - '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -11353,10 +10978,10 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 19.2.1 - '@tanstack/react-router-devtools@1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/react-router': 1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/router-devtools-core': 1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/router-devtools-core': 1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -11369,7 +10994,6 @@ snapshots: - lightningcss - sass - sass-embedded - - solid-js - stylus - sugarss - terser @@ -11411,7 +11035,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/router-core': 1.132.21 clsx: 2.1.1 @@ -11527,17 +11151,6 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/dom@10.4.1': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - picocolors: 1.1.1 - pretty-format: 27.5.1 - '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.4 @@ -11567,16 +11180,6 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': - dependencies: - '@babel/runtime': 7.28.4 - '@testing-library/dom': 10.4.1 - react: 19.2.1 - react-dom: 19.2.1(react@19.2.1) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -11628,14 +11231,14 @@ snapshots: '@turnkey/iframe-stamper@2.5.0': {} - '@turnkey/sdk-browser@4.3.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@turnkey/sdk-browser@4.3.0(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': dependencies: '@turnkey/api-key-stamper': 0.4.5 '@turnkey/crypto': 2.3.1 '@turnkey/encoding': 0.4.0 '@turnkey/http': 3.3.0(encoding@0.1.13) '@turnkey/iframe-stamper': 2.5.0 - '@turnkey/wallet-stamper': 1.0.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@turnkey/wallet-stamper': 1.0.3(typescript@5.9.2)(zod@3.25.76) '@turnkey/webauthn-stamper': 0.5.0 bs58check: 3.0.1 buffer: 6.0.3 @@ -11648,12 +11251,12 @@ snapshots: - utf-8-validate - zod - '@turnkey/wallet-stamper@1.0.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@turnkey/wallet-stamper@1.0.3(typescript@5.9.2)(zod@3.25.76)': dependencies: '@turnkey/crypto': 2.3.1 '@turnkey/encoding': 0.4.0 optionalDependencies: - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -11695,11 +11298,6 @@ snapshots: dependencies: '@types/node': 22.18.6 - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - optional: true - '@types/deep-eql@4.0.2': {} '@types/doctrine@0.0.9': {} @@ -11720,9 +11318,6 @@ snapshots: '@types/mdx@2.0.13': {} - '@types/ms@2.1.0': - optional: true - '@types/node@16.18.11': {} '@types/node@20.19.17': @@ -11908,10 +11503,10 @@ snapshots: '@vercel/error-utils@2.0.3': {} - '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@2.79.2)': + '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -11927,10 +11522,10 @@ snapshots: - rollup - supports-color - '@vercel/nft@0.30.1(encoding@0.1.13)(rollup@2.79.2)': + '@vercel/nft@0.30.1(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@rollup/pluginutils': 5.3.0(rollup@4.52.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -11946,7 +11541,7 @@ snapshots: - rollup - supports-color - '@vercel/node@5.3.26(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@2.79.2)': + '@vercel/node@5.3.26(@swc/core@1.13.19)(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@4.52.2)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -11954,7 +11549,7 @@ snapshots: '@types/node': 16.18.11 '@vercel/build-utils': 12.1.2 '@vercel/error-utils': 2.0.3 - '@vercel/nft': 0.30.1(encoding@0.1.13)(rollup@2.79.2) + '@vercel/nft': 0.30.1(encoding@0.1.13)(rollup@4.52.2) '@vercel/static-config': 3.1.2 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -11967,7 +11562,7 @@ snapshots: path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 - ts-node: 10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5) typescript: 4.9.5 undici: 5.28.4 transitivePeerDependencies: @@ -11989,10 +11584,10 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 - '@vitejs/plugin-react-swc@3.11.0(@swc/helpers@0.5.17)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@vitejs/plugin-react-swc@3.11.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: - '@swc/helpers' @@ -12061,7 +11656,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) + vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) '@vitest/utils@2.0.5': dependencies: @@ -12092,13 +11687,13 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.21.7(typescript@5.9.2)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 @@ -12106,7 +11701,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -12136,13 +11731,13 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/core@2.21.9(typescript@5.9.2)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 @@ -12150,7 +11745,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -12184,18 +11779,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.21.9(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/ethereum-provider@2.21.9(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.9(typescript@5.9.2)(zod@3.25.76) '@walletconnect/types': 2.21.9 - '@walletconnect/universal-provider': 2.21.9(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) - '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.9(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12262,12 +11857,12 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': + '@walletconnect/jsonrpc-ws-connection@1.0.16': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 7.5.10 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12318,16 +11913,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.21.7(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.21.7(typescript@5.9.2)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12354,16 +11949,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/sign-client@2.21.9(typescript@5.9.2)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/core': 2.21.9(typescript@5.9.2)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12452,7 +12047,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) @@ -12461,9 +12056,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.7(typescript@5.9.2)(zod@3.25.76) '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -12492,7 +12087,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.9(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.9(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) @@ -12501,9 +12096,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.9(typescript@5.9.2)(zod@3.25.76) '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -12532,7 +12127,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.21.7(typescript@5.9.2)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -12553,7 +12148,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.1 - viem: 2.31.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.31.0(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12579,7 +12174,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': + '@walletconnect/utils@2.21.9(typescript@5.9.2)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -12599,7 +12194,7 @@ snapshots: bs58: 6.0.0 detect-browser: 5.3.0 uint8arrays: 3.1.1 - viem: 2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.36.0(typescript@5.9.2)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12862,11 +12457,6 @@ snapshots: baseline-browser-mapping@2.8.7: {} - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - optional: true - big-integer@1.6.52: {} big.js@6.2.2: {} @@ -12931,11 +12521,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.9: - dependencies: - node-gyp-build: 4.8.4 - optional: true - bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -13175,37 +12760,16 @@ snapshots: crypto-random-string@2.0.0: {} - css-tree@3.1.0: - dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 - optional: true - css.escape@1.5.1: {} cssesc@3.0.0: {} - cssstyle@5.3.1(postcss@8.5.6): - dependencies: - '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) - css-tree: 3.1.0 - transitivePeerDependencies: - - postcss - optional: true - csstype@3.2.3: {} csv-parser@3.2.0: {} dargs@8.1.0: {} - data-urls@6.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - optional: true - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -13379,9 +12943,6 @@ snapshots: entities@4.5.0: {} - entities@6.0.1: - optional: true - env-paths@2.2.1: {} error-ex@1.3.4: @@ -13652,11 +13213,11 @@ snapshots: dependencies: eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-storybook@10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2): + eslint-plugin-storybook@10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2): dependencies: '@typescript-eslint/utils': 8.55.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint: 9.36.0(jiti@2.6.0) - storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) + storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) transitivePeerDependencies: - supports-color - typescript @@ -13746,7 +13307,7 @@ snapshots: dependencies: pnglib: 0.0.1 - ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + ethers@6.15.0: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -13754,7 +13315,7 @@ snapshots: '@types/node': 22.7.5 aes-js: 4.0.0-beta.5 tslib: 2.7.0 - ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13815,8 +13376,6 @@ snapshots: filter-obj@1.1.0: {} - find-my-way-ts@0.1.6: {} - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -13939,10 +13498,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-starknet-core@4.0.0: - dependencies: - '@starknet-io/types-js': 0.7.10 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -14062,19 +13617,6 @@ snapshots: '@hpke/dhkem-x25519': 1.6.4 '@hpke/dhkem-x448': 1.6.4 - html-encoding-sniffer@4.0.0: - dependencies: - whatwg-encoding: 3.1.1 - optional: true - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -14216,9 +13758,6 @@ snapshots: is-obj@2.0.0: {} - is-potential-custom-element-name@1.0.1: - optional: true - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -14276,17 +13815,17 @@ snapshots: isexe@2.0.0: {} - isows@1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.3(ws@8.13.0): dependencies: - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.13.0 - isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.2): dependencies: - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2 - isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + isows@1.0.7(ws@8.18.3): dependencies: - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 jackspeak@3.4.3: dependencies: @@ -14322,35 +13861,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10): - dependencies: - '@asamuzakjp/dom-selector': 6.6.1 - cssstyle: 5.3.1(postcss@8.5.6) - data-urls: 6.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 7.3.0 - rrweb-cssom: 0.8.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - postcss - - supports-color - - utf-8-validate - optional: true - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -14529,9 +14039,6 @@ snapshots: tiny-emitter: 2.1.0 typed-function: 4.2.1 - mdn-data@2.12.2: - optional: true - mdurl@2.0.0: {} memoize-one@5.2.1: {} @@ -14624,26 +14131,8 @@ snapshots: ms@2.1.3: {} - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.5: - optionalDependencies: - msgpackr-extract: 3.0.3 - multiformats@9.9.0: {} - multipasta@0.2.7: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -14681,11 +14170,6 @@ snapshots: detect-libc: 2.1.1 optional: true - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.1.1 - optional: true - node-gyp-build@4.8.4: {} node-mock-http@1.0.3: {} @@ -14885,11 +14369,6 @@ snapshots: parse-ms@2.1.0: {} - parse5@7.3.0: - dependencies: - entities: 6.0.1 - optional: true - path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -14977,13 +14456,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): dependencies: lilconfig: 3.1.3 yaml: 2.8.1 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2) + ts-node: 10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2) postcss-load-config@6.0.1(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: @@ -15342,9 +14821,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 - rrweb-cssom@0.8.0: - optional: true - run-applescript@7.1.0: {} run-parallel@1.2.0: @@ -15380,11 +14856,6 @@ snapshots: safer-buffer@2.1.2: {} - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true - scheduler@0.27.0: {} seedrandom@3.0.5: {} @@ -15541,7 +15012,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10): + storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -15554,7 +15025,7 @@ snapshots: recast: 0.23.11 semver: 7.7.4 use-sync-external-store: 1.5.0(react@19.2.1) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: prettier: 3.6.2 transitivePeerDependencies: @@ -15675,18 +15146,15 @@ snapshots: react: 19.2.1 use-sync-external-store: 1.5.0(react@19.2.1) - symbol-tree@3.2.4: - optional: true - tailwind-merge@2.6.0: {} tailwind-merge@3.3.1: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + tailwindcss: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) - tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): + tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -15705,7 +15173,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -15784,36 +15252,18 @@ snapshots: tinyspy@4.0.4: {} - tldts-core@7.0.16: - optional: true - - tldts@7.0.16: - dependencies: - tldts-core: 7.0.16 - optional: true - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 totalist@3.0.1: {} - tough-cookie@6.0.0: - dependencies: - tldts: 7.0.16 - optional: true - tr46@0.0.3: {} tr46@1.0.1: dependencies: punycode: 2.3.1 - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - optional: true - tree-kill@1.2.2: {} ts-api-utils@2.1.0(typescript@5.9.2): @@ -15835,7 +15285,7 @@ snapshots: '@ts-morph/common': 0.11.1 code-block-writer: 10.1.1 - ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5): + ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -15853,10 +15303,10 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 '@swc/wasm': 1.13.19 - ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2): + ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -15874,7 +15324,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 '@swc/wasm': 1.13.19 optional: true @@ -15892,7 +15342,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1): + tsup@8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15911,7 +15361,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: @@ -15920,7 +15370,7 @@ snapshots: - tsx - yaml - tsup@8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): + tsup@8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15939,7 +15389,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 postcss: 8.5.6 typescript: 5.9.2 transitivePeerDependencies: @@ -15948,7 +15398,7 @@ snapshots: - tsx - yaml - tsup@8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): + tsup@8.5.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15968,7 +15418,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 postcss: 8.5.6 typescript: 5.9.2 transitivePeerDependencies: @@ -16186,17 +15636,10 @@ snapshots: dependencies: react: 19.2.1 - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.4 - optional: true - util-deprecate@1.0.2: {} uuid@10.0.0: {} - uuid@11.1.0: {} - v8-compile-cache-lib@3.0.1: {} valtio@2.1.5(@types/react@19.2.7)(react@19.2.1): @@ -16215,16 +15658,16 @@ snapshots: - '@types/react' - '@types/react-dom' - viem@2.31.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.31.0(typescript@5.9.2)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isows: 1.0.7(ws@8.18.2) ox: 0.7.1(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.2 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -16232,16 +15675,16 @@ snapshots: - utf-8-validate - zod - viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.36.0(typescript@5.9.2)(zod@3.25.76): dependencies: '@noble/curves': 1.9.6 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isows: 1.0.7(ws@8.18.3) ox: 0.9.1(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -16249,16 +15692,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.37.8(typescript@5.8.3)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isows: 1.0.7(ws@8.18.3) ox: 0.9.6(typescript@5.8.3)(zod@3.25.76) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -16266,16 +15709,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.37.8(typescript@5.9.2)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.9.2)(zod@3.22.4) - isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isows: 1.0.7(ws@8.18.3) ox: 0.9.6(typescript@5.9.2)(zod@3.22.4) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -16283,16 +15726,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.37.8(typescript@5.9.2)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + isows: 1.0.7(ws@8.18.3) ox: 0.9.6(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + ws: 8.18.3 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -16300,7 +15743,7 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.9.20(typescript@5.8.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -16308,8 +15751,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isows: 1.0.3(ws@8.13.0) + ws: 8.13.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -16317,7 +15760,7 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.9.20(typescript@5.9.2)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -16325,8 +15768,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isows: 1.0.3(ws@8.13.0) + ws: 8.13.0 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -16361,7 +15804,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-pwa@1.0.3(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.0.3(@types/babel__core@7.20.5)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-window@7.3.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 @@ -16370,12 +15813,13 @@ snapshots: workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: + - '@types/babel__core' - supports-color - vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): + vite-plugin-top-level-await@1.6.0(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@2.79.2) - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@rollup/plugin-virtual': 3.0.2(rollup@4.52.2) + '@swc/core': 1.13.19 '@swc/wasm': 1.13.19 uuid: 10.0.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) @@ -16383,10 +15827,10 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-top-level-await@1.6.0(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.52.2) - '@swc/core': 1.13.19(@swc/helpers@0.5.17) + '@swc/core': 1.13.19 '@swc/wasm': 1.13.19 uuid: 10.0.0 vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -16394,12 +15838,12 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-vercel@9.0.7(encoding@0.1.13)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): + vite-plugin-vercel@9.0.7(encoding@0.1.13)(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): dependencies: '@brillout/libassert': 0.5.8 '@manypkg/find-root': 2.2.3 '@vercel/build-utils': 8.8.0 - '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@2.79.2) + '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.52.2) '@vercel/routing-utils': 3.1.0 esbuild: 0.24.2 fast-glob: 3.3.3 @@ -16445,7 +15889,7 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0): + vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -16472,10 +15916,8 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 3.2.0 - '@types/debug': 4.1.12 '@types/node': 20.19.17 '@vitest/ui': 3.2.4(vitest@3.2.4) - jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -16487,36 +15929,14 @@ snapshots: - supports-color - terser - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - optional: true - web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} - webidl-conversions@8.0.0: - optional: true - webpack-virtual-modules@0.6.2: {} - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - optional: true - - whatwg-mimetype@4.0.0: - optional: true - - whatwg-url@15.1.0: - dependencies: - tr46: 6.0.0 - webidl-conversions: 8.0.0 - optional: true - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -16715,41 +16135,20 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@7.5.10: {} - ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.13.0: {} - ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.17.1: {} - ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.18.2: {} - ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 5.0.10 + ws@8.18.3: {} wsl-utils@0.1.0: dependencies: is-wsl: 3.1.0 - xml-name-validator@5.0.0: - optional: true - - xmlchars@2.2.0: - optional: true - y18n@4.0.3: {} y18n@5.0.8: {} From 266521d5da488de13653efd4a3f5591f8a6af840 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 22 Feb 2026 00:07:45 +1100 Subject: [PATCH 02/14] fix pnpm lockfile ci config mismatch --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca66af9c..8d6553d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: false + autoInstallPeers: true excludeLinksFromLockfile: false catalogs: From 7958e552b19bf6daaac3727bc9fc1d53d7c77922 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Sun, 22 Feb 2026 07:22:18 +1100 Subject: [PATCH 03/14] fix ts ci lockfile dependency graph --- pnpm-lock.yaml | 1193 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 897 insertions(+), 296 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d6553d7..4b54413a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -91,7 +91,7 @@ importers: version: 3.6.2 tsup: specifier: ^8.3.5 - version: 8.5.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) + version: 8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) turbo: specifier: ^2.5.4 version: 2.5.8 @@ -103,10 +103,10 @@ importers: version: link:../packages/arcade-ts '@cartridge/connector': specifier: 'catalog:' - version: 0.13.5(@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2))(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + version: 0.13.5(@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@cartridge/controller': specifier: 'catalog:' - version: 0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + version: 0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@cartridge/penpal': specifier: ^6.2.3 version: 6.2.4 @@ -115,25 +115,25 @@ importers: version: https://codeload.github.com/cartridge-gg/presets/tar.gz/e6a5022 '@cartridge/ui': specifier: 'catalog:' - version: https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(typescript@5.9.2)(zod@3.25.76)) + version: https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)) '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(typescript@5.9.2) + version: 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@dojoengine/grpc': specifier: 'catalog:' version: 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) '@dojoengine/react': specifier: 'catalog:' - version: 1.8.11(849fa0decdfe17b50f0ce7229920519c) + version: 1.8.11(c998c8033210fb011698e80132fb45f4) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) + version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-wasm': specifier: 'catalog:' version: 1.8.2 '@effect-atom/atom-react': specifier: ^0.1.0 - version: 0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) + version: 0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) '@hookform/resolvers': specifier: ^3.10.0 version: 3.10.0(react-hook-form@7.63.0(react@19.2.1)) @@ -163,7 +163,7 @@ importers: version: 5.0.1 '@starknet-react/core': specifier: 'catalog:' - version: 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) + version: 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) '@tanstack/query-async-storage-persister': specifier: ^5.85.3 version: 5.90.2 @@ -190,7 +190,7 @@ importers: version: 3.13.12(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@vercel/node': specifier: ^5.3.24 - version: 5.3.26(@swc/core@1.13.19)(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@4.52.2) + version: 5.3.26(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@2.79.2) chart.js: specifier: ^4.4.8 version: 4.5.0 @@ -259,16 +259,16 @@ importers: version: 3.3.1 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) viem: specifier: ^2.22.9 - version: 2.37.8(typescript@5.9.2)(zod@3.25.76) + version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) vite-plugin-mkcert: specifier: ^1.17.6 version: 1.17.8(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.6.0(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 1.6.0(@swc/helpers@0.5.17)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vite-plugin-wasm: specifier: ^3.3.0 version: 3.5.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) @@ -287,28 +287,28 @@ importers: version: 9.36.0 '@storybook/addon-docs': specifier: ^10.2.8 - version: 10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/addon-links': specifier: ^10.2.8 - version: 10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + version: 10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) '@storybook/addon-themes': specifier: ^10.2.8 - version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + version: 10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) '@storybook/blocks': specifier: ^8.5.0 - version: 8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + version: 8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) '@storybook/react': specifier: ^10.2.8 - version: 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) + version: 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) '@storybook/react-vite': specifier: ^10.2.8 - version: 10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/test': specifier: ^8.5.0 - version: 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + version: 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) '@tanstack/react-router-devtools': specifier: ^1.131.8 - version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': specifier: ^1.131.8 version: 1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) @@ -329,7 +329,7 @@ importers: version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react-swc': specifier: ^3.5.0 - version: 3.11.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 3.11.0(@swc/helpers@0.5.17)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) autoprefixer: specifier: ^10.4.18 version: 10.4.21(postcss@8.5.6) @@ -344,7 +344,7 @@ importers: version: 0.4.21(eslint@9.36.0(jiti@2.6.0)) eslint-plugin-storybook: specifier: 10.2.8 - version: 10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) + version: 10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) globals: specifier: ^15.9.0 version: 15.15.0 @@ -353,10 +353,10 @@ importers: version: 8.5.6 storybook: specifier: ^10.2.8 - version: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) tailwindcss: specifier: ^3.4.3 - version: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + version: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) typescript: specifier: ^5.5.3 version: 5.9.2 @@ -368,13 +368,13 @@ importers: version: 5.4.20(@types/node@20.19.17)(terser@5.44.0) vite-plugin-pwa: specifier: ^1.0.0 - version: 1.0.3(@types/babel__core@7.20.5)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-window@7.3.0) + version: 1.0.3(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-plugin-vercel: specifier: ^9.0.7 - version: 9.0.7(encoding@0.1.13)(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + version: 9.0.7(encoding@0.1.13)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) vitest: specifier: ^3.2.4 - version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) + version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) contracts: dependencies: @@ -391,13 +391,13 @@ importers: dependencies: '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(typescript@5.8.3) + version: 1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) '@dojoengine/grpc': specifier: 'catalog:' - version: 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + version: 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1)) + version: 1.9.0(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) '@dojoengine/torii-client': specifier: 'catalog:' version: 1.8.2 @@ -419,7 +419,7 @@ importers: version: 5.90.2(react@19.2.1) '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) '@types/node': specifier: ^20.11.10 version: 20.19.17 @@ -440,7 +440,7 @@ importers: version: 19.2.1 tsup: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) + version: 8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1) typedoc: specifier: ^0.27.0 version: 0.27.9(typescript@5.8.3) @@ -452,13 +452,13 @@ importers: version: 5.8.3 vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.6.0(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.6.0(@swc/helpers@0.5.17)(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite-plugin-wasm: specifier: ^3.5.0 version: 3.5.0(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: ^3.2.4 - version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) + version: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) packages/collection: {} @@ -472,17 +472,17 @@ importers: dependencies: '@dojoengine/core': specifier: 'catalog:' - version: 1.8.8(typescript@5.9.2) + version: 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@dojoengine/sdk': specifier: 'catalog:' - version: 1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1)) + version: 1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) starknet: specifier: 'catalog:' version: 8.5.4 devDependencies: tsup: specifier: 'catalog:' - version: 8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) + version: 8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1) packages/orderbook: {} @@ -520,6 +520,15 @@ packages: peerDependencies: ajv: '>=8' + '@asamuzakjp/css-color@4.0.5': + resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} + + '@asamuzakjp/dom-selector@6.6.1': + resolution: {integrity: sha512-8QT9pokVe1fUt1C8IrJketaeFOdRfTOS96DL3EBjE8CRZm3eHnwMlQe2NPoOSEYPwJ5Q25uYoX1+m9044l3ysQ==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1236,6 +1245,40 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.14': + resolution: {integrity: sha512-zSlIxa20WvMojjpCSy8WrNpcZ61RqfTfX3XTaOeVlGJrt/8HF3YbzgFZa01yTbT4GWQLwfTcC3EB8i3XnB647Q==} + engines: {node: '>=18'} + peerDependencies: + postcss: ^8.4 + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@dojoengine/core@1.8.8': resolution: {integrity: sha512-q0eqP/DXKfpXzV68nCk84yFM2wNawLiuM1NLiq1+VvhqSFuLBk/iDaAOWSBf634RH5/9z0Lrd8S/ZQbrdVEd6w==} hasBin: true @@ -1322,6 +1365,19 @@ packages: '@effect/rpc': ^0.69.0 effect: ^3.17.7 + '@effect/experimental@0.57.5': + resolution: {integrity: sha512-Qk9+LiIGIsL250ky2SIqQrUPOy/ZtWF5kgWgAH2fjghibl8mooSTWtDsKx85Z4FRzftrJwVHtNxPcK+4iz7sGQ==} + peerDependencies: + '@effect/platform': ^0.93.4 + effect: ^3.19.6 + ioredis: ^5 + lmdb: ^3 + peerDependenciesMeta: + ioredis: + optional: true + lmdb: + optional: true + '@effect/opentelemetry@0.59.1': resolution: {integrity: sha512-mG+duN2KLJR6lDwuxEyoZqe5/4aSVnK50MoY87AC/u3hQGiSHxP7tZIORUghKd6JEEODJb4zP8eo7wmW7EGTuw==} peerDependencies: @@ -1351,6 +1407,17 @@ packages: '@opentelemetry/sdk-trace-web': optional: true + '@effect/platform@0.93.4': + resolution: {integrity: sha512-hb4WSBEbk7WVe+aTl04E8ZxK9ZZxb2drI04DYXkTlIaf2Sj4t9vNIHxi1XRAn5KOYQj4OUU9KSd53qbCwKUlzA==} + peerDependencies: + effect: ^3.19.6 + + '@effect/rpc@0.72.2': + resolution: {integrity: sha512-BmTXybXCOq96D2r9mvSW/YdiTQs5CStnd4II+lfVKrMr3pMNERKLZ2LG37Tfm4Sy3Q8ire6IVVKO/CN+VR0uQQ==} + peerDependencies: + '@effect/platform': ^0.93.3 + effect: ^3.19.5 + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -2013,6 +2080,36 @@ packages: resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + '@noble/ciphers@0.5.3': resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} @@ -2804,6 +2901,8 @@ packages: '@reown/appkit-utils@1.8.1': resolution: {integrity: sha512-WK+Fy17Qv4Vdx/L9gvCoBd3oikONIcrfkGmstk83+lQcM0krNHLPEA2gWytBOtetW+1bt+IwTaF2m4PKCrgIDw==} + peerDependencies: + valtio: 2.1.5 '@reown/appkit-wallet@1.8.1': resolution: {integrity: sha512-luqzVqQdY+WlxFTQsH0RK53dAYhNfIyyimSkkIcNCnMIWYfq2xseeaKeSwViF+af1ae7tYEqZdq/6ohbMizPaw==} @@ -3228,6 +3327,9 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -3319,6 +3421,7 @@ packages: peerDependencies: '@tanstack/router-core': ^1.132.21 csstype: ^3.0.10 + solid-js: '>=1.9.5' tiny-invariant: ^1.3.3 peerDependenciesMeta: csstype: @@ -3391,6 +3494,10 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + '@testing-library/jest-dom@6.5.0': resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -3493,6 +3600,9 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3520,6 +3630,9 @@ packages: '@types/mdx@2.0.13': resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@16.18.11': resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} @@ -4066,6 +4179,9 @@ packages: resolution: {integrity: sha512-bxxN2M3a4d1CRoQC//IqsR5XrLh0IJ8TCv2x6Y9N0nckNz/rTjZB3//GGscZziZOxmjP55rzxg/ze7usFI9FqQ==} hasBin: true + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -4116,6 +4232,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} @@ -4346,6 +4466,10 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} @@ -4354,6 +4478,10 @@ packages: engines: {node: '>=4'} hasBin: true + cssstyle@5.3.1: + resolution: {integrity: sha512-g5PC9Aiph9eiczFpcgUhd9S4UUO3F+LHGRIi5NUMZ+4xtoIYbHNZwZnWA2JsFGe8OU8nl4WyaEFiZuGuxlutJQ==} + engines: {node: '>=20'} + csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -4366,6 +4494,10 @@ packages: resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} engines: {node: '>=12'} + data-urls@6.0.0: + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -4569,6 +4701,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -4915,6 +5051,9 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + find-my-way-ts@0.1.6: + resolution: {integrity: sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -5031,6 +5170,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-starknet-core@4.0.0: + resolution: {integrity: sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==} + deprecated: Package no longer supported. Please use @starknet-io/get-starknet-core + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5138,6 +5281,14 @@ packages: resolution: {integrity: sha512-hssVL7cGvRNxE/YJ9RwxTsi48xKbX2O6SjPfGyeuFTBGDe/C/akLIjQYpE2Ea1GrSgH4htY0AW9z98w82C6OAA==} engines: {node: '>=16.0.0'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -5300,6 +5451,9 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5415,6 +5569,15 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + jsdom@27.0.0: + resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} + engines: {node: '>=20'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -5608,6 +5771,9 @@ packages: engines: {node: '>= 18'} hasBin: true + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -5716,9 +5882,19 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.5: + resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} + multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + multipasta@0.2.7: + resolution: {integrity: sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -5762,6 +5938,10 @@ packages: resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} hasBin: true + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -5907,6 +6087,9 @@ packages: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -6358,6 +6541,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-applescript@7.1.0: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} @@ -6390,6 +6576,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -6643,6 +6833,9 @@ packages: peerDependencies: react: ^19.0.0 + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} @@ -6739,6 +6932,13 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} + tldts-core@7.0.16: + resolution: {integrity: sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==} + + tldts@7.0.16: + resolution: {integrity: sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -6747,12 +6947,20 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -7123,6 +7331,10 @@ packages: peerDependencies: react: ^19.0.0 + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -7130,6 +7342,10 @@ packages: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -7200,6 +7416,7 @@ packages: peerDependencies: '@vite-pwa/assets-generator': ^1.0.0 vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + workbox-build: ^7.3.0 workbox-window: ^7.3.0 peerDependenciesMeta: '@vite-pwa/assets-generator': @@ -7326,6 +7543,10 @@ packages: jsdom: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} @@ -7335,9 +7556,26 @@ packages: webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + webidl-conversions@8.0.0: + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@15.1.0: + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -7505,6 +7743,13 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -7613,6 +7858,27 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + '@asamuzakjp/css-color@4.0.5': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 11.2.2 + optional: true + + '@asamuzakjp/dom-selector@6.6.1': + dependencies: + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.2 + optional: true + + '@asamuzakjp/nwsapi@2.3.9': + optional: true + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -8346,10 +8612,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@cartridge/connector@0.13.5(@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2))(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@cartridge/connector@0.13.5(@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10))(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@cartridge/controller': 0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) + '@cartridge/controller': 0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -8380,18 +8646,18 @@ snapshots: '@cartridge/controller-wasm@0.9.3': {} - '@cartridge/controller@0.13.5(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@cartridge/controller@0.13.5(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@cartridge/controller-wasm': 0.9.3 '@cartridge/penpal': 6.2.4 '@starknet-io/get-starknet-wallet-standard': 5.0.0-beta.0(typescript@5.9.2)(zod@3.25.76) '@starknet-io/types-js': 0.9.1 '@telegram-apps/sdk': 2.11.3 - '@turnkey/sdk-browser': 4.3.0(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) - '@walletconnect/ethereum-provider': 2.21.9(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@turnkey/sdk-browser': 4.3.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/ethereum-provider': 2.21.9(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 cbor-x: 1.6.0 - ethers: 6.15.0 + ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) micro-sol-signer: 0.5.0 mipd: 0.0.7(typescript@5.9.2) open: 10.2.0 @@ -8434,7 +8700,7 @@ snapshots: dependencies: '@starknet-io/types-js': 0.7.7 - '@cartridge/ui@https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(typescript@5.9.2)(zod@3.25.76))': + '@cartridge/ui@https://codeload.github.com/cartridge-gg/ui/tar.gz/431fb6f(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(sonner@2.0.7(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(starknet@8.5.4)(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@cartridge/presets': https://codeload.github.com/cartridge-gg/presets/tar.gz/90a5fe0 '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -8470,9 +8736,9 @@ snapshots: starknet: 8.5.4 swr: 2.3.6(react@19.2.1) tailwind-merge: 2.6.0 - tailwindcss-animate: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) + tailwindcss-animate: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))) vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -8611,9 +8877,39 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dojoengine/core@1.8.8(typescript@5.8.3)': + '@csstools/color-helpers@5.1.0': + optional: true + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-syntax-patches-for-csstree@1.0.14(postcss@8.5.6)': + dependencies: + postcss: 8.5.6 + optional: true + + '@csstools/css-tokenizer@3.0.4': + optional: true + + '@dojoengine/core@1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) starknet: 8.5.4 zod: 3.25.76 transitivePeerDependencies: @@ -8621,9 +8917,9 @@ snapshots: - typescript - utf-8-validate - '@dojoengine/core@1.8.8(typescript@5.9.2)': + '@dojoengine/core@1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) starknet: 8.5.4 zod: 3.25.76 transitivePeerDependencies: @@ -8631,6 +8927,30 @@ snapshots: - typescript - utf-8-validate + '@dojoengine/grpc@1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + dependencies: + '@effect/opentelemetry': 0.59.1(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@protobuf-ts/grpcweb-transport': 2.11.1 + '@protobuf-ts/plugin': 2.11.1 + '@protobuf-ts/runtime': 2.11.1 + '@protobuf-ts/runtime-rpc': 2.11.1 + effect: 3.19.7 + google-protobuf: 3.21.4 + grpc-web: 1.5.0 + starknet: 8.5.4 + transitivePeerDependencies: + - '@effect/platform' + - '@opentelemetry/resources' + - '@opentelemetry/sdk-logs' + - '@opentelemetry/sdk-metrics' + - '@opentelemetry/sdk-trace-base' + - '@opentelemetry/sdk-trace-node' + - '@opentelemetry/sdk-trace-web' + - '@opentelemetry/semantic-conventions' + - supports-color + '@dojoengine/grpc@1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': dependencies: '@effect/opentelemetry': 0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) @@ -8655,18 +8975,18 @@ snapshots: - '@opentelemetry/semantic-conventions' - supports-color - '@dojoengine/react@1.8.11(849fa0decdfe17b50f0ce7229920519c)': + '@dojoengine/react@1.8.11(c998c8033210fb011698e80132fb45f4)': dependencies: - '@dojoengine/core': 1.8.8(typescript@5.9.2) + '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) - '@dojoengine/sdk': 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/sdk': 1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76) - '@effect-atom/atom': 0.1.22(effect@3.19.7) - '@effect-atom/atom-react': 0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) + '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@effect-atom/atom': 0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7) + '@effect-atom/atom-react': 0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0) '@effect/opentelemetry': 0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7) '@latticexyz/utils': 2.2.23 '@opentelemetry/api': 1.9.0 @@ -8703,9 +9023,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(typescript@5.8.3)(zod@3.25.76)': + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@latticexyz/schema-type': 2.0.12(typescript@5.8.3)(zod@3.25.76) + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@latticexyz/utils': 2.0.12 mobx: 6.13.7 rxjs: 7.5.5 @@ -8715,9 +9035,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(typescript@5.9.2)(zod@3.25.76)': + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@latticexyz/schema-type': 2.0.12(typescript@5.9.2)(zod@3.25.76) + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@latticexyz/utils': 2.0.12 mobx: 6.13.7 rxjs: 7.5.5 @@ -8727,16 +9047,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76)': + '@dojoengine/sdk@1.9.0(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/core': 1.8.8(typescript@5.9.2) - '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76) + '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10) + '@dojoengine/grpc': 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) + '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -8764,16 +9084,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))': + '@dojoengine/sdk@1.9.0(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@dojoengine/core': 1.8.8(typescript@5.8.3) + '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1)) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.8.3) + '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3) + '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -8801,16 +9121,16 @@ snapshots: - utf-8-validate - zod - '@dojoengine/sdk@1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))': + '@dojoengine/sdk@1.9.0(@tanstack/react-query@5.90.2(react@19.2.1))(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/core': 1.8.8(typescript@5.9.2) - '@dojoengine/grpc': 1.8.7(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) - '@dojoengine/state': 1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1)) + '@dojoengine/core': 1.8.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@dojoengine/grpc': 1.8.7(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@dojoengine/state': 1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10) '@dojoengine/torii-client': 1.8.2 '@dojoengine/torii-wasm': 1.8.2 - '@dojoengine/utils': 1.8.4(starknet@8.5.4)(typescript@5.9.2) + '@dojoengine/utils': 1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) '@starknet-react/chains': 5.0.1 - '@starknet-react/core': 5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2) + '@starknet-react/core': 5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10) '@tanstack/react-query': 5.90.2(react@19.2.1) '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -8838,9 +9158,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -8854,9 +9174,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -8870,9 +9190,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/state@1.8.5(@types/react@19.2.7)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(zod@3.25.76)': + '@dojoengine/state@1.8.5(@types/react@19.2.7)(bufferutil@4.0.9)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.2.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@dojoengine/torii-client': 1.8.2 immer: 10.1.3 starknet: 8.5.4 @@ -8892,9 +9212,9 @@ snapshots: '@dojoengine/torii-wasm@1.8.2': {} - '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.8.3)': + '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.8.3)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -8905,9 +9225,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.9.2)': + '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -8918,9 +9238,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/utils@1.8.4(starknet@8.5.4)(typescript@5.9.2)(zod@3.25.76)': + '@dojoengine/utils@1.8.4(bufferutil@4.0.9)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@dojoengine/recs': 2.0.13(typescript@5.9.2)(zod@3.25.76) + '@dojoengine/recs': 2.0.13(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@latticexyz/utils': 2.2.23 mathjs: 12.4.3 micro-starknet: 0.2.3 @@ -8943,9 +9263,9 @@ snapshots: dependencies: '@edge-runtime/primitives': 4.1.0 - '@effect-atom/atom-react@0.1.17(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0)': + '@effect-atom/atom-react@0.1.17(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)(react@19.2.1)(scheduler@0.27.0)': dependencies: - '@effect-atom/atom': 0.1.22(effect@3.19.7) + '@effect-atom/atom': 0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7) effect: 3.19.7 react: 19.2.1 scheduler: 0.27.0 @@ -8954,10 +9274,30 @@ snapshots: - '@effect/platform' - '@effect/rpc' - '@effect-atom/atom@0.1.22(effect@3.19.7)': + '@effect-atom/atom@0.1.22(@effect/experimental@0.57.5(effect@3.19.7))(@effect/rpc@0.72.2(effect@3.19.7))(effect@3.19.7)': dependencies: + '@effect/experimental': 0.57.5(effect@3.19.7) + '@effect/rpc': 0.72.2(effect@3.19.7) effect: 3.19.7 + '@effect/experimental@0.57.5(effect@3.19.7)': + dependencies: + effect: 3.19.7 + uuid: 11.1.0 + + '@effect/opentelemetry@0.59.1(@effect/platform@0.93.4(effect@3.19.7))(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7)': + dependencies: + '@effect/platform': 0.93.4(effect@3.19.7) + '@opentelemetry/semantic-conventions': 1.38.0 + effect: 3.19.7 + optionalDependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 2.2.0(@opentelemetry/api@1.9.0) + '@effect/opentelemetry@0.59.1(@opentelemetry/api@1.9.0)(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-logs@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-node@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-web@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)(effect@3.19.7)': dependencies: '@opentelemetry/semantic-conventions': 1.38.0 @@ -8971,6 +9311,18 @@ snapshots: '@opentelemetry/sdk-trace-node': 2.2.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': 2.2.0(@opentelemetry/api@1.9.0) + '@effect/platform@0.93.4(effect@3.19.7)': + dependencies: + effect: 3.19.7 + find-my-way-ts: 0.1.6 + msgpackr: 1.11.5 + multipasta: 0.2.7 + + '@effect/rpc@0.72.2(effect@3.19.7)': + dependencies: + effect: 3.19.7 + msgpackr: 1.11.5 + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -9372,20 +9724,20 @@ snapshots: '@kurkle/color@0.3.4': {} - '@latticexyz/schema-type@2.0.12(typescript@5.8.3)(zod@3.25.76)': + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: abitype: 1.0.0(typescript@5.8.3)(zod@3.25.76) - viem: 2.9.20(typescript@5.8.3)(zod@3.25.76) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/schema-type@2.0.12(typescript@5.9.2)(zod@3.25.76)': + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: abitype: 1.0.0(typescript@5.9.2)(zod@3.25.76) - viem: 2.9.20(typescript@5.9.2)(zod@3.25.76) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -9452,6 +9804,24 @@ snapshots: '@msgpack/msgpack@3.1.2': {} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + '@noble/ciphers@0.5.3': {} '@noble/ciphers@1.3.0': {} @@ -10234,35 +10604,35 @@ snapshots: '@remix-run/router@1.23.0': {} - '@reown/appkit-common@1.8.1(typescript@5.9.2)(zod@3.22.4)': + '@reown/appkit-common@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(typescript@5.9.2)(zod@3.22.4) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-common@1.8.1(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-common@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@reown/appkit-controllers@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-controllers@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) - '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10291,12 +10661,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-pay@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) lit: 3.3.0 valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) transitivePeerDependencies: @@ -10331,13 +10701,13 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-scaffold-ui@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -10365,14 +10735,15 @@ snapshots: - typescript - uploadthing - utf-8-validate + - valtio - zod - '@reown/appkit-ui@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-ui@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@phosphor-icons/webcomponents': 2.1.5 - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) lit: 3.3.0 qrcode: 1.5.3 transitivePeerDependencies: @@ -10403,17 +10774,17 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit-utils@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.1 - '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) + '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@wallet-standard/wallet': 1.1.0 '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -10442,9 +10813,9 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-wallet@1.8.1(typescript@5.9.2)': + '@reown/appkit-wallet@1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.22.4) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) '@reown/appkit-polyfills': 1.8.1 '@walletconnect/logger': 2.1.2 zod: 3.22.4 @@ -10453,21 +10824,21 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@reown/appkit@1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit-common': 1.8.1(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-pay': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-common': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@reown/appkit-polyfills': 1.8.1 - '@reown/appkit-scaffold-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) - '@reown/appkit-wallet': 1.8.1(typescript@5.9.2) - '@walletconnect/universal-provider': 2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit-scaffold-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) + '@reown/appkit-ui': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(valtio@2.1.5(@types/react@19.2.7)(react@19.2.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.8.1(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 semver: 7.7.2 valtio: 2.1.5(@types/react@19.2.7)(react@19.2.1) - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: '@lit/react': 1.0.8(@types/react@19.2.7) transitivePeerDependencies: @@ -10535,6 +10906,10 @@ snapshots: optionalDependencies: rollup: 2.79.2 + '@rollup/plugin-virtual@3.0.2(rollup@2.79.2)': + optionalDependencies: + rollup: 2.79.2 + '@rollup/plugin-virtual@3.0.2(rollup@4.52.2)': optionalDependencies: rollup: 4.52.2 @@ -10554,14 +10929,6 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.3.0(rollup@4.52.2)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.52.2 - '@rollup/rollup-android-arm-eabi@4.52.2': optional: true @@ -10701,47 +11068,49 @@ snapshots: '@starknet-react/chains@5.0.1': {} - '@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)': + '@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 5.0.1 '@tanstack/react-query': 5.90.2(react@19.2.1) abi-wan-kanabi: 2.2.4 eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 react: 19.2.1 starknet: 8.5.4 - viem: 2.37.8(typescript@5.8.3)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@starknet-react/core@5.0.1(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)': + '@starknet-react/core@5.0.1(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.2.1)(starknet@8.5.4)(typescript@5.9.2)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 5.0.1 '@tanstack/react-query': 5.90.2(react@19.2.1) abi-wan-kanabi: 2.2.4 eventemitter3: 5.0.1 + get-starknet-core: 4.0.0 react: 19.2.1 starknet: 8.5.4 - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@storybook/addon-docs@10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/addon-docs@10.2.8(@types/react@19.2.7)(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.1) - '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) '@storybook/icons': 2.0.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -10750,31 +11119,31 @@ snapshots: - vite - webpack - '@storybook/addon-links@10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/addon-links@10.2.8(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: '@storybook/global': 5.0.0 - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) optionalDependencies: react: 19.2.1 - '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/addon-themes@10.2.8(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) ts-dedent: 2.2.0 - '@storybook/blocks@8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/blocks@8.6.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: '@storybook/icons': 1.6.0(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) ts-dedent: 2.2.0 optionalDependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@storybook/builder-vite@10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/builder-vite@10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: - '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + '@storybook/csf-plugin': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) ts-dedent: 2.2.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: @@ -10782,13 +11151,13 @@ snapshots: - rollup - webpack - '@storybook/csf-plugin@10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/csf-plugin@10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) unplugin: 2.3.10 optionalDependencies: esbuild: 0.25.10 - rollup: 4.52.2 + rollup: 2.79.2 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) '@storybook/global@5.0.0': {} @@ -10803,31 +11172,31 @@ snapshots: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - '@storybook/instrumenter@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/instrumenter@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) - '@storybook/react-dom-shim@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/react-dom-shim@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) - '@storybook/react-vite@10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@storybook/react-vite@10.2.8(esbuild@0.25.10)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.4(typescript@5.9.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - '@rollup/pluginutils': 5.3.0(rollup@4.52.2) - '@storybook/builder-vite': 10.2.8(esbuild@0.25.10)(rollup@4.52.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) - '@storybook/react': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2) + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@storybook/builder-vite': 10.2.8(esbuild@0.25.10)(rollup@2.79.2)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)) + '@storybook/react': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2) empathic: 2.0.0 magic-string: 0.30.19 react: 19.2.1 react-docgen: 8.0.2 react-dom: 19.2.1(react@19.2.1) resolve: 1.22.10 - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) tsconfig-paths: 4.2.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: @@ -10837,29 +11206,29 @@ snapshots: - typescript - webpack - '@storybook/react@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2)': + '@storybook/react@10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@storybook/react-dom-shim': 10.2.8(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) react: 19.2.1 react-docgen: 8.0.2 react-dom: 19.2.1(react@19.2.1) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@storybook/test@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))': + '@storybook/test@8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)) + '@storybook/instrumenter': 8.6.15(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: @@ -10898,7 +11267,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.13.19': optional: true - '@swc/core@1.13.19': + '@swc/core@1.13.19(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 @@ -10913,9 +11282,15 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.13.19 '@swc/core-win32-ia32-msvc': 1.13.19 '@swc/core-win32-x64-msvc': 1.13.19 + '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + optional: true + '@swc/types@0.1.25': dependencies: '@swc/counter': 0.1.3 @@ -10978,10 +11353,10 @@ snapshots: '@tanstack/query-core': 5.90.2 react: 19.2.1 - '@tanstack/react-router-devtools@1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.132.23(@tanstack/react-router@1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/react-router': 1.132.23(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - '@tanstack/router-devtools-core': 1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/router-devtools-core': 1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.1 react-dom: 19.2.1(react@19.2.1) vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -10994,6 +11369,7 @@ snapshots: - lightningcss - sass - sass-embedded + - solid-js - stylus - sugarss - terser @@ -11035,7 +11411,7 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-devtools-core@1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.132.21(@tanstack/router-core@1.132.21)(@types/node@20.19.17)(csstype@3.2.3)(jiti@2.6.0)(solid-js@1.9.9)(terser@5.44.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/router-core': 1.132.21 clsx: 2.1.1 @@ -11151,6 +11527,17 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.4 @@ -11180,6 +11567,16 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': + dependencies: + '@babel/runtime': 7.28.4 + '@testing-library/dom': 10.4.1 + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + optionalDependencies: + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -11231,14 +11628,14 @@ snapshots: '@turnkey/iframe-stamper@2.5.0': {} - '@turnkey/sdk-browser@4.3.0(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': + '@turnkey/sdk-browser@4.3.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@turnkey/api-key-stamper': 0.4.5 '@turnkey/crypto': 2.3.1 '@turnkey/encoding': 0.4.0 '@turnkey/http': 3.3.0(encoding@0.1.13) '@turnkey/iframe-stamper': 2.5.0 - '@turnkey/wallet-stamper': 1.0.3(typescript@5.9.2)(zod@3.25.76) + '@turnkey/wallet-stamper': 1.0.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@turnkey/webauthn-stamper': 0.5.0 bs58check: 3.0.1 buffer: 6.0.3 @@ -11251,12 +11648,12 @@ snapshots: - utf-8-validate - zod - '@turnkey/wallet-stamper@1.0.3(typescript@5.9.2)(zod@3.25.76)': + '@turnkey/wallet-stamper@1.0.3(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@turnkey/crypto': 2.3.1 '@turnkey/encoding': 0.4.0 optionalDependencies: - viem: 2.37.8(typescript@5.9.2)(zod@3.25.76) + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -11298,6 +11695,11 @@ snapshots: dependencies: '@types/node': 22.18.6 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + optional: true + '@types/deep-eql@4.0.2': {} '@types/doctrine@0.0.9': {} @@ -11318,6 +11720,9 @@ snapshots: '@types/mdx@2.0.13': {} + '@types/ms@2.1.0': + optional: true + '@types/node@16.18.11': {} '@types/node@20.19.17': @@ -11503,10 +11908,10 @@ snapshots: '@vercel/error-utils@2.0.3': {} - '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@4.52.2)': + '@vercel/nft@0.27.10(encoding@0.1.13)(rollup@2.79.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.3.0(rollup@4.52.2) + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -11522,10 +11927,10 @@ snapshots: - rollup - supports-color - '@vercel/nft@0.30.1(encoding@0.1.13)(rollup@4.52.2)': + '@vercel/nft@0.30.1(encoding@0.1.13)(rollup@2.79.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13) - '@rollup/pluginutils': 5.3.0(rollup@4.52.2) + '@rollup/pluginutils': 5.3.0(rollup@2.79.2) acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) async-sema: 3.1.1 @@ -11541,7 +11946,7 @@ snapshots: - rollup - supports-color - '@vercel/node@5.3.26(@swc/core@1.13.19)(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@4.52.2)': + '@vercel/node@5.3.26(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(encoding@0.1.13)(rollup@2.79.2)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -11549,7 +11954,7 @@ snapshots: '@types/node': 16.18.11 '@vercel/build-utils': 12.1.2 '@vercel/error-utils': 2.0.3 - '@vercel/nft': 0.30.1(encoding@0.1.13)(rollup@4.52.2) + '@vercel/nft': 0.30.1(encoding@0.1.13)(rollup@2.79.2) '@vercel/static-config': 3.1.2 async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -11562,7 +11967,7 @@ snapshots: path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 ts-morph: 12.0.0 - ts-node: 10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5) + ts-node: 10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5) typescript: 4.9.5 undici: 5.28.4 transitivePeerDependencies: @@ -11584,10 +11989,10 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 - '@vitejs/plugin-react-swc@3.11.0(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': + '@vitejs/plugin-react-swc@3.11.0(@swc/helpers@0.5.17)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.27 - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) transitivePeerDependencies: - '@swc/helpers' @@ -11656,7 +12061,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0) + vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0) '@vitest/utils@2.0.5': dependencies: @@ -11687,13 +12092,13 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@walletconnect/core@2.21.7(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/core@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 @@ -11701,7 +12106,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -11731,13 +12136,13 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.9(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/core@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 @@ -11745,7 +12150,7 @@ snapshots: '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.39.3 events: 3.3.0 @@ -11779,18 +12184,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.21.9(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/ethereum-provider@2.21.9(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@reown/appkit': 1.8.1(@types/react@19.2.7)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(zod@3.25.76) + '@reown/appkit': 1.8.1(@types/react@19.2.7)(bufferutil@4.0.9)(encoding@0.1.13)(react@19.2.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/sign-client': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/types': 2.21.9 - '@walletconnect/universal-provider': 2.21.9(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76) - '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/universal-provider': 2.21.9(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -11857,12 +12262,12 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.16': + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11913,16 +12318,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.21.7(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/sign-client@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.7(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/core': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -11949,16 +12354,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.9(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/sign-client@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@walletconnect/core': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/core': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -12047,7 +12452,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.21.7(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.7(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) @@ -12056,9 +12461,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.7(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/types': 2.21.7 - '@walletconnect/utils': 2.21.7(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -12087,7 +12492,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.9(encoding@0.1.13)(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/universal-provider@2.21.9(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) @@ -12096,9 +12501,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/sign-client': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) '@walletconnect/types': 2.21.9 - '@walletconnect/utils': 2.21.9(typescript@5.9.2)(zod@3.25.76) + '@walletconnect/utils': 2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) es-toolkit: 1.39.3 events: 3.3.0 transitivePeerDependencies: @@ -12127,7 +12532,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.7(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/utils@2.21.7(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -12148,7 +12553,7 @@ snapshots: detect-browser: 5.3.0 query-string: 7.1.3 uint8arrays: 3.1.1 - viem: 2.31.0(typescript@5.9.2)(zod@3.25.76) + viem: 2.31.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12174,7 +12579,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.9(typescript@5.9.2)(zod@3.25.76)': + '@walletconnect/utils@2.21.9(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@msgpack/msgpack': 3.1.2 '@noble/ciphers': 1.3.0 @@ -12194,7 +12599,7 @@ snapshots: bs58: 6.0.0 detect-browser: 5.3.0 uint8arrays: 3.1.1 - viem: 2.36.0(typescript@5.9.2)(zod@3.25.76) + viem: 2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12457,6 +12862,11 @@ snapshots: baseline-browser-mapping@2.8.7: {} + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + optional: true + big-integer@1.6.52: {} big.js@6.2.2: {} @@ -12521,6 +12931,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + optional: true + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 @@ -12760,16 +13175,37 @@ snapshots: crypto-random-string@2.0.0: {} + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + optional: true + css.escape@1.5.1: {} cssesc@3.0.0: {} + cssstyle@5.3.1(postcss@8.5.6): + dependencies: + '@asamuzakjp/css-color': 4.0.5 + '@csstools/css-syntax-patches-for-csstree': 1.0.14(postcss@8.5.6) + css-tree: 3.1.0 + transitivePeerDependencies: + - postcss + optional: true + csstype@3.2.3: {} csv-parser@3.2.0: {} dargs@8.1.0: {} + data-urls@6.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + optional: true + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -12943,6 +13379,9 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: + optional: true + env-paths@2.2.1: {} error-ex@1.3.4: @@ -13213,11 +13652,11 @@ snapshots: dependencies: eslint: 9.36.0(jiti@2.6.0) - eslint-plugin-storybook@10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(typescript@5.9.2): + eslint-plugin-storybook@10.2.8(eslint@9.36.0(jiti@2.6.0))(storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10))(typescript@5.9.2): dependencies: '@typescript-eslint/utils': 8.55.0(eslint@9.36.0(jiti@2.6.0))(typescript@5.9.2) eslint: 9.36.0(jiti@2.6.0) - storybook: 10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + storybook: 10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10) transitivePeerDependencies: - supports-color - typescript @@ -13307,7 +13746,7 @@ snapshots: dependencies: pnglib: 0.0.1 - ethers@6.15.0: + ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -13315,7 +13754,7 @@ snapshots: '@types/node': 22.7.5 aes-js: 4.0.0-beta.5 tslib: 2.7.0 - ws: 8.17.1 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13376,6 +13815,8 @@ snapshots: filter-obj@1.1.0: {} + find-my-way-ts@0.1.6: {} + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -13498,6 +13939,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-starknet-core@4.0.0: + dependencies: + '@starknet-io/types-js': 0.7.10 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -13617,6 +14062,19 @@ snapshots: '@hpke/dhkem-x25519': 1.6.4 '@hpke/dhkem-x448': 1.6.4 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + optional: true + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -13758,6 +14216,9 @@ snapshots: is-obj@2.0.0: {} + is-potential-custom-element-name@1.0.1: + optional: true + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -13815,17 +14276,17 @@ snapshots: isexe@2.0.0: {} - isows@1.0.3(ws@8.13.0): + isows@1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.13.0 + ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.2): + isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.7(ws@8.18.3): + isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) jackspeak@3.4.3: dependencies: @@ -13861,6 +14322,35 @@ snapshots: dependencies: argparse: 2.0.1 + jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10): + dependencies: + '@asamuzakjp/dom-selector': 6.6.1 + cssstyle: 5.3.1(postcss@8.5.6) + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + parse5: 7.3.0 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 15.1.0 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - postcss + - supports-color + - utf-8-validate + optional: true + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -14039,6 +14529,9 @@ snapshots: tiny-emitter: 2.1.0 typed-function: 4.2.1 + mdn-data@2.12.2: + optional: true + mdurl@2.0.0: {} memoize-one@5.2.1: {} @@ -14131,8 +14624,26 @@ snapshots: ms@2.1.3: {} + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.5: + optionalDependencies: + msgpackr-extract: 3.0.3 + multiformats@9.9.0: {} + multipasta@0.2.7: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -14170,6 +14681,11 @@ snapshots: detect-libc: 2.1.1 optional: true + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.1 + optional: true + node-gyp-build@4.8.4: {} node-mock-http@1.0.3: {} @@ -14369,6 +14885,11 @@ snapshots: parse-ms@2.1.0: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + optional: true + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -14456,13 +14977,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): + postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): dependencies: lilconfig: 3.1.3 yaml: 2.8.1 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2) + ts-node: 10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2) postcss-load-config@6.0.1(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1): dependencies: @@ -14821,6 +15342,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.52.2 fsevents: 2.3.3 + rrweb-cssom@0.8.0: + optional: true + run-applescript@7.1.0: {} run-parallel@1.2.0: @@ -14856,6 +15380,11 @@ snapshots: safer-buffer@2.1.2: {} + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + optional: true + scheduler@0.27.0: {} seedrandom@3.0.5: {} @@ -15012,7 +15541,7 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@10.2.8(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1): + storybook@10.2.8(@testing-library/dom@10.4.0)(bufferutil@4.0.9)(prettier@3.6.2)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(utf-8-validate@5.0.10): dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 2.0.1(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -15025,7 +15554,7 @@ snapshots: recast: 0.23.11 semver: 7.7.4 use-sync-external-store: 1.5.0(react@19.2.1) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: prettier: 3.6.2 transitivePeerDependencies: @@ -15146,15 +15675,18 @@ snapshots: react: 19.2.1 use-sync-external-store: 1.5.0(react@19.2.1) + symbol-tree@3.2.4: + optional: true + tailwind-merge@2.6.0: {} tailwind-merge@3.3.1: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + tailwindcss: 3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) - tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): + tailwindcss@3.4.17(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -15173,7 +15705,7 @@ snapshots: postcss: 8.5.6 postcss-import: 15.1.0(postcss@8.5.6) postcss-js: 4.1.0(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) + postcss-load-config: 4.0.2(postcss@8.5.6)(ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2)) postcss-nested: 6.2.0(postcss@8.5.6) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -15252,18 +15784,36 @@ snapshots: tinyspy@4.0.4: {} + tldts-core@7.0.16: + optional: true + + tldts@7.0.16: + dependencies: + tldts-core: 7.0.16 + optional: true + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 totalist@3.0.1: {} + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.16 + optional: true + tr46@0.0.3: {} tr46@1.0.1: dependencies: punycode: 2.3.1 + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + optional: true + tree-kill@1.2.2: {} ts-api-utils@2.1.0(typescript@5.9.2): @@ -15285,7 +15835,7 @@ snapshots: '@ts-morph/common': 0.11.1 code-block-writer: 10.1.1 - ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5): + ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@16.18.11)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -15303,10 +15853,10 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) '@swc/wasm': 1.13.19 - ts-node@10.9.1(@swc/core@1.13.19)(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2): + ts-node@10.9.1(@swc/core@1.13.19(@swc/helpers@0.5.17))(@swc/wasm@1.13.19)(@types/node@20.19.17)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -15324,7 +15874,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) '@swc/wasm': 1.13.19 optional: true @@ -15342,7 +15892,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1): + tsup@8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.8.3)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15361,7 +15911,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: @@ -15370,7 +15920,7 @@ snapshots: - tsx - yaml - tsup@8.4.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): + tsup@8.4.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15389,7 +15939,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) postcss: 8.5.6 typescript: 5.9.2 transitivePeerDependencies: @@ -15398,7 +15948,7 @@ snapshots: - tsx - yaml - tsup@8.5.0(@swc/core@1.13.19)(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): + tsup@8.5.0(@swc/core@1.13.19(@swc/helpers@0.5.17))(jiti@2.6.0)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.2)(yaml@2.8.1): dependencies: bundle-require: 5.1.0(esbuild@0.25.10) cac: 6.7.14 @@ -15418,7 +15968,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) postcss: 8.5.6 typescript: 5.9.2 transitivePeerDependencies: @@ -15636,10 +16186,17 @@ snapshots: dependencies: react: 19.2.1 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + optional: true + util-deprecate@1.0.2: {} uuid@10.0.0: {} + uuid@11.1.0: {} + v8-compile-cache-lib@3.0.1: {} valtio@2.1.5(@types/react@19.2.7)(react@19.2.1): @@ -15658,16 +16215,16 @@ snapshots: - '@types/react' - '@types/react-dom' - viem@2.31.0(typescript@5.9.2)(zod@3.25.76): + viem@2.31.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.2) + isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.7.1(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.2 + ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15675,16 +16232,16 @@ snapshots: - utf-8-validate - zod - viem@2.36.0(typescript@5.9.2)(zod@3.25.76): + viem@2.36.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.6 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.0.8(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.9.1(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15692,16 +16249,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(typescript@5.8.3)(zod@3.25.76): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.9.6(typescript@5.8.3)(zod@3.25.76) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -15709,16 +16266,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(typescript@5.9.2)(zod@3.22.4): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.9.2)(zod@3.22.4) - isows: 1.0.7(ws@8.18.3) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.9.6(typescript@5.9.2)(zod@3.22.4) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15726,16 +16283,16 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(typescript@5.9.2)(zod@3.25.76): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 abitype: 1.1.0(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.7(ws@8.18.3) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.9.6(typescript@5.9.2)(zod@3.25.76) - ws: 8.18.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15743,7 +16300,7 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(typescript@5.8.3)(zod@3.25.76): + viem@2.9.20(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -15751,8 +16308,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.8.3)(zod@3.25.76) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -15760,7 +16317,7 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(typescript@5.9.2)(zod@3.25.76): + viem@2.9.20(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -15768,8 +16325,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.9.2)(zod@3.25.76) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + isows: 1.0.3(ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ws: 8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15804,7 +16361,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-pwa@1.0.3(@types/babel__core@7.20.5)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-window@7.3.0): + vite-plugin-pwa@1.0.3(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 @@ -15813,13 +16370,12 @@ snapshots: workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 transitivePeerDependencies: - - '@types/babel__core' - supports-color - vite-plugin-top-level-await@1.6.0(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): + vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): dependencies: - '@rollup/plugin-virtual': 3.0.2(rollup@4.52.2) - '@swc/core': 1.13.19 + '@rollup/plugin-virtual': 3.0.2(rollup@2.79.2) + '@swc/core': 1.13.19(@swc/helpers@0.5.17) '@swc/wasm': 1.13.19 uuid: 10.0.0 vite: 5.4.20(@types/node@20.19.17)(terser@5.44.0) @@ -15827,10 +16383,10 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-top-level-await@1.6.0(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@4.52.2)(vite@7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.52.2) - '@swc/core': 1.13.19 + '@swc/core': 1.13.19(@swc/helpers@0.5.17) '@swc/wasm': 1.13.19 uuid: 10.0.0 vite: 7.1.7(@types/node@20.19.17)(jiti@2.6.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -15838,12 +16394,12 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-vercel@9.0.7(encoding@0.1.13)(rollup@4.52.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): + vite-plugin-vercel@9.0.7(encoding@0.1.13)(rollup@2.79.2)(vite@5.4.20(@types/node@20.19.17)(terser@5.44.0)): dependencies: '@brillout/libassert': 0.5.8 '@manypkg/find-root': 2.2.3 '@vercel/build-utils': 8.8.0 - '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@4.52.2) + '@vercel/nft': 0.27.10(encoding@0.1.13)(rollup@2.79.2) '@vercel/routing-utils': 3.1.0 esbuild: 0.24.2 fast-glob: 3.3.3 @@ -15889,7 +16445,7 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/node@20.19.17)(@vitest/ui@3.2.4)(terser@5.44.0): + vitest@3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10))(terser@5.44.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 @@ -15916,8 +16472,10 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 3.2.0 + '@types/debug': 4.1.12 '@types/node': 20.19.17 '@vitest/ui': 3.2.4(vitest@3.2.4) + jsdom: 27.0.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -15929,14 +16487,36 @@ snapshots: - supports-color - terser + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + optional: true + web-vitals@4.2.4: {} webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} + webidl-conversions@8.0.0: + optional: true + webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + optional: true + + whatwg-mimetype@4.0.0: + optional: true + + whatwg-url@15.1.0: + dependencies: + tr46: 6.0.0 + webidl-conversions: 8.0.0 + optional: true + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -16135,20 +16715,41 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10: {} + ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.13.0: {} + ws@8.13.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.17.1: {} + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.2: {} + ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.3: {} + ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 wsl-utils@0.1.0: dependencies: is-wsl: 3.1.0 + xml-name-validator@5.0.0: + optional: true + + xmlchars@2.2.0: + optional: true + y18n@4.0.3: {} y18n@5.0.8: {} From 2d6249911db5e20babcf0784d9395a3cb16ef9a8 Mon Sep 17 00:00:00 2001 From: Brother MartianGreed Date: Sun, 22 Feb 2026 09:30:03 +0100 Subject: [PATCH 04/14] perf(arcade-ts): optimize edge marketplace SQL queries (#288) --- .../arcade-ts/src/marketplace/client.edge.ts | 77 +++++------ packages/arcade-ts/src/marketplace/filters.ts | 127 +++++++++--------- 2 files changed, 99 insertions(+), 105 deletions(-) diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 4e7e21f4..9ac039c5 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -173,7 +173,9 @@ async function verifyListingsOwnership( ): Promise { if (!listings.length) return listings; - const collection = addAddressPadding(getChecksumAddress(collectionAddress)); + const collection = addAddressPadding( + getChecksumAddress(collectionAddress), + ).toLowerCase(); const owners = [ ...new Set(listings.map((order) => getChecksumAddress(order.owner))), ]; @@ -187,18 +189,17 @@ async function verifyListingsOwnership( const ownerList = toSqlList(owners.map((owner) => owner.toLowerCase())); const tokenIdList = toSqlList(tokenIds); - const sql = `SELECT account_address, token_id, balance + const sql = `SELECT account_address, token_id FROM token_balances -WHERE lower(contract_address) = lower('${escapeSqlValue(collection)}') - AND lower(account_address) IN (${ownerList}) - AND token_id IN (${tokenIdList})`; +WHERE contract_address = '${escapeSqlValue(collection)}' + AND account_address IN (${ownerList}) + AND token_id IN (${tokenIdList}) + AND balance != '0x0000000000000000000000000000000000000000000000000000000000000000'`; const rows = await querySql(projectId, sql); const ownership = new Set(); for (const row of rows) { - const balance = asBigInt(row.balance ?? 0); - if (balance <= 0n) continue; const owner = getChecksumAddress(String(row.account_address)); const tokenId = BigInt(String(row.token_id)).toString(); ownership.add(`${owner}_${tokenId}`); @@ -226,34 +227,32 @@ export async function createEdgeMarketplaceClient( ): Promise => { const { projectId: projectIdInput, address, fetchImages = true } = options; const projectId = ensureProjectId(projectIdInput, defaultProject); - const collection = addAddressPadding(getChecksumAddress(address)); + const collection = addAddressPadding(getChecksumAddress(address)).toLowerCase(); const rows = await querySql( projectId, - `SELECT contract_address, contract_type, type, metadata, total_supply, token_id -FROM token_contracts -WHERE lower(contract_address) = lower('${escapeSqlValue(collection)}') + `SELECT + tc.contract_address, + tc.contract_type, + tc.type, + COALESCE( + tc.metadata, + (SELECT t.metadata FROM tokens t WHERE t.contract_address = tc.contract_address LIMIT 1) + ) AS metadata, + tc.total_supply, + COALESCE( + tc.token_id, + (SELECT t.token_id FROM tokens t WHERE t.contract_address = tc.contract_address LIMIT 1) + ) AS token_id +FROM token_contracts tc +WHERE tc.contract_address = '${escapeSqlValue(collection)}' LIMIT 1`, ); const contract = rows[0]; if (!contract) return null; - let tokenSample: any | undefined; - let metadataRaw = contract.metadata; - if (!metadataRaw) { - const tokenRows = await querySql( - projectId, - `SELECT token_id, metadata -FROM tokens -WHERE lower(contract_address) = lower('${escapeSqlValue(collection)}') -LIMIT 1`, - ); - tokenSample = tokenRows[0]; - if (tokenSample?.metadata) metadataRaw = tokenSample.metadata; - } - - const metadata = parseJsonSafe(metadataRaw, metadataRaw); + const metadata = parseJsonSafe(contract.metadata, contract.metadata); let image: string | undefined; if (fetchImages) { @@ -277,10 +276,7 @@ LIMIT 1`, String(contract.contract_type ?? contract.type ?? "ERC721") || "ERC721", metadata, totalSupply: asBigInt(contract.total_supply ?? "0x0"), - tokenIdSample: - (contract.token_id as string | null | undefined) ?? - (tokenSample?.token_id as string | null | undefined) ?? - null, + tokenIdSample: (contract.token_id as string | null | undefined) ?? null, image, raw: contract as any, }; @@ -299,13 +295,13 @@ LIMIT 1`, fetchImages = false, } = options; const projectId = ensureProjectId(project, defaultProject); - const collection = addAddressPadding(getChecksumAddress(address)); + const collection = addAddressPadding(getChecksumAddress(address)).toLowerCase(); const offset = cursor ? Number.parseInt(cursor, 10) || 0 : 0; const effectiveLimit = toPositiveInt(limit, DEFAULT_LIMIT); const normalizedTokenIds = normalizeTokenIds(tokenIds); const conditions = [ - `lower(contract_address) = lower('${escapeSqlValue(collection)}')`, + `contract_address = '${escapeSqlValue(collection)}'`, ]; if (normalizedTokenIds.length > 0) { @@ -357,10 +353,9 @@ OFFSET ${Math.max(0, offset)}`; const getCollectionOrders = async ( options: CollectionOrdersOptions, + projectIdOverride?: string, ): Promise => { - const collection = addAddressPadding( - getChecksumAddress(options.collection), - ); + const collection = addAddressPadding(getChecksumAddress(options.collection)).toLowerCase(); const tokenId = normalizeTokenIdForQuery(options.tokenId); const status = options.status != null ? statusValueMap[options.status] : undefined; @@ -381,9 +376,7 @@ OFFSET ${Math.max(0, offset)}`; return []; } - const conditions = [ - `lower(collection) = lower('${escapeSqlValue(collection)}')`, - ]; + const conditions = [`collection = '${escapeSqlValue(collection)}'`]; if (tokenId !== undefined) { conditions.push(`token_id = '${escapeSqlValue(tokenId)}'`); } @@ -408,20 +401,21 @@ FROM "ARCADE-Order" WHERE ${conditions.join(" AND ")} ORDER BY id DESC${effectiveLimit ? ` LIMIT ${effectiveLimit}` : ""}`; - const rows = await querySql(defaultProject, sql); + const rows = await querySql(projectIdOverride ?? defaultProject, sql); return rows.map(toOrderModel).filter((order) => order.exists()); }; const listCollectionListings = async ( options: CollectionListingsOptions, ): Promise => { + const projectId = ensureProjectId(options.projectId, defaultProject); const baseOrders = await getCollectionOrders({ collection: options.collection, tokenId: options.tokenId, limit: options.limit, category: CategoryType.Sell, status: StatusType.Placed, - }); + }, projectId); const filtered = baseOrders.filter( (order) => @@ -433,7 +427,6 @@ ORDER BY id DESC${effectiveLimit ? ` LIMIT ${effectiveLimit}` : ""}`; return filtered; } - const projectId = ensureProjectId(options.projectId, defaultProject); return verifyListingsOwnership(projectId, options.collection, filtered); }; @@ -467,7 +460,7 @@ ORDER BY id DESC${effectiveLimit ? ` LIMIT ${effectiveLimit}` : ""}`; collection, tokenId, limit: orderLimit, - }); + }, projectId); const now = Date.now() / 1000; let listings = orders.filter( diff --git a/packages/arcade-ts/src/marketplace/filters.ts b/packages/arcade-ts/src/marketplace/filters.ts index 9e4513c8..46e2cb7d 100644 --- a/packages/arcade-ts/src/marketplace/filters.ts +++ b/packages/arcade-ts/src/marketplace/filters.ts @@ -125,25 +125,36 @@ const countDistinctTraitNames = (traits: TraitSelection[]): number => { return new Set(traits.map((trait) => trait.name)).size; }; +const buildFilteredTokenIdsQuery = ( + paddedAddress: string, + filters: TraitSelection[], +): string => { + if (filters.length === 0) { + return `SELECT DISTINCT token_id +FROM token_attributes +WHERE token_id LIKE '${paddedAddress}:%'`; + } + + const whereClause = buildTraitWhereClause(filters); + const distinctTraitCount = countDistinctTraitNames(filters); + return `SELECT token_id +FROM token_attributes +WHERE token_id LIKE '${paddedAddress}:%' + AND ${whereClause} +GROUP BY token_id +HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount}`; +}; + const buildTraitNamesSummaryQuery = (address: string): string => { const paddedAddress = addAddressPadding(address); - return `SELECT - trait_name, - COUNT(DISTINCT trait_value) as value_count, - SUM(cnt) as total_count - FROM ( - SELECT trait_name, trait_value, COUNT(*) as cnt - FROM token_attributes - WHERE token_id IN ( - SELECT token_id - FROM token_attributes - WHERE token_id LIKE '${paddedAddress}:%' - GROUP BY token_id - ) - GROUP BY trait_name, trait_value - ) - GROUP BY trait_name - ORDER BY trait_name;`; + return `SELECT + trait_name, + COUNT(DISTINCT trait_value) AS value_count, + COUNT(*) AS total_count +FROM token_attributes +WHERE token_id LIKE '${paddedAddress}:%' +GROUP BY trait_name +ORDER BY trait_name`; }; const buildTraitValuesQuery = ({ @@ -167,20 +178,19 @@ GROUP BY trait_value ORDER BY count DESC`; } - const whereClause = buildTraitWhereClause(otherTraitFilters); - const distinctTraitCount = countDistinctTraitNames(otherTraitFilters); - return `SELECT trait_value, COUNT(*) as count -FROM token_attributes -WHERE trait_name = '${escapedTraitName}' - AND token_id IN ( - SELECT token_id - FROM token_attributes - WHERE ${whereClause} - AND token_id LIKE '${paddedAddress}:%' - GROUP BY token_id - HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount} - ) -GROUP BY trait_value + const filteredTokenIds = buildFilteredTokenIdsQuery( + paddedAddress, + otherTraitFilters, + ); + return `WITH filtered_tokens AS ( + ${filteredTokenIds} +) +SELECT ta.trait_value, COUNT(*) AS count +FROM token_attributes ta +JOIN filtered_tokens ft + ON ta.token_id = ft.token_id +WHERE ta.trait_name = '${escapedTraitName}' +GROUP BY ta.trait_value ORDER BY count DESC`; }; @@ -212,21 +222,20 @@ GROUP BY trait_name, trait_value ORDER BY trait_name, count DESC`; } - const whereClause = buildTraitWhereClause(otherTraitFilters); - const distinctTraitCount = countDistinctTraitNames(otherTraitFilters); - return `SELECT trait_name, trait_value, COUNT(*) as count -FROM token_attributes -WHERE trait_name IN (${traitNamesCondition}) - AND token_id IN ( - SELECT token_id - FROM token_attributes - WHERE ${whereClause} - AND token_id LIKE '${paddedAddress}:%' - GROUP BY token_id - HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount} - ) -GROUP BY trait_name, trait_value -ORDER BY trait_name, count DESC`; + const filteredTokenIds = buildFilteredTokenIdsQuery( + paddedAddress, + otherTraitFilters, + ); + return `WITH filtered_tokens AS ( + ${filteredTokenIds} +) +SELECT ta.trait_name, ta.trait_value, COUNT(*) AS count +FROM token_attributes ta +JOIN filtered_tokens ft + ON ta.token_id = ft.token_id +WHERE ta.trait_name IN (${traitNamesCondition}) +GROUP BY ta.trait_name, ta.trait_value +ORDER BY ta.trait_name, count DESC`; }; const buildTraitMetadataQuery = ({ @@ -237,24 +246,16 @@ const buildTraitMetadataQuery = ({ traits: TraitSelection[]; }): string => { const paddedAddress = addAddressPadding(address); - const whereClause = buildTraitWhereClause(traits); - const distinctTraitCount = countDistinctTraitNames(traits); - const havingClause = distinctTraitCount - ? `HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount}` - : ""; - - return `SELECT trait_name, trait_value, COUNT(*) AS count -FROM token_attributes -WHERE token_id IN ( - SELECT token_id - FROM token_attributes - WHERE ${whereClause} - AND token_id LIKE '${paddedAddress}:%' - GROUP BY token_id - ${havingClause} + const filteredTokenIds = buildFilteredTokenIdsQuery(paddedAddress, traits); + return `WITH filtered_tokens AS ( + ${filteredTokenIds} ) -GROUP BY trait_name, trait_value -ORDER BY trait_name, count DESC`; +SELECT ta.trait_name, ta.trait_value, COUNT(*) AS count +FROM token_attributes ta +JOIN filtered_tokens ft + ON ta.token_id = ft.token_id +GROUP BY ta.trait_name, ta.trait_value +ORDER BY ta.trait_name, count DESC`; }; const normalizeMetadataRow = (row: any): TraitMetadataRow | null => { From ceb641ed09dd5ca598907a5764411ed4042fe8c5 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 07:26:34 +1100 Subject: [PATCH 05/14] Optimize edge SQL collection fetch performance --- .../collection-fetch-sql-performance.prd.md | 127 ++++++++++++++ .../src/marketplace/client.edge.test.ts | 100 +++++++++++ .../arcade-ts/src/marketplace/client.edge.ts | 159 ++++++++++++------ 3 files changed, 339 insertions(+), 47 deletions(-) create mode 100644 packages/arcade-ts/docs/collection-fetch-sql-performance.prd.md diff --git a/packages/arcade-ts/docs/collection-fetch-sql-performance.prd.md b/packages/arcade-ts/docs/collection-fetch-sql-performance.prd.md new file mode 100644 index 00000000..afe3f03c --- /dev/null +++ b/packages/arcade-ts/docs/collection-fetch-sql-performance.prd.md @@ -0,0 +1,127 @@ +# Collection Fetch SQL Performance PRD (TDD) + +## Context + +Large collections are slow to load through the edge SQL marketplace client in `packages/arcade-ts`. Profiling and code review identified scaling bottlenecks in token pagination, attribute filtering, and listing retrieval. + +## Problem Statement + +Collection fetch latency grows superlinearly with collection size in the edge SQL path because: + +- token pagination uses `OFFSET`, which degrades at deep pages; +- attribute filtering is applied client-side after token rows are fetched; +- listing queries are uncapped by default when `limit` is omitted. + +## Goals + +1. Make token page cost stable as collection size grows. +2. Reduce transferred/parsed rows when trait filters are active. +3. Prevent accidental full-table listing reads from default call sites. +4. Preserve existing external API shapes (`FetchCollectionTokensResult`, `CollectionListingsOptions`) and compatibility for existing numeric cursors. + +## Non-Goals + +- Rewriting the Dojo runtime path. +- Changing trait aggregation APIs in `filters.ts`. +- Introducing backend schema/index migrations in this PR. + +## Success Metrics + +1. `listCollectionTokens` no longer emits `OFFSET` for default pagination path. +2. `listCollectionTokens` produces keyset cursors and accepts keyset cursors. +3. `attributeFilters` are pushed into SQL query generation. +4. `listCollectionListings` applies a default `LIMIT` when caller omits one. +5. Existing marketplace edge tests continue to pass. + +## Constraints + +- Keep behavior deterministic for consumers already storing numeric cursors. +- Keep SQL injection protections through existing escaping helpers. +- Keep implementation minimal and test-driven. + +## Proposed Solution + +### 1) Token Keyset Pagination + +- Replace offset paging with keyset paging for new cursors: + - sort remains `ORDER BY token_id`; + - add `token_id > :lastTokenId` when keyset cursor is present; + - derive `nextCursor` from the last row token id if page is full. +- Maintain backward compatibility: + - if cursor is numeric, continue to honor offset behavior. + +### 2) SQL-Level Attribute Filtering + +- Convert `attributeFilters` into SQL clauses against `token_attributes`: + - `(trait_name = 'X' AND trait_value IN (...))` grouped with `OR`; + - constrained to collection prefix (`token_id LIKE ':%'`); + - `HAVING COUNT(DISTINCT trait_name) = ` to enforce AND semantics across traits. +- Keep existing value escaping. + +### 3) Safe Default for Listing Query + +- In `getCollectionOrders`, apply `DEFAULT_LIMIT` when `options.limit` is not provided. +- Preserve explicit `limit` override behavior. + +## TDD Plan (Red-Green-Refactor) + +### Test Set A: Keyset Pagination + +RED: +- Add test asserting first token-page SQL does not include `OFFSET`. +- Add test asserting `nextCursor` is keyset-form and based on last token id. +- Add test asserting keyset cursor injects `token_id > ...`. + +GREEN: +- Introduce cursor parsing/encoding helpers. +- Update SQL builder in `listCollectionTokens`. + +### Test Set B: SQL Attribute Filters + +RED: +- Add test asserting generated SQL includes `token_attributes` subquery and `HAVING COUNT(DISTINCT trait_name)`. + +GREEN: +- Implement SQL trait filter clause builder. +- Remove client-side post-filter step from `listCollectionTokens`. + +### Test Set C: Listing Default Limit + +RED: +- Add test asserting `getCollectionOrders` includes `LIMIT ` when no limit is supplied. + +GREEN: +- Apply default limit in query generation. + +### Refactor + +- Keep helper boundaries small (`cursor` and `attributeFilters` SQL builders). +- Preserve existing exported API signatures. + +## Risks and Mitigations + +1. Lexicographic vs numeric token ordering +- Risk: keyset comparison over string token IDs can differ from numeric order. +- Mitigation: keep existing `ORDER BY token_id` semantics; keyset is aligned with current sort behavior. + +2. Cursor compatibility +- Risk: existing persisted numeric cursor values. +- Mitigation: support both numeric and keyset cursor formats. + +3. Query complexity +- Risk: trait subquery can still be expensive at extreme scale. +- Mitigation: pushes filtering server-side to reduce client over-fetch immediately; index tuning can be separate follow-up. + +## Acceptance Criteria + +- New tests for A/B/C are present and pass. +- Existing `client.edge.test.ts` scenarios remain green. +- Package tests pass for `packages/arcade-ts`. +- No public API/type breaking change. + +## Validation Commands + +```bash +pnpm -C packages/arcade-ts test -- src/marketplace/client.edge.test.ts +pnpm -C packages/arcade-ts test +``` diff --git a/packages/arcade-ts/src/marketplace/client.edge.test.ts b/packages/arcade-ts/src/marketplace/client.edge.test.ts index b7949375..9475fb86 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.test.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.test.ts @@ -111,6 +111,106 @@ describe("createEdgeMarketplaceClient", () => { expect(result.page?.nextCursor).toBeNull(); }); + it("uses keyset pagination for token queries and emits keyset cursor", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [ + { + contract_address: "0xabc", + token_id: "2", + metadata: JSON.stringify({ name: "Token 2" }), + }, + ], + }, + ], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const result = await client.listCollectionTokens({ + address: "0xabc", + limit: 1, + fetchImages: false, + }); + + expect(result.error).toBeNull(); + expect(result.page?.nextCursor).toBe("keyset:2"); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).not.toContain("OFFSET"); + }); + + it("applies keyset cursor to token query predicate", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + cursor: "keyset:9", + limit: 25, + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("token_id > '9'"); + expect(sql).not.toContain("OFFSET"); + }); + + it("pushes attribute filters into SQL instead of filtering client-side", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + attributeFilters: { + rarity: new Set(["legendary", "epic"]), + class: new Set(["wizard"]), + }, + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("FROM token_attributes"); + expect(sql).toContain("HAVING COUNT(DISTINCT trait_name) = 2"); + expect(sql).toContain("trait_name = 'rarity'"); + expect(sql).toContain("trait_name = 'class'"); + }); + + it("applies default order limit when getCollectionOrders limit is omitted", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.getCollectionOrders({ + collection: "0xabc", + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("ORDER BY id DESC LIMIT 100"); + }); + it("short-circuits invalid orderIds without issuing malformed SQL", async () => { mockedFetchToriisSql.mockResolvedValue({ data: [{ endpoint: "arcade-main", data: [] }], diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 9ac039c5..1956c032 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -98,6 +98,79 @@ const toPositiveInt = (value: number, fallback: number): number => { return intValue; }; +const KEYSET_CURSOR_PREFIX = "keyset:"; + +const parseTokenCursor = ( + cursor?: string | null | undefined, +): { offset?: number; keysetTokenId?: string } => { + if (!cursor) return {}; + if (cursor.startsWith(KEYSET_CURSOR_PREFIX)) { + const tokenId = cursor.slice(KEYSET_CURSOR_PREFIX.length); + if (!tokenId) return {}; + return { keysetTokenId: tokenId }; + } + + const numericCursor = Number.parseInt(cursor, 10); + if (Number.isFinite(numericCursor) && `${numericCursor}` === cursor.trim()) { + return { offset: Math.max(0, numericCursor) }; + } + + return { keysetTokenId: cursor }; +}; + +const encodeKeysetCursor = (tokenId: string): string => + `${KEYSET_CURSOR_PREFIX}${tokenId}`; + +const buildAttributeFilterSqlClause = ( + collectionAddress: string, + filters: FetchCollectionTokensOptions["attributeFilters"], +): string | null => { + if (!filters || Object.keys(filters).length === 0) return null; + + const traitClauses: string[] = []; + const distinctTraits = new Set(); + + for (const [trait, values] of Object.entries(filters)) { + if (values == null) continue; + const selectedValues = Array.isArray(values) + ? values + : Array.from(values as Iterable); + const normalizedValues = selectedValues + .map((value) => String(value)) + .filter((value) => value.length > 0); + if (normalizedValues.length === 0) continue; + + distinctTraits.add(trait); + + const traitName = escapeSqlValue(trait); + if (normalizedValues.length === 1) { + traitClauses.push( + `(trait_name = '${traitName}' AND trait_value = '${escapeSqlValue( + normalizedValues[0], + )}')`, + ); + continue; + } + + traitClauses.push( + `(trait_name = '${traitName}' AND trait_value IN (${toSqlList( + normalizedValues, + )}))`, + ); + } + + if (traitClauses.length === 0) return null; + + return `token_id IN ( + SELECT token_id + FROM token_attributes + WHERE token_id LIKE '${escapeSqlValue(collectionAddress)}:%' + AND (${traitClauses.join(" OR ")}) + GROUP BY token_id + HAVING COUNT(DISTINCT trait_name) = ${distinctTraits.size} +)`; +}; + async function querySql(projectId: string, sql: string): Promise { const result = await fetchToriisSql([projectId], sql); if (result.errors?.length) { @@ -111,39 +184,6 @@ async function querySql(projectId: string, sql: string): Promise { return rows; } -const tokenMatchesAttributeFilters = ( - token: { metadata?: any }, - filters: FetchCollectionTokensOptions["attributeFilters"], -): boolean => { - if (!filters || Object.keys(filters).length === 0) return true; - const metadata = parseJsonSafe(token.metadata, token.metadata); - const attributes = Array.isArray((metadata as any)?.attributes) - ? (metadata as any).attributes - : []; - if (!attributes.length) return false; - - const traitMap = new Map>(); - for (const attribute of attributes) { - const trait = attribute?.trait_type; - const value = attribute?.value; - if (trait == null || value == null) continue; - const traitName = String(trait); - if (!traitMap.has(traitName)) traitMap.set(traitName, new Set()); - traitMap.get(traitName)?.add(String(value)); - } - - for (const [trait, values] of Object.entries(filters)) { - if (values == null) continue; - const selected = Array.isArray(values) ? values : Array.from(values as any); - const available = traitMap.get(trait); - if (!available) return false; - const matched = selected.some((value) => available.has(String(value))); - if (!matched) return false; - } - - return true; -}; - function toOrderModel(row: any): OrderModel { const orderLike = { id: asNumber(row.id), @@ -296,7 +336,7 @@ LIMIT 1`, } = options; const projectId = ensureProjectId(project, defaultProject); const collection = addAddressPadding(getChecksumAddress(address)).toLowerCase(); - const offset = cursor ? Number.parseInt(cursor, 10) || 0 : 0; + const cursorState = parseTokenCursor(cursor); const effectiveLimit = toPositiveInt(limit, DEFAULT_LIMIT); const normalizedTokenIds = normalizeTokenIds(tokenIds); @@ -313,12 +353,30 @@ LIMIT 1`, ); } + if (cursorState.keysetTokenId) { + conditions.push( + `token_id > '${escapeSqlValue(cursorState.keysetTokenId)}'`, + ); + } + + const traitClause = buildAttributeFilterSqlClause( + collection, + attributeFilters, + ); + if (traitClause) { + conditions.push(traitClause); + } + const sql = `SELECT contract_address, token_id, metadata, name, symbol, decimals FROM tokens WHERE ${conditions.join(" AND ")} ORDER BY token_id -LIMIT ${effectiveLimit} -OFFSET ${Math.max(0, offset)}`; +LIMIT ${effectiveLimit}${ + cursorState.offset != null + ? ` +OFFSET ${cursorState.offset}` + : "" + }`; try { const rows = await querySql(projectId, sql); @@ -327,15 +385,21 @@ OFFSET ${Math.max(0, offset)}`; resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage, }); - const filtered = normalized.filter((token) => - tokenMatchesAttributeFilters(token, attributeFilters), - ) as NormalizedToken[]; - - const nextCursor = - rows.length >= effectiveLimit ? String(offset + rows.length) : null; + let nextCursor: string | null = null; + if (rows.length >= effectiveLimit) { + if (cursorState.offset != null) { + nextCursor = String(cursorState.offset + rows.length); + } else { + const lastRow = rows[rows.length - 1]; + const lastTokenId = lastRow?.token_id; + if (lastTokenId != null) { + nextCursor = encodeKeysetCursor(String(lastTokenId)); + } + } + } return { page: { - tokens: filtered, + tokens: normalized as NormalizedToken[], nextCursor, }, error: null, @@ -393,13 +457,14 @@ OFFSET ${Math.max(0, offset)}`; conditions.push(`category = ${category}`); } - const effectiveLimit = options.limit - ? toPositiveInt(options.limit, DEFAULT_LIMIT) - : undefined; + const effectiveLimit = toPositiveInt( + options.limit ?? DEFAULT_LIMIT, + DEFAULT_LIMIT, + ); const sql = `SELECT id, category, status, expiration, collection, token_id, quantity, price, currency, owner FROM "ARCADE-Order" WHERE ${conditions.join(" AND ")} -ORDER BY id DESC${effectiveLimit ? ` LIMIT ${effectiveLimit}` : ""}`; +ORDER BY id DESC LIMIT ${effectiveLimit}`; const rows = await querySql(projectIdOverride ?? defaultProject, sql); return rows.map(toOrderModel).filter((order) => order.exists()); From 892e4a28185f8cbaeaa0452cea4063c37d389f1a Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 07:53:34 +1100 Subject: [PATCH 06/14] Fix Biome formatting in edge marketplace client --- .../arcade-ts/src/marketplace/client.edge.ts | 46 +++++++++++-------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 1956c032..1fcca404 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -267,7 +267,9 @@ export async function createEdgeMarketplaceClient( ): Promise => { const { projectId: projectIdInput, address, fetchImages = true } = options; const projectId = ensureProjectId(projectIdInput, defaultProject); - const collection = addAddressPadding(getChecksumAddress(address)).toLowerCase(); + const collection = addAddressPadding( + getChecksumAddress(address), + ).toLowerCase(); const rows = await querySql( projectId, @@ -335,14 +337,14 @@ LIMIT 1`, fetchImages = false, } = options; const projectId = ensureProjectId(project, defaultProject); - const collection = addAddressPadding(getChecksumAddress(address)).toLowerCase(); + const collection = addAddressPadding( + getChecksumAddress(address), + ).toLowerCase(); const cursorState = parseTokenCursor(cursor); const effectiveLimit = toPositiveInt(limit, DEFAULT_LIMIT); const normalizedTokenIds = normalizeTokenIds(tokenIds); - const conditions = [ - `contract_address = '${escapeSqlValue(collection)}'`, - ]; + const conditions = [`contract_address = '${escapeSqlValue(collection)}'`]; if (normalizedTokenIds.length > 0) { const values = [ @@ -419,7 +421,9 @@ OFFSET ${cursorState.offset}` options: CollectionOrdersOptions, projectIdOverride?: string, ): Promise => { - const collection = addAddressPadding(getChecksumAddress(options.collection)).toLowerCase(); + const collection = addAddressPadding( + getChecksumAddress(options.collection), + ).toLowerCase(); const tokenId = normalizeTokenIdForQuery(options.tokenId); const status = options.status != null ? statusValueMap[options.status] : undefined; @@ -474,13 +478,16 @@ ORDER BY id DESC LIMIT ${effectiveLimit}`; options: CollectionListingsOptions, ): Promise => { const projectId = ensureProjectId(options.projectId, defaultProject); - const baseOrders = await getCollectionOrders({ - collection: options.collection, - tokenId: options.tokenId, - limit: options.limit, - category: CategoryType.Sell, - status: StatusType.Placed, - }, projectId); + const baseOrders = await getCollectionOrders( + { + collection: options.collection, + tokenId: options.tokenId, + limit: options.limit, + category: CategoryType.Sell, + status: StatusType.Placed, + }, + projectId, + ); const filtered = baseOrders.filter( (order) => @@ -521,11 +528,14 @@ ORDER BY id DESC LIMIT ${effectiveLimit}`; const token = tokenPage.page?.tokens[0]; if (!token) return null; - const orders = await getCollectionOrders({ - collection, - tokenId, - limit: orderLimit, - }, projectId); + const orders = await getCollectionOrders( + { + collection, + tokenId, + limit: orderLimit, + }, + projectId, + ); const now = Date.now() / 1000; let listings = orders.filter( From f58e0202d933e46305732ef14429a3260b84adb8 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 07:58:40 +1100 Subject: [PATCH 07/14] Update filters SQL tests for CTE query shape --- packages/arcade-ts/src/marketplace/filters.test.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/arcade-ts/src/marketplace/filters.test.ts b/packages/arcade-ts/src/marketplace/filters.test.ts index 0d0f6459..9faf91d4 100644 --- a/packages/arcade-ts/src/marketplace/filters.test.ts +++ b/packages/arcade-ts/src/marketplace/filters.test.ts @@ -136,7 +136,9 @@ describe("marketplace filters helpers", () => { expect(mockedFetchToriisSql).toHaveBeenCalledWith( ["arcade-main", "arcade-alt"], - expect.stringContaining("SELECT trait_name, trait_value"), + expect.stringContaining( + "SELECT ta.trait_name, ta.trait_value, COUNT(*) AS count", + ), ); expect(result.pages).toHaveLength(2); @@ -197,7 +199,7 @@ describe("marketplace filters helpers", () => { expect(available.Ring?.Gold).toBe(30); }); - it("groups OR trait filters before applying collection scope", async () => { + it("keeps OR trait filters grouped while applying collection scope", async () => { mockedFetchToriisSql.mockResolvedValue({ data: [{ endpoint: "arcade-main", data: [] }], errors: [], @@ -213,8 +215,12 @@ describe("marketplace filters helpers", () => { }); const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; - expect(query).toMatch( - /\(\(trait_name = 'Rarity' AND trait_value = 'Legendary'\) OR \(trait_name = 'Background' AND trait_value = 'Gold'\)\)\s+AND token_id LIKE/, + expect(query).toContain("WITH filtered_tokens AS ("); + expect(query).toContain( + "WHERE token_id LIKE '0x0000000000000000000000000000000000000000000000000000000000000123:%'", + ); + expect(query).toContain( + "AND ((trait_name = 'Rarity' AND trait_value = 'Legendary') OR (trait_name = 'Background' AND trait_value = 'Gold'))", ); }); From e4543f8af15a907e1800d6e4302376c1cc0bb3c2 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 08:27:14 +1100 Subject: [PATCH 08/14] Add resilient SQL benchmark harness and CI workflow --- .github/workflows/benchmark-sql.yml | 164 +++++++++ packages/arcade-ts/package.json | 1 + packages/arcade-ts/scripts/sql-benchmark.mjs | 346 ++++++++++++++++++ .../src/marketplace/benchmark.test.ts | 159 ++++++++ .../arcade-ts/src/marketplace/benchmark.ts | 254 +++++++++++++ packages/arcade-ts/src/marketplace/index.ts | 1 + 6 files changed, 925 insertions(+) create mode 100644 .github/workflows/benchmark-sql.yml create mode 100644 packages/arcade-ts/scripts/sql-benchmark.mjs create mode 100644 packages/arcade-ts/src/marketplace/benchmark.test.ts create mode 100644 packages/arcade-ts/src/marketplace/benchmark.ts diff --git a/.github/workflows/benchmark-sql.yml b/.github/workflows/benchmark-sql.yml new file mode 100644 index 00000000..36708dfc --- /dev/null +++ b/.github/workflows/benchmark-sql.yml @@ -0,0 +1,164 @@ +name: benchmark-sql + +on: + pull_request: + branches: + - main + paths: + - "packages/arcade-ts/**" + - ".github/workflows/benchmark-sql.yml" + workflow_dispatch: + inputs: + project_id: + description: "Torii project id" + required: false + default: "arcade-main" + collection_address: + description: "Collection contract address" + required: false + default: "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4" + attribute_filters_json: + description: "JSON attribute filters for token benchmarks" + required: false + default: '{"beast id":["trait"]}' + trait_name: + description: "Trait name for trait-value benchmark query" + required: false + default: "beast id" + warmup: + description: "Warmup runs per operation" + required: false + default: "3" + iterations: + description: "Measured runs per operation" + required: false + default: "10" + operation_timeout_ms: + description: "Per-operation timeout in milliseconds" + required: false + default: "15000" + include_optional_ops: + description: "Include optional operations (getCollection, ownership=true, full trait metadata)" + required: false + default: "false" + fail_on_operation_error: + description: "Fail workflow when one benchmark operation errors" + required: false + default: "false" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + benchmark-sql: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: pnpm/action-setup@v4 + with: + version: 10.5.2 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Resolve benchmark settings + id: settings + env: + PROJECT_ID_INPUT: ${{ github.event.inputs.project_id }} + COLLECTION_INPUT: ${{ github.event.inputs.collection_address }} + FILTERS_INPUT: ${{ github.event.inputs.attribute_filters_json }} + TRAIT_INPUT: ${{ github.event.inputs.trait_name }} + WARMUP_INPUT: ${{ github.event.inputs.warmup }} + ITER_INPUT: ${{ github.event.inputs.iterations }} + TIMEOUT_INPUT: ${{ github.event.inputs.operation_timeout_ms }} + OPTIONAL_OPS_INPUT: ${{ github.event.inputs.include_optional_ops }} + FAIL_FAST_INPUT: ${{ github.event.inputs.fail_on_operation_error }} + run: | + project_id="${PROJECT_ID_INPUT:-arcade-main}" + collection_address="${COLLECTION_INPUT:-0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4}" + attribute_filters_json="${FILTERS_INPUT:-{\"beast id\":[\"trait\"]}}" + trait_name="${TRAIT_INPUT:-beast id}" + warmup="${WARMUP_INPUT:-3}" + iterations="${ITER_INPUT:-10}" + operation_timeout_ms="${TIMEOUT_INPUT:-15000}" + include_optional_ops="${OPTIONAL_OPS_INPUT:-false}" + fail_on_operation_error="${FAIL_FAST_INPUT:-false}" + + mkdir -p .artifacts/sql-benchmark + + echo "project_id=${project_id}" >> "$GITHUB_OUTPUT" + echo "collection_address=${collection_address}" >> "$GITHUB_OUTPUT" + echo "attribute_filters_json=${attribute_filters_json}" >> "$GITHUB_OUTPUT" + echo "trait_name=${trait_name}" >> "$GITHUB_OUTPUT" + echo "warmup=${warmup}" >> "$GITHUB_OUTPUT" + echo "iterations=${iterations}" >> "$GITHUB_OUTPUT" + echo "operation_timeout_ms=${operation_timeout_ms}" >> "$GITHUB_OUTPUT" + echo "include_optional_ops=${include_optional_ops}" >> "$GITHUB_OUTPUT" + echo "fail_on_operation_error=${fail_on_operation_error}" >> "$GITHUB_OUTPUT" + + - name: Benchmark pull request base + if: github.event_name == 'pull_request' + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + BENCH_PROJECT_ID: ${{ steps.settings.outputs.project_id }} + BENCH_COLLECTION_ADDRESS: ${{ steps.settings.outputs.collection_address }} + BENCH_ATTRIBUTE_FILTERS_JSON: ${{ steps.settings.outputs.attribute_filters_json }} + BENCH_TRAIT_NAME: ${{ steps.settings.outputs.trait_name }} + BENCH_WARMUP: ${{ steps.settings.outputs.warmup }} + BENCH_ITERATIONS: ${{ steps.settings.outputs.iterations }} + BENCH_OPERATION_TIMEOUT_MS: ${{ steps.settings.outputs.operation_timeout_ms }} + BENCH_INCLUDE_OPTIONAL_OPS: ${{ steps.settings.outputs.include_optional_ops }} + BENCH_FAIL_ON_OPERATION_ERROR: ${{ steps.settings.outputs.fail_on_operation_error }} + BENCH_OUTPUT_FILE: .artifacts/sql-benchmark/base.json + BENCH_MARKDOWN_FILE: .artifacts/sql-benchmark/base.md + run: | + rm -rf /tmp/arcade-base + git worktree add /tmp/arcade-base "${BASE_SHA}" + pnpm --dir /tmp/arcade-base install --frozen-lockfile --ignore-scripts + pnpm --dir /tmp/arcade-base --filter @cartridge/arcade build + BENCH_ARCADE_DIST_DIR=/tmp/arcade-base/packages/arcade-ts/dist \ + node packages/arcade-ts/scripts/sql-benchmark.mjs + + - name: Benchmark current head + env: + BENCH_PROJECT_ID: ${{ steps.settings.outputs.project_id }} + BENCH_COLLECTION_ADDRESS: ${{ steps.settings.outputs.collection_address }} + BENCH_ATTRIBUTE_FILTERS_JSON: ${{ steps.settings.outputs.attribute_filters_json }} + BENCH_TRAIT_NAME: ${{ steps.settings.outputs.trait_name }} + BENCH_WARMUP: ${{ steps.settings.outputs.warmup }} + BENCH_ITERATIONS: ${{ steps.settings.outputs.iterations }} + BENCH_OPERATION_TIMEOUT_MS: ${{ steps.settings.outputs.operation_timeout_ms }} + BENCH_INCLUDE_OPTIONAL_OPS: ${{ steps.settings.outputs.include_optional_ops }} + BENCH_FAIL_ON_OPERATION_ERROR: ${{ steps.settings.outputs.fail_on_operation_error }} + BENCH_OUTPUT_FILE: .artifacts/sql-benchmark/head.json + BENCH_MARKDOWN_FILE: .artifacts/sql-benchmark/head.md + run: | + pnpm --filter @cartridge/arcade build + if [ -f .artifacts/sql-benchmark/base.json ]; then + export BENCH_BASELINE_FILE=.artifacts/sql-benchmark/base.json + fi + node packages/arcade-ts/scripts/sql-benchmark.mjs + + - name: Upload benchmark artifacts + uses: actions/upload-artifact@v4 + with: + name: sql-benchmark-${{ github.run_id }} + path: .artifacts/sql-benchmark/ + if-no-files-found: error + + - name: Append benchmark summary + run: | + { + echo "### SQL Benchmark"; + echo ""; + cat .artifacts/sql-benchmark/head.md; + } >> "$GITHUB_STEP_SUMMARY" diff --git a/packages/arcade-ts/package.json b/packages/arcade-ts/package.json index 5cf73791..8cd038ea 100644 --- a/packages/arcade-ts/package.json +++ b/packages/arcade-ts/package.json @@ -50,6 +50,7 @@ "test:coverage": "vitest run --coverage", "test:watch": "vitest", "test:edge:smoke": "vitest run --config vitest.edge.config.ts", + "benchmark:sql": "node ./scripts/sql-benchmark.mjs", "test:integration": "RUN_INTEGRATION_TESTS=true vitest run --config vitest.integration.config.ts", "docs": "cd www && npm run start", "docs:build": "cd www && GIT_REVISION_OVERRIDE=${npm_config_git_revision_override} npm run build", diff --git a/packages/arcade-ts/scripts/sql-benchmark.mjs b/packages/arcade-ts/scripts/sql-benchmark.mjs new file mode 100644 index 00000000..89476ee5 --- /dev/null +++ b/packages/arcade-ts/scripts/sql-benchmark.mjs @@ -0,0 +1,346 @@ +#!/usr/bin/env node + +import fs from "node:fs/promises"; +import path from "node:path"; +import { performance } from "node:perf_hooks"; +import { pathToFileURL } from "node:url"; +import { constants } from "starknet"; + +const DEFAULT_COLLECTION = + "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4"; +const DEFAULT_PROJECT_ID = "arcade-main"; +const DEFAULT_ATTRIBUTE_FILTERS_JSON = '{"beast id":["trait"]}'; + +const toPositiveInt = (value, fallback) => { + const parsed = Number.parseInt(String(value ?? ""), 10); + if (!Number.isFinite(parsed) || parsed <= 0) return fallback; + return parsed; +}; + +const toBoolean = (value, fallback = false) => { + if (value == null || `${value}`.trim().length === 0) { + return fallback; + } + + const normalized = `${value}`.trim().toLowerCase(); + return ( + normalized === "1" || + normalized === "true" || + normalized === "yes" || + normalized === "on" + ); +}; + +const parseAttributeFilters = (jsonInput) => { + if (!jsonInput || jsonInput.trim().length === 0) return undefined; + + let parsed; + try { + parsed = JSON.parse(jsonInput); + } catch (error) { + throw new Error( + `Invalid BENCH_ATTRIBUTE_FILTERS_JSON value: ${String(error)}`, + ); + } + + if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { + throw new Error("BENCH_ATTRIBUTE_FILTERS_JSON must be a JSON object"); + } + + const normalized = {}; + for (const [trait, values] of Object.entries(parsed)) { + if (!Array.isArray(values)) continue; + const filtered = values + .map((value) => String(value)) + .filter((value) => value.length > 0); + if (filtered.length === 0) continue; + normalized[trait] = filtered; + } + + return Object.keys(normalized).length > 0 ? normalized : undefined; +}; + +const ensureDir = async (targetFile) => { + const dir = path.dirname(targetFile); + await fs.mkdir(dir, { recursive: true }); +}; + +const loadMarketplaceModule = async (distDir) => { + const target = path.resolve(distDir, "marketplace/index.mjs"); + const moduleUrl = pathToFileURL(target).href; + return import(moduleUrl); +}; + +const getDefaultDistDir = (cwd) => { + const packageDist = path.resolve(cwd, "packages/arcade-ts/dist"); + return packageDist; +}; + +const maybeReadBaseline = async (baselinePath) => { + if (!baselinePath) return undefined; + try { + const content = await fs.readFile(baselinePath, "utf-8"); + return JSON.parse(content); + } catch { + return undefined; + } +}; + +const main = async () => { + const cwd = process.cwd(); + const projectId = process.env.BENCH_PROJECT_ID || DEFAULT_PROJECT_ID; + const collectionAddress = + process.env.BENCH_COLLECTION_ADDRESS || DEFAULT_COLLECTION; + const warmup = toPositiveInt(process.env.BENCH_WARMUP, 3); + const iterations = toPositiveInt(process.env.BENCH_ITERATIONS, 10); + const operationTimeoutMs = toPositiveInt( + process.env.BENCH_OPERATION_TIMEOUT_MS, + 15000, + ); + const includeOptionalOps = toBoolean( + process.env.BENCH_INCLUDE_OPTIONAL_OPS, + false, + ); + const failOnOperationError = toBoolean( + process.env.BENCH_FAIL_ON_OPERATION_ERROR, + false, + ); + const tokenLimit = toPositiveInt(process.env.BENCH_TOKEN_LIMIT, 100); + const orderLimit = toPositiveInt(process.env.BENCH_ORDER_LIMIT, 100); + const listingLimit = toPositiveInt(process.env.BENCH_LISTING_LIMIT, 100); + const distDir = + process.env.BENCH_ARCADE_DIST_DIR || getDefaultDistDir(cwd); + const outputFile = path.resolve( + process.env.BENCH_OUTPUT_FILE || ".artifacts/sql-benchmark/head.json", + ); + const markdownFile = path.resolve( + process.env.BENCH_MARKDOWN_FILE || ".artifacts/sql-benchmark/head.md", + ); + const baselineFile = process.env.BENCH_BASELINE_FILE + ? path.resolve(process.env.BENCH_BASELINE_FILE) + : undefined; + + const attributeFilters = parseAttributeFilters( + process.env.BENCH_ATTRIBUTE_FILTERS_JSON || DEFAULT_ATTRIBUTE_FILTERS_JSON, + ); + const traitName = process.env.BENCH_TRAIT_NAME || "beast id"; + + const marketplace = await loadMarketplaceModule(distDir); + + const { + createMarketplaceClient, + fetchCollectionTraitMetadata, + fetchTraitValues, + runBenchmarkOperation, + compareBenchmarkReports, + renderBenchmarkMarkdown, + } = marketplace; + + if (!createMarketplaceClient) { + throw new Error("createMarketplaceClient export was not found"); + } + if (!runBenchmarkOperation) { + throw new Error("runBenchmarkOperation export was not found"); + } + + const client = await createMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + defaultProject: projectId, + runtime: "edge", + }); + + const operationResults = []; + const operationFailures = []; + + const ensureTokenPageResult = async (resultPromise) => { + const result = await resultPromise; + const maybeError = result?.error?.error ?? result?.error; + if (maybeError) { + throw maybeError instanceof Error + ? maybeError + : new Error(String(maybeError)); + } + return result; + }; + + const ensurePageErrorsEmpty = async (resultPromise) => { + const result = await resultPromise; + const maybeError = result?.errors?.[0]?.error ?? result?.errors?.[0]; + if (maybeError) { + throw maybeError instanceof Error + ? maybeError + : new Error(String(maybeError)); + } + return result; + }; + + const runAndRecord = async (name, execute) => { + const outcome = await runBenchmarkOperation({ + name, + warmup, + iterations, + timeoutMs: operationTimeoutMs, + execute, + now: () => performance.now(), + }); + + if (outcome.result) { + operationResults.push(outcome.result); + return outcome.lastResult; + } + + if (outcome.failure) { + operationFailures.push(outcome.failure); + console.warn(`[benchmark] operation failed: ${name}`); + console.warn(`[benchmark] reason: ${outcome.failure.error}`); + if (failOnOperationError) { + throw new Error(`[${name}] ${outcome.failure.error}`); + } + } + + return undefined; + }; + + if (includeOptionalOps) { + await runAndRecord("getCollection", async () => + client.getCollection({ + projectId, + address: collectionAddress, + fetchImages: false, + }), + ); + } + + const firstPageResult = await runAndRecord( + "listCollectionTokens:first-page", + async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + limit: tokenLimit, + fetchImages: false, + }), + ), + ); + + const seedCursor = firstPageResult?.page?.nextCursor; + if (seedCursor) { + await runAndRecord("listCollectionTokens:next-page", async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + cursor: seedCursor, + limit: tokenLimit, + fetchImages: false, + }), + ), + ); + } + + if (attributeFilters) { + await runAndRecord("listCollectionTokens:attribute-filters", async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + limit: tokenLimit, + attributeFilters, + fetchImages: false, + }), + ), + ); + } + + await runAndRecord("getCollectionOrders", async () => + client.getCollectionOrders({ + collection: collectionAddress, + limit: orderLimit, + }), + ); + + await runAndRecord("listCollectionListings:verifyOwnership=false", async () => + client.listCollectionListings({ + collection: collectionAddress, + limit: listingLimit, + verifyOwnership: false, + projectId, + }), + ); + + if (includeOptionalOps) { + await runAndRecord("listCollectionListings:verifyOwnership=true", async () => + client.listCollectionListings({ + collection: collectionAddress, + limit: listingLimit, + verifyOwnership: true, + projectId, + }), + ); + } + + if (includeOptionalOps && fetchCollectionTraitMetadata) { + await runAndRecord("fetchCollectionTraitMetadata", async () => + ensurePageErrorsEmpty( + fetchCollectionTraitMetadata({ + address: collectionAddress, + projects: [projectId], + }), + ), + ); + } + + if (fetchTraitValues && traitName) { + await runAndRecord(`fetchTraitValues:${traitName}`, async () => + ensurePageErrorsEmpty( + fetchTraitValues({ + address: collectionAddress, + traitName, + projects: [projectId], + }), + ), + ); + } + + if (operationResults.length === 0) { + throw new Error("No successful benchmark operations completed"); + } + + const report = { + generatedAt: new Date().toISOString(), + projectId, + collectionAddress, + warmup, + iterations, + operations: operationResults, + ...(operationFailures.length > 0 ? { failures: operationFailures } : {}), + }; + + const baseline = await maybeReadBaseline(baselineFile); + const comparison = + baseline && compareBenchmarkReports + ? compareBenchmarkReports(baseline, report) + : []; + + const markdown = renderBenchmarkMarkdown(report, comparison); + + await ensureDir(outputFile); + await ensureDir(markdownFile); + await fs.writeFile(outputFile, JSON.stringify(report, null, 2), "utf-8"); + await fs.writeFile(markdownFile, markdown, "utf-8"); + + console.log(`Benchmark output written to ${outputFile}`); + console.log(`Benchmark markdown written to ${markdownFile}`); + console.log(markdown); +}; + +main() + .then(() => { + process.exit(0); + }) + .catch((error) => { + const message = error instanceof Error ? error.message : String(error); + console.error(`SQL benchmark failed: ${message}`); + process.exit(1); + }); diff --git a/packages/arcade-ts/src/marketplace/benchmark.test.ts b/packages/arcade-ts/src/marketplace/benchmark.test.ts new file mode 100644 index 00000000..c6014bd0 --- /dev/null +++ b/packages/arcade-ts/src/marketplace/benchmark.test.ts @@ -0,0 +1,159 @@ +import { describe, expect, it } from "vitest"; +import { + compareBenchmarkReports, + computeBenchmarkStats, + renderBenchmarkMarkdown, + runBenchmarkOperation, + type BenchmarkReport, +} from "./benchmark"; + +describe("marketplace benchmark helpers", () => { + it("computes percentile stats from sample durations", () => { + const stats = computeBenchmarkStats([10, 20, 30, 40, 50]); + + expect(stats.count).toBe(5); + expect(stats.minMs).toBe(10); + expect(stats.maxMs).toBe(50); + expect(stats.meanMs).toBe(30); + expect(stats.p50Ms).toBe(30); + expect(stats.p95Ms).toBe(50); + }); + + it("compares base and head reports by operation name", () => { + const base: BenchmarkReport = { + generatedAt: "2026-01-01T00:00:00.000Z", + projectId: "arcade-main", + collectionAddress: "0x1", + warmup: 1, + iterations: 3, + operations: [ + { + name: "listCollectionTokens:first-page", + samplesMs: [20, 21, 22], + stats: computeBenchmarkStats([20, 21, 22]), + }, + ], + }; + + const head: BenchmarkReport = { + ...base, + generatedAt: "2026-01-02T00:00:00.000Z", + operations: [ + { + name: "listCollectionTokens:first-page", + samplesMs: [15, 16, 17], + stats: computeBenchmarkStats([15, 16, 17]), + }, + ], + }; + + const rows = compareBenchmarkReports(base, head); + expect(rows).toHaveLength(1); + expect(rows[0]?.name).toBe("listCollectionTokens:first-page"); + expect(rows[0]?.deltaP50Pct).toBeLessThan(0); + expect(rows[0]?.deltaP95Pct).toBeLessThan(0); + }); + + it("renders markdown summary for CI step output", () => { + const report: BenchmarkReport = { + generatedAt: "2026-01-02T00:00:00.000Z", + projectId: "arcade-main", + collectionAddress: "0x1", + warmup: 1, + iterations: 3, + operations: [ + { + name: "getCollection", + samplesMs: [5, 6, 7], + stats: computeBenchmarkStats([5, 6, 7]), + }, + ], + }; + + const markdown = renderBenchmarkMarkdown(report); + expect(markdown).toContain("SQL Benchmark Report"); + expect(markdown).toContain("getCollection"); + expect(markdown).toContain("| Operation |"); + }); + + it("runs a benchmark operation and records success samples", async () => { + let currentNow = 0; + const now = () => { + currentNow += 5; + return currentNow; + }; + + const outcome = await runBenchmarkOperation({ + name: "listCollectionTokens:first-page", + warmup: 1, + iterations: 3, + execute: async () => ({ ok: true }), + now, + }); + + expect(outcome.result?.name).toBe("listCollectionTokens:first-page"); + expect(outcome.result?.stats.count).toBe(3); + expect(outcome.result?.samplesMs).toEqual([5, 5, 5]); + expect(outcome.failure).toBeUndefined(); + }); + + it("marks operation as failed when execute throws", async () => { + const outcome = await runBenchmarkOperation({ + name: "getCollection", + warmup: 1, + iterations: 2, + execute: async () => { + throw new Error("HTTP error! status: 400"); + }, + }); + + expect(outcome.result).toBeUndefined(); + expect(outcome.failure?.name).toBe("getCollection"); + expect(outcome.failure?.error).toContain("400"); + }); + + it("marks operation as failed when timeout elapses", async () => { + const outcome = await runBenchmarkOperation({ + name: "fetchCollectionTraitMetadata", + warmup: 1, + iterations: 1, + timeoutMs: 10, + execute: async () => + new Promise((resolve) => { + setTimeout(resolve, 100); + }), + }); + + expect(outcome.result).toBeUndefined(); + expect(outcome.failure?.name).toBe("fetchCollectionTraitMetadata"); + expect(outcome.failure?.error).toContain("timed out"); + }); + + it("renders failed operations in markdown output", () => { + const report: BenchmarkReport = { + generatedAt: "2026-01-02T00:00:00.000Z", + projectId: "arcade-main", + collectionAddress: "0x1", + warmup: 1, + iterations: 1, + operations: [ + { + name: "listCollectionTokens:first-page", + samplesMs: [10], + stats: computeBenchmarkStats([10]), + }, + ], + failures: [ + { + name: "getCollection", + error: "HTTP error! status: 400", + }, + ], + }; + + const markdown = renderBenchmarkMarkdown(report); + expect(markdown).toContain("Failed Operations"); + expect(markdown).toContain("getCollection"); + expect(markdown).toContain("status: 400"); + }); +}); diff --git a/packages/arcade-ts/src/marketplace/benchmark.ts b/packages/arcade-ts/src/marketplace/benchmark.ts new file mode 100644 index 00000000..2de65e67 --- /dev/null +++ b/packages/arcade-ts/src/marketplace/benchmark.ts @@ -0,0 +1,254 @@ +export interface BenchmarkStats { + count: number; + minMs: number; + maxMs: number; + meanMs: number; + p50Ms: number; + p95Ms: number; +} + +export interface BenchmarkOperationResult { + name: string; + samplesMs: number[]; + stats: BenchmarkStats; + notes?: string; +} + +export interface BenchmarkOperationFailure { + name: string; + error: string; +} + +export interface BenchmarkReport { + generatedAt: string; + projectId: string; + collectionAddress: string; + warmup: number; + iterations: number; + operations: BenchmarkOperationResult[]; + failures?: BenchmarkOperationFailure[]; +} + +export interface BenchmarkComparisonRow { + name: string; + baseP50Ms: number; + headP50Ms: number; + deltaP50Pct: number; + baseP95Ms: number; + headP95Ms: number; + deltaP95Pct: number; +} + +const round = (value: number, precision = 2): number => { + const factor = 10 ** precision; + return Math.round(value * factor) / factor; +}; + +const normalizeErrorMessage = (error: unknown): string => { + if (error instanceof Error) return error.message; + if (typeof error === "string") return error; + return String(error); +}; + +const percentile = (sorted: number[], p: number): number => { + if (sorted.length === 0) return 0; + if (sorted.length === 1) return sorted[0]; + const index = Math.ceil((p / 100) * sorted.length) - 1; + const boundedIndex = Math.min(sorted.length - 1, Math.max(0, index)); + return sorted[boundedIndex]; +}; + +export function computeBenchmarkStats(samplesMs: number[]): BenchmarkStats { + if (samplesMs.length === 0) { + throw new Error("Cannot compute benchmark stats with zero samples"); + } + + const sorted = [...samplesMs].sort((a, b) => a - b); + const total = sorted.reduce((sum, value) => sum + value, 0); + + return { + count: sorted.length, + minMs: round(sorted[0]), + maxMs: round(sorted[sorted.length - 1]), + meanMs: round(total / sorted.length), + p50Ms: round(percentile(sorted, 50)), + p95Ms: round(percentile(sorted, 95)), + }; +} + +const percentDelta = (base: number, head: number): number => { + if (base === 0) return 0; + return round(((head - base) / base) * 100); +}; + +export function compareBenchmarkReports( + base: BenchmarkReport, + head: BenchmarkReport, +): BenchmarkComparisonRow[] { + const baseByName = new Map( + base.operations.map((operation) => [operation.name, operation]), + ); + + const rows: BenchmarkComparisonRow[] = []; + for (const operation of head.operations) { + const baseOp = baseByName.get(operation.name); + if (!baseOp) continue; + + rows.push({ + name: operation.name, + baseP50Ms: baseOp.stats.p50Ms, + headP50Ms: operation.stats.p50Ms, + deltaP50Pct: percentDelta(baseOp.stats.p50Ms, operation.stats.p50Ms), + baseP95Ms: baseOp.stats.p95Ms, + headP95Ms: operation.stats.p95Ms, + deltaP95Pct: percentDelta(baseOp.stats.p95Ms, operation.stats.p95Ms), + }); + } + + return rows; +} + +const withTimeout = async ( + promise: Promise, + timeoutMs: number | undefined, +): Promise => { + if (!timeoutMs || timeoutMs <= 0) { + return promise; + } + + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error(`Operation timed out after ${timeoutMs}ms`)); + }, timeoutMs); + + promise + .then((value) => resolve(value)) + .catch((error) => reject(error)) + .finally(() => clearTimeout(timer)); + }); +}; + +export interface RunBenchmarkOperationOptions { + name: string; + warmup: number; + iterations: number; + timeoutMs?: number; + execute: () => Promise; + now?: () => number; +} + +export interface RunBenchmarkOperationResult { + result?: BenchmarkOperationResult; + failure?: BenchmarkOperationFailure; + lastResult?: unknown; +} + +export async function runBenchmarkOperation( + options: RunBenchmarkOperationOptions, +): Promise { + const { + name, + warmup, + iterations, + timeoutMs, + execute, + now = () => Date.now(), + } = options; + + try { + let lastResult: unknown; + + for (let i = 0; i < warmup; i += 1) { + lastResult = await withTimeout(execute(), timeoutMs); + } + + const samplesMs: number[] = []; + for (let i = 0; i < iterations; i += 1) { + const startedAt = now(); + lastResult = await withTimeout(execute(), timeoutMs); + samplesMs.push(round(now() - startedAt)); + } + + return { + result: { + name, + samplesMs, + stats: computeBenchmarkStats(samplesMs), + }, + lastResult, + }; + } catch (error) { + return { + failure: { + name, + error: normalizeErrorMessage(error), + }, + }; + } +} + +const formatDelta = (value: number): string => { + const signed = value > 0 ? `+${value}` : `${value}`; + return `${signed}%`; +}; + +const escapeTableCell = (value: string): string => + value.replace(/\|/g, "\\|").replace(/\r?\n/g, " "); + +export function renderBenchmarkMarkdown( + report: BenchmarkReport, + comparison: BenchmarkComparisonRow[] = [], +): string { + const lines: string[] = []; + lines.push("## SQL Benchmark Report"); + lines.push(""); + lines.push(`- Project: \`${report.projectId}\``); + lines.push(`- Collection: \`${report.collectionAddress}\``); + lines.push(`- Generated: \`${report.generatedAt}\``); + lines.push(`- Warmup: \`${report.warmup}\``); + lines.push(`- Iterations: \`${report.iterations}\``); + lines.push(""); + lines.push("| Operation | p50 (ms) | p95 (ms) | mean (ms) |"); + lines.push("| --- | ---: | ---: | ---: |"); + for (const operation of report.operations) { + lines.push( + `| ${operation.name} | ${operation.stats.p50Ms} | ${operation.stats.p95Ms} | ${operation.stats.meanMs} |`, + ); + } + + if (report.failures && report.failures.length > 0) { + lines.push(""); + lines.push("### Failed Operations"); + lines.push(""); + lines.push("| Operation | Error |"); + lines.push("| --- | --- |"); + for (const failure of report.failures) { + lines.push( + `| ${escapeTableCell(failure.name)} | ${escapeTableCell( + failure.error, + )} |`, + ); + } + } + + if (comparison.length > 0) { + lines.push(""); + lines.push("### Base vs Head"); + lines.push(""); + lines.push( + "| Operation | base p50 | head p50 | delta p50 | base p95 | head p95 | delta p95 |", + ); + lines.push("| --- | ---: | ---: | ---: | ---: | ---: | ---: |"); + for (const row of comparison) { + lines.push( + `| ${row.name} | ${row.baseP50Ms} | ${row.headP50Ms} | ${formatDelta( + row.deltaP50Pct, + )} | ${row.baseP95Ms} | ${row.headP95Ms} | ${formatDelta( + row.deltaP95Pct, + )} |`, + ); + } + } + + return lines.join("\n"); +} diff --git a/packages/arcade-ts/src/marketplace/index.ts b/packages/arcade-ts/src/marketplace/index.ts index a8a14fba..0a149d09 100644 --- a/packages/arcade-ts/src/marketplace/index.ts +++ b/packages/arcade-ts/src/marketplace/index.ts @@ -4,3 +4,4 @@ export * from "./client"; export * from "./react"; export * from "./filters"; export * from "./runtime"; +export * from "./benchmark"; From 8dbbc75cd59beee3a7322a8af3e3aece3736e651 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 09:05:36 +1100 Subject: [PATCH 09/14] arcade-ts: implement SQL edge optimization PRD --- .../docs/sql-edge-optimization.prd.md | 266 ++++++++++++++++++ .../src/marketplace/client.edge.test.ts | 168 +++++++++++ .../arcade-ts/src/marketplace/client.edge.ts | 184 +++++++----- .../arcade-ts/src/marketplace/filters.test.ts | 44 ++- packages/arcade-ts/src/marketplace/filters.ts | 101 ++++--- packages/arcade-ts/src/marketplace/utils.ts | 39 ++- 6 files changed, 679 insertions(+), 123 deletions(-) create mode 100644 packages/arcade-ts/docs/sql-edge-optimization.prd.md diff --git a/packages/arcade-ts/docs/sql-edge-optimization.prd.md b/packages/arcade-ts/docs/sql-edge-optimization.prd.md new file mode 100644 index 00000000..c7158863 --- /dev/null +++ b/packages/arcade-ts/docs/sql-edge-optimization.prd.md @@ -0,0 +1,266 @@ +# SQL Edge Optimization PRD (TDD) + +## Document Control + +- Status: Draft +- Owner: `packages/arcade-ts` maintainers +- Last updated: 2026-02-22 +- Priority: P0 (package consumers depending on SQL path) + +## Objective + +Optimize the SQL marketplace path in `packages/arcade-ts` for reliability and latency at large-collection scale. + +Primary target: +- `packages/arcade-ts/src/marketplace/client.edge.ts` +- `packages/arcade-ts/src/marketplace/filters.ts` + +Non-primary target: +- benchmark tooling and CI gating for SQL regressions + +This PRD is SQL-first by design. UI/runtime changes outside the package are out of scope except where needed to validate package behavior. + +## Why This Matters + +Integrators using the SQL runtime need predictable collection-page performance on high-cardinality collections and large orderbooks. + +Observed production-like dataset characteristics (`arcade-main`): +- Beasts collection `0x046da895...5cf0e4`: `79,120` tokens +- Comparator collection `0x027838de...ad10e2d`: `1,121` tokens +- Beasts orders in `"ARCADE-Order"`: `5,832` total, `3,328` active sell listings +- Comparator orders: `0` + +Observed package-level pain points: +- `getCollection` can return `400 Bad Request` for Beasts in SQL path. +- trait aggregation queries can stall/time out in large datasets. +- large `IN (...)` lists and ownership verification queries can inflate query/parse cost. +- token ID normalization is inconsistent across hex formats, creating correctness risk in SQL filtering. + +## Problem Statement + +The current SQL path is partially optimized (keyset token paging and SQL-side attribute filtering are present), but still has four unresolved risk areas: + +1. Reliability: collection summary query can fail for valid collections. +2. Correctness: token ID normalization is not canonical across input forms. +3. Performance: trait metadata/summary queries are full-scan oriented and unbounded. +4. Scalability: large `IN` predicates for token and ownership filtering are fragile at high cardinality. + +## Goals + +1. Eliminate known SQL correctness failures in edge marketplace client. +2. Reduce tail latency for high-volume collection operations. +3. Keep API compatibility for existing package consumers. +4. Add benchmark-based CI guardrails for SQL regressions. + +## Non-Goals + +- Rewriting non-SQL runtime paths. +- Contract/schema migrations managed outside this repository. +- Frontend UX redesign. + +## In Scope + +- SQL generation and execution logic in edge marketplace client. +- SQL trait metadata query shapes. +- token ID canonicalization helpers used by SQL path. +- benchmark scenario coverage and CI budgets for SQL operations. + +## Baseline Operations to Protect + +Core operations: +- `listCollectionTokens:first-page` +- `listCollectionTokens:next-page` +- `listCollectionTokens:attribute-filters` +- `getCollectionOrders` +- `listCollectionListings:verifyOwnership=false` +- `fetchTraitValues:` + +Optional/heavy operations (tracked separately): +- `getCollection` +- `listCollectionListings:verifyOwnership=true` +- `fetchCollectionTraitMetadata` + +## Functional Requirements + +### FR-1: `getCollection` reliability +- SQL query must return a valid collection summary or `null` without throwing for known-good addresses. +- No `400` failures for Beasts benchmark collection. + +### FR-2: Canonical token ID behavior +- SQL token filtering must accept decimal, `0x`-prefixed hex, and bare-hex token IDs consistently. +- `tokenIds` filtering must behave identically for equivalent numeric IDs across formats. + +### FR-3: Trait query performance shape +- Replace prefix-scan-only query shapes (`token_id LIKE '
:%'`) with collection-token join strategy where feasible. +- keep semantic parity for existing trait APIs. + +### FR-4: Large list resilience +- token ID and ownership checks must avoid pathological single-query `IN (...)` expansion. +- apply chunking or CTE/value-table strategy with deterministic merge. + +### FR-5: Benchmark gates +- SQL benchmark CI must cover the above operations for the target large collection and compare base vs head. +- regressions over defined thresholds must be visible and optionally fail CI. + +## Performance Targets (Initial) + +Targets are relative to benchmark baseline in CI (network variance aware): + +1. No regression > 10% p95 in core operations for head vs base. +2. `getCollectionOrders` on Beasts: target 20% p50 improvement from current baseline. +3. `getCollection`: success rate 100% for benchmark collection. +4. trait summary/metadata operations: timeout-bounded and reported; no hanging runs. + +## TDD Delivery Plan + +### Epic A: Correctness and Reliability Hardening + +#### A1. Fix `getCollection` query robustness + +RED (tests first): +- Add `client.edge.test.ts` case where `token_contracts` row lacks metadata/token sample and fallback path still returns collection. +- Add case where first query fails; method returns `null` (or typed error contract if chosen) without unhandled throw. + +GREEN: +- Rewrite `getCollection` to avoid correlated subqueries in `COALESCE`. +- Use deterministic two-step read: + 1. contract row by `contract_address` + 2. optional token sample lookup only when needed + +REFACTOR: +- isolate SQL builders for collection summary query pieces. + +#### A2. Canonical token ID normalization + +RED: +- Add tests asserting `tokenIds: ["ff"]`, `["0xff"]`, and decimal equivalent resolve to same SQL predicate values. +- Add tests around mixed input deduplication. + +GREEN: +- add canonical token-id parser helper used by SQL edge path. +- update `normalizeTokenIds` and related query token helpers. + +REFACTOR: +- centralize token-id normalization in one utility and reuse across SQL methods. + +### Epic B: Trait Query Optimization + +#### B1. Query shape improvements for trait summary/metadata + +RED: +- Extend `filters.test.ts` assertions to verify new query shape uses `tokens`-scoped join for collection filtering. +- Ensure semantic tests for OR-within-trait and AND-across-traits still pass. + +GREEN: +- replace `token_id LIKE '
:%'` centered scans with collection token join CTE pattern where feasible. +- preserve outputs for: + - `fetchTraitNamesSummary` + - `fetchTraitValues` + - `fetchCollectionTraitMetadata` + - `fetchExpandedTraitsMetadata` + +REFACTOR: +- extract shared CTE builders to reduce duplicated SQL templates. + +#### B2. Timeout-aware heavy operations + +RED: +- add benchmark/unit coverage proving heavy operations report timeout/failure deterministically. + +GREEN: +- keep operation-level timeout handling in benchmark harness. +- expose clear failure reporting in markdown/json artifacts. + +REFACTOR: +- normalize error payload shape for benchmark reports. + +### Epic C: Large Predicate Resilience + +#### C1. Large `tokenIds` query strategy + +RED: +- add tests asserting large token ID inputs avoid one unbounded `IN (...)` string. +- assert deterministic ordering and pagination behavior preserved. + +GREEN: +- implement chunking or CTE value-table strategy for large token lists. + +REFACTOR: +- encapsulate chunk/merge behavior with focused helper tests. + +#### C2. Ownership verification scaling + +RED: +- add tests for large owner/token sets to ensure query builder chunks and merges without data loss. + +GREEN: +- chunk ownership verification queries in `verifyListingsOwnership`. + +REFACTOR: +- reuse shared chunk utility for owners/tokenIds. + +### Epic D: Benchmark and CI Gates + +RED: +- add benchmark test coverage for comparison rows and failure sections (already partially present). + +GREEN: +- keep SQL benchmark workflow as required gate for marketplace SQL changes. +- include Beasts defaults: + - project: `arcade-main` + - collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` + +REFACTOR: +- simplify benchmark operation registry and per-operation configuration. + +## Test Plan + +Target test files: +- `packages/arcade-ts/src/marketplace/client.edge.test.ts` +- `packages/arcade-ts/src/marketplace/filters.test.ts` +- `packages/arcade-ts/src/marketplace/benchmark.test.ts` + +Execution gates: + +```bash +pnpm -C packages/arcade-ts test -- src/marketplace/client.edge.test.ts +pnpm -C packages/arcade-ts test -- src/marketplace/filters.test.ts +pnpm -C packages/arcade-ts test -- src/marketplace/benchmark.test.ts +pnpm -C packages/arcade-ts test +``` + +Benchmark validation: + +```bash +pnpm --filter @cartridge/arcade build +BENCH_WARMUP=1 BENCH_ITERATIONS=5 node packages/arcade-ts/scripts/sql-benchmark.mjs +``` + +## Risks and Mitigations + +1. Query planner behavior differs by backend version. +- Mitigation: benchmark base vs head in CI with same backend target. + +2. Token ID format ambiguity across consumers. +- Mitigation: canonical normalization plus format-coverage tests. + +3. Trait query semantics regression while changing SQL shape. +- Mitigation: preserve existing result-shape tests and add cross-query parity fixtures. + +4. Network variance causing noisy benchmark deltas. +- Mitigation: use multiple iterations, report p50/p95, keep thresholds conservative. + +## Rollout + +1. Ship Epic A (correctness) first. +2. Ship Epic B (trait query shape) second. +3. Ship Epic C (large list resilience) third. +4. Enforce Epic D CI thresholds after baseline stabilizes. + +## Definition of Done + +- All new RED tests introduced per epic are observed failing before implementation and green after. +- SQL benchmark workflow produces stable artifacts and markdown summary. +- Core SQL operations have no >10% p95 regression vs base on PR benchmark. +- `getCollection` succeeds for benchmark collection. +- token ID normalization tests pass for hex/decimal mixed inputs. diff --git a/packages/arcade-ts/src/marketplace/client.edge.test.ts b/packages/arcade-ts/src/marketplace/client.edge.test.ts index 9475fb86..8e4a36dd 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.test.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.test.ts @@ -36,6 +36,74 @@ describe("createEdgeMarketplaceClient", () => { ); }); + it("falls back to token sample lookup when contract metadata is missing", async () => { + mockedFetchToriisSql + .mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [ + { + contract_address: "0xabc", + contract_type: "ERC721", + metadata: null, + total_supply: "0x2", + token_id: null, + }, + ], + }, + ], + errors: [], + } as any) + .mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [ + { + token_id: "0x2", + metadata: JSON.stringify({ name: "Fallback metadata" }), + }, + ], + }, + ], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const collection = await client.getCollection({ + address: "0xabc", + fetchImages: false, + }); + + expect(collection).not.toBeNull(); + expect(collection?.tokenIdSample).toBe("0x2"); + expect(collection?.metadata).toMatchObject({ name: "Fallback metadata" }); + expect(mockedFetchToriisSql).toHaveBeenCalledTimes(2); + expect(mockedFetchToriisSql.mock.calls[1]?.[1]).toContain("FROM tokens"); + }); + + it("returns null instead of throwing when getCollection SQL query fails", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [], + errors: [new Error("HTTP error! status: 400")], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await expect( + client.getCollection({ + address: "0xabc", + fetchImages: false, + }), + ).resolves.toBeNull(); + }); + it("lists tokens through SQL transport", async () => { mockedFetchToriisSql.mockResolvedValueOnce({ data: [ @@ -91,6 +159,51 @@ describe("createEdgeMarketplaceClient", () => { expect(sql).toContain("token_id IN ('1')"); }); + it("canonicalizes equivalent decimal and hex tokenIds and deduplicates them", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + tokenIds: ["ff", "0xff", "255"], + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("'255'"); + expect(sql).not.toContain("'0xff'"); + expect(sql).not.toContain("'ff'"); + expect((sql.match(/'255'/g) ?? []).length).toBe(1); + }); + + it("chunks large tokenId filters instead of building one unbounded IN list", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + tokenIds: Array.from({ length: 450 }, (_, index) => String(index + 1)), + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + const inClauseCount = (sql.match(/token_id IN \(/g) ?? []).length; + expect(inClauseCount).toBeGreaterThan(1); + expect(sql).toContain(" OR token_id IN ("); + }); + it("returns null nextCursor when limit is invalid and no rows are returned", async () => { mockedFetchToriisSql.mockResolvedValueOnce({ data: [{ endpoint: "arcade-main", data: [] }], @@ -229,4 +342,59 @@ describe("createEdgeMarketplaceClient", () => { expect(orders).toEqual([]); expect(mockedFetchToriisSql).not.toHaveBeenCalled(); }); + + it("chunks ownership verification queries for large listing sets", async () => { + const orderRows = Array.from({ length: 450 }, (_, index) => ({ + id: index + 1, + category: 2, + status: 1, + expiration: 9999999999, + collection: "0xabc", + token_id: index + 1, + quantity: 1, + price: 1, + currency: "0x1", + owner: "0x123", + })); + + mockedFetchToriisSql.mockImplementation(async (_projects, sql) => { + if (sql.includes('FROM "ARCADE-Order"')) { + return { + data: [{ endpoint: "arcade-main", data: orderRows }], + errors: [], + } as any; + } + + if (sql.includes("FROM token_balances")) { + return { + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any; + } + + return { + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any; + }); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const listings = await client.listCollectionListings({ + collection: "0xabc", + limit: 450, + verifyOwnership: true, + projectId: "arcade-main", + }); + + expect(listings).toEqual([]); + + const ownershipQueries = mockedFetchToriisSql.mock.calls + .map((call) => call[1]) + .filter((sql) => sql.includes("FROM token_balances")); + + expect(ownershipQueries.length).toBeGreaterThan(1); + }); }); diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 1fcca404..be5d4e07 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -19,6 +19,7 @@ import type { TokenDetailsOptions, } from "./types"; import { + canonicalizeTokenId, defaultResolveContractImage, defaultResolveTokenImage, inferImageFromMetadata, @@ -28,6 +29,7 @@ import { } from "./utils"; const DEFAULT_LIMIT = 100; +const SQL_IN_CHUNK_SIZE = 200; const statusValueMap: Record = { [StatusType.None]: 0, @@ -62,11 +64,7 @@ const asBigInt = (value: unknown): bigint => { const normalizeTokenIdForQuery = (tokenId?: string): string | undefined => { if (!tokenId) return undefined; - try { - return BigInt(tokenId).toString(); - } catch (_error) { - return tokenId; - } + return canonicalizeTokenId(tokenId) ?? undefined; }; const ensureProjectId = ( @@ -98,6 +96,30 @@ const toPositiveInt = (value: number, fallback: number): number => { return intValue; }; +const chunkArray = (values: T[], size: number): T[][] => { + if (values.length === 0) return []; + if (size <= 0 || values.length <= size) return [values]; + + const chunks: T[][] = []; + for (let index = 0; index < values.length; index += size) { + chunks.push(values.slice(index, index + size)); + } + return chunks; +}; + +const buildChunkedInPredicate = ( + column: string, + values: string[], + chunkSize = SQL_IN_CHUNK_SIZE, +): string => { + const chunks = chunkArray(values, chunkSize); + if (chunks.length === 0) return "1 = 0"; + if (chunks.length === 1) return `${column} IN (${toSqlList(chunks[0])})`; + return `(${chunks + .map((chunk) => `${column} IN (${toSqlList(chunk)})`) + .join(" OR ")})`; +}; + const KEYSET_CURSOR_PREFIX = "keyset:"; const parseTokenCursor = ( @@ -225,24 +247,31 @@ async function verifyListingsOwnership( ...new Set(listings.map((order) => BigInt(order.tokenId).toString())), ]; if (tokenIds.length === 0) return []; + const ownership = new Set(); - const ownerList = toSqlList(owners.map((owner) => owner.toLowerCase())); - const tokenIdList = toSqlList(tokenIds); + const ownerChunks = chunkArray( + owners.map((owner) => owner.toLowerCase()), + SQL_IN_CHUNK_SIZE, + ); + const tokenIdChunks = chunkArray(tokenIds, SQL_IN_CHUNK_SIZE); - const sql = `SELECT account_address, token_id + for (const ownerChunk of ownerChunks) { + for (const tokenIdChunk of tokenIdChunks) { + const sql = `SELECT account_address, token_id FROM token_balances WHERE contract_address = '${escapeSqlValue(collection)}' - AND account_address IN (${ownerList}) - AND token_id IN (${tokenIdList}) + AND account_address IN (${toSqlList(ownerChunk)}) + AND token_id IN (${toSqlList(tokenIdChunk)}) AND balance != '0x0000000000000000000000000000000000000000000000000000000000000000'`; - const rows = await querySql(projectId, sql); - const ownership = new Set(); + const rows = await querySql(projectId, sql); - for (const row of rows) { - const owner = getChecksumAddress(String(row.account_address)); - const tokenId = BigInt(String(row.token_id)).toString(); - ownership.add(`${owner}_${tokenId}`); + for (const row of rows) { + const owner = getChecksumAddress(String(row.account_address)); + const tokenId = BigInt(String(row.token_id)).toString(); + ownership.add(`${owner}_${tokenId}`); + } + } } return listings.filter((order) => { @@ -271,57 +300,82 @@ export async function createEdgeMarketplaceClient( getChecksumAddress(address), ).toLowerCase(); - const rows = await querySql( - projectId, - `SELECT - tc.contract_address, - tc.contract_type, - tc.type, - COALESCE( - tc.metadata, - (SELECT t.metadata FROM tokens t WHERE t.contract_address = tc.contract_address LIMIT 1) - ) AS metadata, - tc.total_supply, - COALESCE( - tc.token_id, - (SELECT t.token_id FROM tokens t WHERE t.contract_address = tc.contract_address LIMIT 1) - ) AS token_id -FROM token_contracts tc -WHERE tc.contract_address = '${escapeSqlValue(collection)}' + try { + const rows = await querySql( + projectId, + `SELECT + contract_address, + contract_type, + type, + metadata, + total_supply, + token_id +FROM token_contracts +WHERE contract_address = '${escapeSqlValue(collection)}' LIMIT 1`, - ); + ); - const contract = rows[0]; - if (!contract) return null; + const contract = rows[0]; + if (!contract) return null; - const metadata = parseJsonSafe(contract.metadata, contract.metadata); - let image: string | undefined; + let tokenSample: { token_id?: string; metadata?: unknown } | undefined; + const requiresTokenFallback = + contract.metadata == null || contract.token_id == null; - if (fetchImages) { - const contractImageResolver = - resolveContractImage ?? defaultResolveContractImage; - const maybeImage = await contractImageResolver(contract as any, { - projectId, - }); - if (typeof maybeImage === "string" && maybeImage.length > 0) { - image = maybeImage; + if (requiresTokenFallback) { + try { + const tokenRows = await querySql( + projectId, + `SELECT token_id, metadata +FROM tokens +WHERE contract_address = '${escapeSqlValue(collection)}' +ORDER BY token_id +LIMIT 1`, + ); + tokenSample = tokenRows[0]; + } catch (_error) { + tokenSample = undefined; + } } - if (!image) image = inferImageFromMetadata(metadata); - } - return { - projectId, - address: getChecksumAddress( - String(contract.contract_address ?? collection), - ), - contractType: - String(contract.contract_type ?? contract.type ?? "ERC721") || "ERC721", - metadata, - totalSupply: asBigInt(contract.total_supply ?? "0x0"), - tokenIdSample: (contract.token_id as string | null | undefined) ?? null, - image, - raw: contract as any, - }; + const metadata = parseJsonSafe( + contract.metadata ?? tokenSample?.metadata, + contract.metadata ?? tokenSample?.metadata ?? null, + ); + let image: string | undefined; + + if (fetchImages) { + const contractImageResolver = + resolveContractImage ?? defaultResolveContractImage; + const maybeImage = await contractImageResolver(contract as any, { + projectId, + }); + if (typeof maybeImage === "string" && maybeImage.length > 0) { + image = maybeImage; + } + if (!image) image = inferImageFromMetadata(metadata); + } + + return { + projectId, + address: getChecksumAddress( + String(contract.contract_address ?? collection), + ), + contractType: + String(contract.contract_type ?? contract.type ?? "ERC721") || + "ERC721", + metadata, + totalSupply: asBigInt(contract.total_supply ?? "0x0"), + tokenIdSample: + (contract.token_id as string | null | undefined) ?? + (tokenSample?.token_id as string | null | undefined) ?? + null, + image, + raw: contract as any, + }; + } catch (_error) { + return null; + } }; const listCollectionTokens = async ( @@ -347,12 +401,8 @@ LIMIT 1`, const conditions = [`contract_address = '${escapeSqlValue(collection)}'`]; if (normalizedTokenIds.length > 0) { - const values = [ - ...new Set(normalizedTokenIds.map((value) => escapeSqlValue(value))), - ]; - conditions.push( - `token_id IN (${values.map((v) => `'${v}'`).join(", ")})`, - ); + const values = [...new Set(normalizedTokenIds)]; + conditions.push(buildChunkedInPredicate("token_id", values)); } if (cursorState.keysetTokenId) { diff --git a/packages/arcade-ts/src/marketplace/filters.test.ts b/packages/arcade-ts/src/marketplace/filters.test.ts index 9faf91d4..e91e5584 100644 --- a/packages/arcade-ts/src/marketplace/filters.test.ts +++ b/packages/arcade-ts/src/marketplace/filters.test.ts @@ -3,6 +3,7 @@ import { aggregateTraitMetadata, buildAvailableFilters, buildPrecomputedFilters, + fetchTraitNamesSummary, fetchTraitValues, fetchCollectionTraitMetadata, filterTokensByMetadata, @@ -215,13 +216,15 @@ describe("marketplace filters helpers", () => { }); const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; - expect(query).toContain("WITH filtered_tokens AS ("); + expect(query).toContain("collection_tokens AS ("); + expect(query).toContain("FROM tokens"); expect(query).toContain( - "WHERE token_id LIKE '0x0000000000000000000000000000000000000000000000000000000000000123:%'", + "WHERE contract_address = '0x0000000000000000000000000000000000000000000000000000000000000123'", ); expect(query).toContain( - "AND ((trait_name = 'Rarity' AND trait_value = 'Legendary') OR (trait_name = 'Background' AND trait_value = 'Gold'))", + "((trait_name = 'Rarity' AND trait_value = 'Legendary') OR (trait_name = 'Background' AND trait_value = 'Gold'))", ); + expect(query).not.toContain("token_id LIKE"); }); it("uses unique trait count when multiple values are selected for the same trait", async () => { @@ -263,4 +266,39 @@ describe("marketplace filters helpers", () => { expect(query).not.toContain("trait_name LIKE"); expect(query).not.toContain("trait_value LIKE"); }); + + it("scopes trait name summary queries using collection token joins", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + }); + + await fetchTraitNamesSummary({ + address: "0x123", + projects: ["arcade-main"], + }); + + const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(query).toContain("collection_tokens AS ("); + expect(query).toContain("JOIN collection_tokens ct"); + expect(query).not.toContain("token_id LIKE"); + }); + + it("scopes trait value queries without filters using collection token joins", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + }); + + await fetchTraitValues({ + address: "0x123", + traitName: "Background", + projects: ["arcade-main"], + }); + + const query = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(query).toContain("collection_tokens AS ("); + expect(query).toContain("JOIN collection_tokens ct"); + expect(query).not.toContain("token_id LIKE"); + }); }); diff --git a/packages/arcade-ts/src/marketplace/filters.ts b/packages/arcade-ts/src/marketplace/filters.ts index 46e2cb7d..73871644 100644 --- a/packages/arcade-ts/src/marketplace/filters.ts +++ b/packages/arcade-ts/src/marketplace/filters.ts @@ -125,36 +125,44 @@ const countDistinctTraitNames = (traits: TraitSelection[]): number => { return new Set(traits.map((trait) => trait.name)).size; }; -const buildFilteredTokenIdsQuery = ( - paddedAddress: string, - filters: TraitSelection[], -): string => { +const buildCollectionTokensCte = (address: string): string => { + const paddedAddress = addAddressPadding(address); + return `collection_tokens AS ( + SELECT token_id + FROM tokens + WHERE contract_address = '${escapeSqlValue(paddedAddress)}' +)`; +}; + +const buildFilteredTokenIdsQuery = (filters: TraitSelection[]): string => { if (filters.length === 0) { - return `SELECT DISTINCT token_id -FROM token_attributes -WHERE token_id LIKE '${paddedAddress}:%'`; + return `SELECT ct.token_id +FROM collection_tokens ct`; } const whereClause = buildTraitWhereClause(filters); const distinctTraitCount = countDistinctTraitNames(filters); - return `SELECT token_id -FROM token_attributes -WHERE token_id LIKE '${paddedAddress}:%' - AND ${whereClause} -GROUP BY token_id + return `SELECT ta.token_id +FROM token_attributes ta +JOIN collection_tokens ct + ON ta.token_id = ct.token_id +WHERE ${whereClause} +GROUP BY ta.token_id HAVING COUNT(DISTINCT trait_name) = ${distinctTraitCount}`; }; const buildTraitNamesSummaryQuery = (address: string): string => { - const paddedAddress = addAddressPadding(address); - return `SELECT - trait_name, - COUNT(DISTINCT trait_value) AS value_count, + const collectionTokensCte = buildCollectionTokensCte(address); + return `WITH ${collectionTokensCte} +SELECT + ta.trait_name, + COUNT(DISTINCT ta.trait_value) AS value_count, COUNT(*) AS total_count -FROM token_attributes -WHERE token_id LIKE '${paddedAddress}:%' -GROUP BY trait_name -ORDER BY trait_name`; +FROM token_attributes ta +JOIN collection_tokens ct + ON ta.token_id = ct.token_id +GROUP BY ta.trait_name +ORDER BY ta.trait_name`; }; const buildTraitValuesQuery = ({ @@ -166,23 +174,23 @@ const buildTraitValuesQuery = ({ traitName: string; otherTraitFilters?: TraitSelection[]; }): string => { - const paddedAddress = addAddressPadding(address); + const collectionTokensCte = buildCollectionTokensCte(address); const escapedTraitName = escapeSqlValue(traitName); if (otherTraitFilters.length === 0) { - return `SELECT trait_value, COUNT(*) as count -FROM token_attributes -WHERE token_id LIKE '${paddedAddress}:%' - AND trait_name = '${escapedTraitName}' -GROUP BY trait_value + return `WITH ${collectionTokensCte} +SELECT ta.trait_value, COUNT(*) as count +FROM token_attributes ta +JOIN collection_tokens ct + ON ta.token_id = ct.token_id +WHERE ta.trait_name = '${escapedTraitName}' +GROUP BY ta.trait_value ORDER BY count DESC`; } - const filteredTokenIds = buildFilteredTokenIdsQuery( - paddedAddress, - otherTraitFilters, - ); - return `WITH filtered_tokens AS ( + const filteredTokenIds = buildFilteredTokenIdsQuery(otherTraitFilters); + return `WITH ${collectionTokensCte}, +filtered_tokens AS ( ${filteredTokenIds} ) SELECT ta.trait_value, COUNT(*) AS count @@ -203,7 +211,7 @@ const buildExpandedTraitsMetadataQuery = ({ traitNames: string[]; otherTraitFilters?: TraitSelection[]; }): string => { - const paddedAddress = addAddressPadding(address); + const collectionTokensCte = buildCollectionTokensCte(address); if (traitNames.length === 0) { return "SELECT trait_name, trait_value, 0 as count WHERE 1 = 0"; @@ -214,19 +222,19 @@ const buildExpandedTraitsMetadataQuery = ({ .join(", "); if (otherTraitFilters.length === 0) { - return `SELECT trait_name, trait_value, COUNT(*) as count -FROM token_attributes -WHERE token_id LIKE '${paddedAddress}:%' - AND trait_name IN (${traitNamesCondition}) -GROUP BY trait_name, trait_value -ORDER BY trait_name, count DESC`; + return `WITH ${collectionTokensCte} +SELECT ta.trait_name, ta.trait_value, COUNT(*) as count +FROM token_attributes ta +JOIN collection_tokens ct + ON ta.token_id = ct.token_id +WHERE ta.trait_name IN (${traitNamesCondition}) +GROUP BY ta.trait_name, ta.trait_value +ORDER BY ta.trait_name, count DESC`; } - const filteredTokenIds = buildFilteredTokenIdsQuery( - paddedAddress, - otherTraitFilters, - ); - return `WITH filtered_tokens AS ( + const filteredTokenIds = buildFilteredTokenIdsQuery(otherTraitFilters); + return `WITH ${collectionTokensCte}, +filtered_tokens AS ( ${filteredTokenIds} ) SELECT ta.trait_name, ta.trait_value, COUNT(*) AS count @@ -245,9 +253,10 @@ const buildTraitMetadataQuery = ({ address: string; traits: TraitSelection[]; }): string => { - const paddedAddress = addAddressPadding(address); - const filteredTokenIds = buildFilteredTokenIdsQuery(paddedAddress, traits); - return `WITH filtered_tokens AS ( + const collectionTokensCte = buildCollectionTokensCte(address); + const filteredTokenIds = buildFilteredTokenIdsQuery(traits); + return `WITH ${collectionTokensCte}, +filtered_tokens AS ( ${filteredTokenIds} ) SELECT ta.trait_name, ta.trait_value, COUNT(*) AS count diff --git a/packages/arcade-ts/src/marketplace/utils.ts b/packages/arcade-ts/src/marketplace/utils.ts index 50397209..ad909e81 100644 --- a/packages/arcade-ts/src/marketplace/utils.ts +++ b/packages/arcade-ts/src/marketplace/utils.ts @@ -23,6 +23,11 @@ const IMAGE_CANDIDATE_KEYS = [ "animation_url", ] as const; +const DECIMAL_TOKEN_ID_PATTERN = /^[0-9]+$/; +const HEX_PREFIXED_TOKEN_ID_PATTERN = /^0x[0-9a-f]+$/i; +const BARE_HEX_TOKEN_ID_PATTERN = /^[0-9a-f]+$/i; +const HAS_HEX_ALPHA_PATTERN = /[a-f]/i; + export function ensureArray( value: AttributeFilterInputValue, ): Array { @@ -108,16 +113,36 @@ export function resolveProjects( return Array.from(new Set(projects.filter(Boolean))); } +export function canonicalizeTokenId(tokenId: string): string | null { + const normalized = tokenId.trim(); + if (!normalized) return null; + + try { + if (HEX_PREFIXED_TOKEN_ID_PATTERN.test(normalized)) { + return BigInt(normalized).toString(); + } + + if (DECIMAL_TOKEN_ID_PATTERN.test(normalized)) { + return BigInt(normalized).toString(); + } + + if ( + BARE_HEX_TOKEN_ID_PATTERN.test(normalized) && + HAS_HEX_ALPHA_PATTERN.test(normalized) + ) { + return BigInt(`0x${normalized}`).toString(); + } + + return BigInt(normalized).toString(); + } catch (_error) { + return normalized; + } +} + export function normalizeTokenIds(tokenIds?: string[]): string[] { if (!tokenIds || tokenIds.length === 0) return []; return tokenIds - .map((id) => { - try { - return BigInt(id).toString(); - } catch (_error) { - return id; - } - }) + .map((id) => canonicalizeTokenId(id)) .filter((id): id is string => typeof id === "string" && id.length > 0); } From a0d0e186bf7ebad12c134c6d2113df7d4de271d9 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 09:56:08 +1100 Subject: [PATCH 10/14] arcade-ts: optimize token/listing hot paths --- .../src/marketplace/client.edge.test.ts | 53 +++++++++++++++++++ .../arcade-ts/src/marketplace/client.edge.ts | 12 ++--- .../arcade-ts/src/marketplace/utils.test.ts | 46 ++++++++++++++++ packages/arcade-ts/src/marketplace/utils.ts | 7 ++- 4 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 packages/arcade-ts/src/marketplace/utils.test.ts diff --git a/packages/arcade-ts/src/marketplace/client.edge.test.ts b/packages/arcade-ts/src/marketplace/client.edge.test.ts index 8e4a36dd..2be3321b 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.test.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.test.ts @@ -397,4 +397,57 @@ describe("createEdgeMarketplaceClient", () => { expect(ownershipQueries.length).toBeGreaterThan(1); }); + + it("relies on SQL category and status filtering for verifyOwnership=false listings", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [ + { + id: 1, + category: 2, + status: 1, + expiration: 9999999999, + collection: "0xabc", + token_id: 1, + quantity: 1, + price: 1, + currency: "0x1", + owner: "0x123", + }, + { + id: 2, + category: 1, + status: 2, + expiration: 9999999999, + collection: "0xabc", + token_id: 2, + quantity: 1, + price: 1, + currency: "0x1", + owner: "0x123", + }, + ], + }, + ], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const listings = await client.listCollectionListings({ + collection: "0xabc", + verifyOwnership: false, + projectId: "arcade-main", + }); + + expect(listings).toHaveLength(2); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("category = 2"); + expect(sql).toContain("status = 1"); + }); }); diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index be5d4e07..8c817866 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -539,17 +539,11 @@ ORDER BY id DESC LIMIT ${effectiveLimit}`; projectId, ); - const filtered = baseOrders.filter( - (order) => - order.category.value === CategoryType.Sell && - order.status.value === StatusType.Placed, - ); - - if (options.verifyOwnership === false || filtered.length === 0) { - return filtered; + if (options.verifyOwnership === false || baseOrders.length === 0) { + return baseOrders; } - return verifyListingsOwnership(projectId, options.collection, filtered); + return verifyListingsOwnership(projectId, options.collection, baseOrders); }; const getToken = async ( diff --git a/packages/arcade-ts/src/marketplace/utils.test.ts b/packages/arcade-ts/src/marketplace/utils.test.ts new file mode 100644 index 00000000..35c71a13 --- /dev/null +++ b/packages/arcade-ts/src/marketplace/utils.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, it, vi } from "vitest"; + +const { mockedGetChecksumAddress } = vi.hoisted(() => ({ + mockedGetChecksumAddress: vi.fn((address: string) => `ck:${address}`), +})); + +vi.mock("starknet", async () => { + const actual = await vi.importActual("starknet"); + return { + ...actual, + getChecksumAddress: mockedGetChecksumAddress, + }; +}); + +import { normalizeTokens } from "./utils"; + +describe("marketplace utils", () => { + it("memoizes checksum resolution for repeated contract addresses", async () => { + mockedGetChecksumAddress.mockClear(); + + await normalizeTokens( + [ + { + contract_address: "0xabc", + token_id: "1", + metadata: "{}", + name: "", + symbol: "", + decimals: 0, + }, + { + contract_address: "0xabc", + token_id: "2", + metadata: "{}", + name: "", + symbol: "", + decimals: 0, + }, + ] as any, + "arcade-main", + { fetchImages: false }, + ); + + expect(mockedGetChecksumAddress).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/arcade-ts/src/marketplace/utils.ts b/packages/arcade-ts/src/marketplace/utils.ts index ad909e81..3df4eae2 100644 --- a/packages/arcade-ts/src/marketplace/utils.ts +++ b/packages/arcade-ts/src/marketplace/utils.ts @@ -156,10 +156,15 @@ export async function normalizeTokens( ): Promise { const { fetchImages, resolveTokenImage } = options; const resolver = resolveTokenImage ?? defaultResolveTokenImage; + const checksumByAddress = new Map(); const resolved = await Promise.all( tokens.map(async (token) => { - const checksumAddress = getChecksumAddress(token.contract_address); + let checksumAddress = checksumByAddress.get(token.contract_address); + if (!checksumAddress) { + checksumAddress = getChecksumAddress(token.contract_address); + checksumByAddress.set(token.contract_address, checksumAddress); + } const metadata = parseJsonSafe(token.metadata, token.metadata); let image: string | undefined; From 7772478695eb0c594ba4f1b57b74958f1468f26a Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 09:57:57 +1100 Subject: [PATCH 11/14] chore: add sql benchmark artifacts --- .artifacts/sql-benchmark/base-strong.json | 207 +++++++++++++++++++++ .artifacts/sql-benchmark/base-strong.md | 16 ++ .artifacts/sql-benchmark/base.json | 117 ++++++++++++ .artifacts/sql-benchmark/base.md | 16 ++ .artifacts/sql-benchmark/head-compare.json | 117 ++++++++++++ .artifacts/sql-benchmark/head-compare.md | 27 +++ .artifacts/sql-benchmark/head-strong.json | 207 +++++++++++++++++++++ .artifacts/sql-benchmark/head-strong.md | 16 ++ .artifacts/sql-benchmark/head.json | 117 ++++++++++++ .artifacts/sql-benchmark/head.md | 16 ++ 10 files changed, 856 insertions(+) create mode 100644 .artifacts/sql-benchmark/base-strong.json create mode 100644 .artifacts/sql-benchmark/base-strong.md create mode 100644 .artifacts/sql-benchmark/base.json create mode 100644 .artifacts/sql-benchmark/base.md create mode 100644 .artifacts/sql-benchmark/head-compare.json create mode 100644 .artifacts/sql-benchmark/head-compare.md create mode 100644 .artifacts/sql-benchmark/head-strong.json create mode 100644 .artifacts/sql-benchmark/head-strong.md create mode 100644 .artifacts/sql-benchmark/head.json create mode 100644 .artifacts/sql-benchmark/head.md diff --git a/.artifacts/sql-benchmark/base-strong.json b/.artifacts/sql-benchmark/base-strong.json new file mode 100644 index 00000000..01faf2a8 --- /dev/null +++ b/.artifacts/sql-benchmark/base-strong.json @@ -0,0 +1,207 @@ +{ + "generatedAt": "2026-02-22T22:54:59.805Z", + "projectId": "arcade-main", + "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", + "warmup": 3, + "iterations": 20, + "operations": [ + { + "name": "listCollectionTokens:first-page", + "samplesMs": [ + 1995.28, + 1501.24, + 1503.38, + 1446.17, + 2131.37, + 1472.24, + 2352.88, + 1535.47, + 1833.8, + 1411.04, + 2062.23, + 1580.57, + 1965.12, + 1577.92, + 1389.06, + 1421.9, + 1511, + 1429.48, + 1801.66, + 1361.46 + ], + "stats": { + "count": 20, + "minMs": 1361.46, + "maxMs": 2352.88, + "meanMs": 1664.16, + "p50Ms": 1511, + "p95Ms": 2131.37 + } + }, + { + "name": "listCollectionTokens:next-page", + "samplesMs": [ + 1647.13, + 2836.37, + 1438.96, + 1576.93, + 3200.86, + 2931.14, + 2338.94, + 4353.14, + 7439.6, + 2768.53, + 1468.95, + 2491.73, + 2385.96, + 2063.57, + 1374.61, + 3304.32, + 1340.33, + 1609.78, + 1507.36, + 1737.16 + ], + "stats": { + "count": 20, + "minMs": 1340.33, + "maxMs": 7439.6, + "meanMs": 2490.77, + "p50Ms": 2063.57, + "p95Ms": 4353.14 + } + }, + { + "name": "listCollectionTokens:attribute-filters", + "samplesMs": [ + 269.14, + 267.22, + 248.83, + 247.73, + 258.7, + 237.34, + 260.73, + 280.82, + 241.46, + 274.55, + 282.14, + 240.22, + 242.14, + 256.68, + 260.22, + 240.92, + 256.68, + 245.33, + 265.6, + 251.26 + ], + "stats": { + "count": 20, + "minMs": 237.34, + "maxMs": 282.14, + "meanMs": 256.39, + "p50Ms": 256.68, + "p95Ms": 280.82 + } + }, + { + "name": "getCollectionOrders", + "samplesMs": [ + 292.9, + 349.56, + 329.62, + 443.33, + 273.72, + 272.06, + 286.63, + 296.99, + 271.14, + 336.32, + 282.29, + 304.84, + 342.12, + 351.88, + 306.36, + 377.74, + 337.91, + 372.2, + 301.46, + 322.97 + ], + "stats": { + "count": 20, + "minMs": 271.14, + "maxMs": 443.33, + "meanMs": 322.6, + "p50Ms": 306.36, + "p95Ms": 377.74 + } + }, + { + "name": "listCollectionListings:verifyOwnership=false", + "samplesMs": [ + 365.9, + 366.62, + 312.59, + 329.52, + 313.09, + 282.68, + 284.3, + 279.26, + 334.12, + 274.08, + 337.22, + 327.74, + 294.43, + 274.17, + 286.97, + 305.18, + 260.88, + 269.59, + 373.3, + 303.77 + ], + "stats": { + "count": 20, + "minMs": 260.88, + "maxMs": 373.3, + "meanMs": 308.77, + "p50Ms": 303.77, + "p95Ms": 366.62 + } + }, + { + "name": "fetchTraitValues:beast id", + "samplesMs": [ + 281.78, + 244.38, + 241.64, + 248.39, + 247.26, + 229.08, + 237.24, + 257.78, + 245.49, + 271.99, + 239.82, + 248.23, + 323.17, + 304.83, + 236.83, + 261.9, + 255.46, + 238.17, + 258.92, + 248.3 + ], + "stats": { + "count": 20, + "minMs": 229.08, + "maxMs": 323.17, + "meanMs": 256.03, + "p50Ms": 248.23, + "p95Ms": 304.83 + } + } + ] +} \ No newline at end of file diff --git a/.artifacts/sql-benchmark/base-strong.md b/.artifacts/sql-benchmark/base-strong.md new file mode 100644 index 00000000..95c339f7 --- /dev/null +++ b/.artifacts/sql-benchmark/base-strong.md @@ -0,0 +1,16 @@ +## SQL Benchmark Report + +- Project: `arcade-main` +- Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` +- Generated: `2026-02-22T22:54:59.805Z` +- Warmup: `3` +- Iterations: `20` + +| Operation | p50 (ms) | p95 (ms) | mean (ms) | +| --- | ---: | ---: | ---: | +| listCollectionTokens:first-page | 1511 | 2131.37 | 1664.16 | +| listCollectionTokens:next-page | 2063.57 | 4353.14 | 2490.77 | +| listCollectionTokens:attribute-filters | 256.68 | 280.82 | 256.39 | +| getCollectionOrders | 306.36 | 377.74 | 322.6 | +| listCollectionListings:verifyOwnership=false | 303.77 | 366.62 | 308.77 | +| fetchTraitValues:beast id | 248.23 | 304.83 | 256.03 | \ No newline at end of file diff --git a/.artifacts/sql-benchmark/base.json b/.artifacts/sql-benchmark/base.json new file mode 100644 index 00000000..7b364b27 --- /dev/null +++ b/.artifacts/sql-benchmark/base.json @@ -0,0 +1,117 @@ +{ + "generatedAt": "2026-02-22T22:11:34.845Z", + "projectId": "arcade-main", + "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", + "warmup": 1, + "iterations": 5, + "operations": [ + { + "name": "listCollectionTokens:first-page", + "samplesMs": [ + 1397.08, + 1736.85, + 909.75, + 1825.89, + 1042.25 + ], + "stats": { + "count": 5, + "minMs": 909.75, + "maxMs": 1825.89, + "meanMs": 1382.36, + "p50Ms": 1397.08, + "p95Ms": 1825.89 + } + }, + { + "name": "listCollectionTokens:next-page", + "samplesMs": [ + 900.35, + 1870.32, + 853.78, + 1907.47, + 807.06 + ], + "stats": { + "count": 5, + "minMs": 807.06, + "maxMs": 1907.47, + "meanMs": 1267.8, + "p50Ms": 900.35, + "p95Ms": 1907.47 + } + }, + { + "name": "listCollectionTokens:attribute-filters", + "samplesMs": [ + 226.51, + 223.68, + 222.39, + 227.22, + 229.62 + ], + "stats": { + "count": 5, + "minMs": 222.39, + "maxMs": 229.62, + "meanMs": 225.88, + "p50Ms": 226.51, + "p95Ms": 229.62 + } + }, + { + "name": "getCollectionOrders", + "samplesMs": [ + 248.45, + 251.37, + 293.99, + 244.36, + 260.68 + ], + "stats": { + "count": 5, + "minMs": 244.36, + "maxMs": 293.99, + "meanMs": 259.77, + "p50Ms": 251.37, + "p95Ms": 293.99 + } + }, + { + "name": "listCollectionListings:verifyOwnership=false", + "samplesMs": [ + 275.68, + 358.47, + 263.02, + 266.63, + 253.18 + ], + "stats": { + "count": 5, + "minMs": 253.18, + "maxMs": 358.47, + "meanMs": 283.4, + "p50Ms": 266.63, + "p95Ms": 358.47 + } + }, + { + "name": "fetchTraitValues:beast id", + "samplesMs": [ + 236.25, + 228.37, + 219.75, + 250.3, + 232.37 + ], + "stats": { + "count": 5, + "minMs": 219.75, + "maxMs": 250.3, + "meanMs": 233.41, + "p50Ms": 232.37, + "p95Ms": 250.3 + } + } + ] +} \ No newline at end of file diff --git a/.artifacts/sql-benchmark/base.md b/.artifacts/sql-benchmark/base.md new file mode 100644 index 00000000..3581d076 --- /dev/null +++ b/.artifacts/sql-benchmark/base.md @@ -0,0 +1,16 @@ +## SQL Benchmark Report + +- Project: `arcade-main` +- Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` +- Generated: `2026-02-22T22:11:34.845Z` +- Warmup: `1` +- Iterations: `5` + +| Operation | p50 (ms) | p95 (ms) | mean (ms) | +| --- | ---: | ---: | ---: | +| listCollectionTokens:first-page | 1397.08 | 1825.89 | 1382.36 | +| listCollectionTokens:next-page | 900.35 | 1907.47 | 1267.8 | +| listCollectionTokens:attribute-filters | 226.51 | 229.62 | 225.88 | +| getCollectionOrders | 251.37 | 293.99 | 259.77 | +| listCollectionListings:verifyOwnership=false | 266.63 | 358.47 | 283.4 | +| fetchTraitValues:beast id | 232.37 | 250.3 | 233.41 | \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head-compare.json b/.artifacts/sql-benchmark/head-compare.json new file mode 100644 index 00000000..81789a5d --- /dev/null +++ b/.artifacts/sql-benchmark/head-compare.json @@ -0,0 +1,117 @@ +{ + "generatedAt": "2026-02-22T22:12:00.569Z", + "projectId": "arcade-main", + "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", + "warmup": 1, + "iterations": 5, + "operations": [ + { + "name": "listCollectionTokens:first-page", + "samplesMs": [ + 1980.76, + 1015.37, + 1811.09, + 1046.43, + 2000.73 + ], + "stats": { + "count": 5, + "minMs": 1015.37, + "maxMs": 2000.73, + "meanMs": 1570.88, + "p50Ms": 1811.09, + "p95Ms": 2000.73 + } + }, + { + "name": "listCollectionTokens:next-page", + "samplesMs": [ + 1868.71, + 1031.94, + 2094.58, + 763.02, + 1837.51 + ], + "stats": { + "count": 5, + "minMs": 763.02, + "maxMs": 2094.58, + "meanMs": 1519.15, + "p50Ms": 1837.51, + "p95Ms": 2094.58 + } + }, + { + "name": "listCollectionTokens:attribute-filters", + "samplesMs": [ + 217.57, + 218.38, + 221.56, + 225.41, + 222.8 + ], + "stats": { + "count": 5, + "minMs": 217.57, + "maxMs": 225.41, + "meanMs": 221.14, + "p50Ms": 221.56, + "p95Ms": 225.41 + } + }, + { + "name": "getCollectionOrders", + "samplesMs": [ + 345.23, + 243.88, + 410.91, + 243.3, + 264.79 + ], + "stats": { + "count": 5, + "minMs": 243.3, + "maxMs": 410.91, + "meanMs": 301.62, + "p50Ms": 264.79, + "p95Ms": 410.91 + } + }, + { + "name": "listCollectionListings:verifyOwnership=false", + "samplesMs": [ + 358.66, + 240.85, + 407.04, + 235.16, + 268.87 + ], + "stats": { + "count": 5, + "minMs": 235.16, + "maxMs": 407.04, + "meanMs": 302.12, + "p50Ms": 268.87, + "p95Ms": 407.04 + } + }, + { + "name": "fetchTraitValues:beast id", + "samplesMs": [ + 221.09, + 217.36, + 216.62, + 239.19, + 219.41 + ], + "stats": { + "count": 5, + "minMs": 216.62, + "maxMs": 239.19, + "meanMs": 222.73, + "p50Ms": 219.41, + "p95Ms": 239.19 + } + } + ] +} \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head-compare.md b/.artifacts/sql-benchmark/head-compare.md new file mode 100644 index 00000000..780485a0 --- /dev/null +++ b/.artifacts/sql-benchmark/head-compare.md @@ -0,0 +1,27 @@ +## SQL Benchmark Report + +- Project: `arcade-main` +- Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` +- Generated: `2026-02-22T22:12:00.569Z` +- Warmup: `1` +- Iterations: `5` + +| Operation | p50 (ms) | p95 (ms) | mean (ms) | +| --- | ---: | ---: | ---: | +| listCollectionTokens:first-page | 1811.09 | 2000.73 | 1570.88 | +| listCollectionTokens:next-page | 1837.51 | 2094.58 | 1519.15 | +| listCollectionTokens:attribute-filters | 221.56 | 225.41 | 221.14 | +| getCollectionOrders | 264.79 | 410.91 | 301.62 | +| listCollectionListings:verifyOwnership=false | 268.87 | 407.04 | 302.12 | +| fetchTraitValues:beast id | 219.41 | 239.19 | 222.73 | + +### Base vs Head + +| Operation | base p50 | head p50 | delta p50 | base p95 | head p95 | delta p95 | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | +| listCollectionTokens:first-page | 1397.08 | 1811.09 | +29.63% | 1825.89 | 2000.73 | +9.58% | +| listCollectionTokens:next-page | 900.35 | 1837.51 | +104.09% | 1907.47 | 2094.58 | +9.81% | +| listCollectionTokens:attribute-filters | 226.51 | 221.56 | -2.19% | 229.62 | 225.41 | -1.83% | +| getCollectionOrders | 251.37 | 264.79 | +5.34% | 293.99 | 410.91 | +39.77% | +| listCollectionListings:verifyOwnership=false | 266.63 | 268.87 | +0.84% | 358.47 | 407.04 | +13.55% | +| fetchTraitValues:beast id | 232.37 | 219.41 | -5.58% | 250.3 | 239.19 | -4.44% | \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head-strong.json b/.artifacts/sql-benchmark/head-strong.json new file mode 100644 index 00000000..6eedbe85 --- /dev/null +++ b/.artifacts/sql-benchmark/head-strong.json @@ -0,0 +1,207 @@ +{ + "generatedAt": "2026-02-22T22:19:31.489Z", + "projectId": "arcade-main", + "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", + "warmup": 3, + "iterations": 20, + "operations": [ + { + "name": "listCollectionTokens:first-page", + "samplesMs": [ + 1702.86, + 1321.7, + 1828.58, + 971.92, + 1161.59, + 879.07, + 1663.42, + 1472.46, + 1661.7, + 1498.43, + 704.62, + 714.83, + 1778.17, + 705.73, + 868.2, + 1342.85, + 706.49, + 720, + 1805.74, + 758.61 + ], + "stats": { + "count": 20, + "minMs": 704.62, + "maxMs": 1828.58, + "meanMs": 1213.35, + "p50Ms": 1161.59, + "p95Ms": 1805.74 + } + }, + { + "name": "listCollectionTokens:next-page", + "samplesMs": [ + 720.9, + 1441.42, + 694.77, + 706.4, + 1315.71, + 708.74, + 701.18, + 1804.77, + 1502.77, + 707.88, + 715.18, + 702.06, + 706.11, + 691.79, + 724.38, + 698.26, + 700.93, + 1746.92, + 727.48, + 710.61 + ], + "stats": { + "count": 20, + "minMs": 691.79, + "maxMs": 1804.77, + "meanMs": 921.41, + "p50Ms": 708.74, + "p95Ms": 1746.92 + } + }, + { + "name": "listCollectionTokens:attribute-filters", + "samplesMs": [ + 217.9, + 218.48, + 217.83, + 217.77, + 247.12, + 221.41, + 216.61, + 228.54, + 223.55, + 218.95, + 217.51, + 218.48, + 217.73, + 219.89, + 218.61, + 217.76, + 219.8, + 234.97, + 217.42, + 243.64 + ], + "stats": { + "count": 20, + "minMs": 216.61, + "maxMs": 247.12, + "meanMs": 222.7, + "p50Ms": 218.48, + "p95Ms": 243.64 + } + }, + { + "name": "getCollectionOrders", + "samplesMs": [ + 243.3, + 294.53, + 247.98, + 353.54, + 244.69, + 247.74, + 244.94, + 248.43, + 257.95, + 283.29, + 246.01, + 243.44, + 245.64, + 246.41, + 246.89, + 253.74, + 266.28, + 243.3, + 251.46, + 249.62 + ], + "stats": { + "count": 20, + "minMs": 243.3, + "maxMs": 353.54, + "meanMs": 257.96, + "p50Ms": 247.74, + "p95Ms": 294.53 + } + }, + { + "name": "listCollectionListings:verifyOwnership=false", + "samplesMs": [ + 237.79, + 243.32, + 302.48, + 242.36, + 241.12, + 238.2, + 254.7, + 240.55, + 239.31, + 237.54, + 430.13, + 240.88, + 320.45, + 238.35, + 397.08, + 242.3, + 237.92, + 250.41, + 294.45, + 238.57 + ], + "stats": { + "count": 20, + "minMs": 237.54, + "maxMs": 430.13, + "meanMs": 268.4, + "p50Ms": 241.12, + "p95Ms": 397.08 + } + }, + { + "name": "fetchTraitValues:beast id", + "samplesMs": [ + 216.48, + 220.09, + 218.88, + 225.99, + 218.07, + 217.85, + 217.33, + 217.61, + 216.44, + 217.64, + 220.06, + 222.56, + 219.33, + 215.19, + 224.44, + 217.83, + 218.03, + 219.72, + 218.23, + 220.25 + ], + "stats": { + "count": 20, + "minMs": 215.19, + "maxMs": 225.99, + "meanMs": 219.1, + "p50Ms": 218.07, + "p95Ms": 224.44 + } + } + ] +} \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head-strong.md b/.artifacts/sql-benchmark/head-strong.md new file mode 100644 index 00000000..01d2552a --- /dev/null +++ b/.artifacts/sql-benchmark/head-strong.md @@ -0,0 +1,16 @@ +## SQL Benchmark Report + +- Project: `arcade-main` +- Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` +- Generated: `2026-02-22T22:19:31.489Z` +- Warmup: `3` +- Iterations: `20` + +| Operation | p50 (ms) | p95 (ms) | mean (ms) | +| --- | ---: | ---: | ---: | +| listCollectionTokens:first-page | 1161.59 | 1805.74 | 1213.35 | +| listCollectionTokens:next-page | 708.74 | 1746.92 | 921.41 | +| listCollectionTokens:attribute-filters | 218.48 | 243.64 | 222.7 | +| getCollectionOrders | 247.74 | 294.53 | 257.96 | +| listCollectionListings:verifyOwnership=false | 241.12 | 397.08 | 268.4 | +| fetchTraitValues:beast id | 218.07 | 224.44 | 219.1 | \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head.json b/.artifacts/sql-benchmark/head.json new file mode 100644 index 00000000..c0fd73fd --- /dev/null +++ b/.artifacts/sql-benchmark/head.json @@ -0,0 +1,117 @@ +{ + "generatedAt": "2026-02-22T22:08:19.338Z", + "projectId": "arcade-main", + "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", + "warmup": 1, + "iterations": 5, + "operations": [ + { + "name": "listCollectionTokens:first-page", + "samplesMs": [ + 2901.5, + 1937.87, + 3123.66, + 1911.57, + 2305.36 + ], + "stats": { + "count": 5, + "minMs": 1911.57, + "maxMs": 3123.66, + "meanMs": 2435.99, + "p50Ms": 2305.36, + "p95Ms": 3123.66 + } + }, + { + "name": "listCollectionTokens:next-page", + "samplesMs": [ + 1826.39, + 956.93, + 1082.47, + 787.28, + 1729.39 + ], + "stats": { + "count": 5, + "minMs": 787.28, + "maxMs": 1826.39, + "meanMs": 1276.49, + "p50Ms": 1082.47, + "p95Ms": 1826.39 + } + }, + { + "name": "listCollectionTokens:attribute-filters", + "samplesMs": [ + 225.09, + 238.99, + 283.47, + 237.76, + 230.43 + ], + "stats": { + "count": 5, + "minMs": 225.09, + "maxMs": 283.47, + "meanMs": 243.15, + "p50Ms": 237.76, + "p95Ms": 283.47 + } + }, + { + "name": "getCollectionOrders", + "samplesMs": [ + 297.88, + 283.2, + 271.02, + 252.66, + 329.6 + ], + "stats": { + "count": 5, + "minMs": 252.66, + "maxMs": 329.6, + "meanMs": 286.87, + "p50Ms": 283.2, + "p95Ms": 329.6 + } + }, + { + "name": "listCollectionListings:verifyOwnership=false", + "samplesMs": [ + 349.91, + 275.41, + 260.89, + 258.94, + 316.09 + ], + "stats": { + "count": 5, + "minMs": 258.94, + "maxMs": 349.91, + "meanMs": 292.25, + "p50Ms": 275.41, + "p95Ms": 349.91 + } + }, + { + "name": "fetchTraitValues:beast id", + "samplesMs": [ + 264.28, + 241.67, + 228.59, + 222.28, + 224.45 + ], + "stats": { + "count": 5, + "minMs": 222.28, + "maxMs": 264.28, + "meanMs": 236.25, + "p50Ms": 228.59, + "p95Ms": 264.28 + } + } + ] +} \ No newline at end of file diff --git a/.artifacts/sql-benchmark/head.md b/.artifacts/sql-benchmark/head.md new file mode 100644 index 00000000..20f8b481 --- /dev/null +++ b/.artifacts/sql-benchmark/head.md @@ -0,0 +1,16 @@ +## SQL Benchmark Report + +- Project: `arcade-main` +- Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` +- Generated: `2026-02-22T22:08:19.338Z` +- Warmup: `1` +- Iterations: `5` + +| Operation | p50 (ms) | p95 (ms) | mean (ms) | +| --- | ---: | ---: | ---: | +| listCollectionTokens:first-page | 2305.36 | 3123.66 | 2435.99 | +| listCollectionTokens:next-page | 1082.47 | 1826.39 | 1276.49 | +| listCollectionTokens:attribute-filters | 237.76 | 283.47 | 243.15 | +| getCollectionOrders | 283.2 | 329.6 | 286.87 | +| listCollectionListings:verifyOwnership=false | 275.41 | 349.91 | 292.25 | +| fetchTraitValues:beast id | 228.59 | 264.28 | 236.25 | \ No newline at end of file From bc01b3f58c0a8bd07caaf2a3d648241f20272a6f Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 10:05:18 +1100 Subject: [PATCH 12/14] fix: make sql benchmark script compatible with older base dist exports --- .../scripts/sql-benchmark-helpers.mjs | 219 ++++++++++++++++++ packages/arcade-ts/scripts/sql-benchmark.mjs | 13 +- .../marketplace/sql-benchmark-helpers.test.ts | 37 +++ 3 files changed, 263 insertions(+), 6 deletions(-) create mode 100644 packages/arcade-ts/scripts/sql-benchmark-helpers.mjs create mode 100644 packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts diff --git a/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs b/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs new file mode 100644 index 00000000..9829edc6 --- /dev/null +++ b/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs @@ -0,0 +1,219 @@ +const round = (value, precision = 2) => { + const factor = 10 ** precision; + return Math.round(value * factor) / factor; +}; + +const percentile = (sorted, p) => { + if (!sorted.length) return 0; + if (sorted.length === 1) return sorted[0]; + const index = Math.ceil((p / 100) * sorted.length) - 1; + const boundedIndex = Math.min(sorted.length - 1, Math.max(0, index)); + return sorted[boundedIndex]; +}; + +const computeBenchmarkStats = (samplesMs) => { + if (!samplesMs.length) { + throw new Error("Cannot compute benchmark stats with zero samples"); + } + + const sorted = [...samplesMs].sort((a, b) => a - b); + const total = sorted.reduce((sum, value) => sum + value, 0); + + return { + count: sorted.length, + minMs: round(sorted[0]), + maxMs: round(sorted[sorted.length - 1]), + meanMs: round(total / sorted.length), + p50Ms: round(percentile(sorted, 50)), + p95Ms: round(percentile(sorted, 95)), + }; +}; + +const normalizeErrorMessage = (error) => { + if (error instanceof Error) return error.message; + if (typeof error === "string") return error; + return String(error); +}; + +const withTimeout = async (promise, timeoutMs) => { + if (!timeoutMs || timeoutMs <= 0) { + return promise; + } + + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + reject(new Error(`Operation timed out after ${timeoutMs}ms`)); + }, timeoutMs); + + promise + .then((value) => resolve(value)) + .catch((error) => reject(error)) + .finally(() => clearTimeout(timer)); + }); +}; + +export const fallbackRunBenchmarkOperation = async (options) => { + const { + name, + warmup, + iterations, + timeoutMs, + execute, + now = () => Date.now(), + } = options; + + try { + let lastResult; + + for (let index = 0; index < warmup; index += 1) { + lastResult = await withTimeout(execute(), timeoutMs); + } + + const samplesMs = []; + for (let index = 0; index < iterations; index += 1) { + const startedAt = now(); + lastResult = await withTimeout(execute(), timeoutMs); + samplesMs.push(round(now() - startedAt)); + } + + return { + result: { + name, + samplesMs, + stats: computeBenchmarkStats(samplesMs), + }, + lastResult, + }; + } catch (error) { + return { + failure: { + name, + error: normalizeErrorMessage(error), + }, + }; + } +}; + +const percentDelta = (base, head) => { + if (base === 0) return 0; + return round(((head - base) / base) * 100); +}; + +export const fallbackCompareBenchmarkReports = (base, head) => { + const baseByName = new Map(base.operations.map((op) => [op.name, op])); + const rows = []; + + for (const operation of head.operations) { + const baseOp = baseByName.get(operation.name); + if (!baseOp) continue; + + rows.push({ + name: operation.name, + baseP50Ms: baseOp.stats.p50Ms, + headP50Ms: operation.stats.p50Ms, + deltaP50Pct: percentDelta(baseOp.stats.p50Ms, operation.stats.p50Ms), + baseP95Ms: baseOp.stats.p95Ms, + headP95Ms: operation.stats.p95Ms, + deltaP95Pct: percentDelta(baseOp.stats.p95Ms, operation.stats.p95Ms), + }); + } + + return rows; +}; + +const formatDelta = (value) => { + const signed = value > 0 ? `+${value}` : `${value}`; + return `${signed}%`; +}; + +const escapeTableCell = (value) => + value.replace(/\|/g, "\\|").replace(/\r?\n/g, " "); + +export const fallbackRenderBenchmarkMarkdown = ( + report, + comparison = [], +) => { + const lines = []; + lines.push("## SQL Benchmark Report"); + lines.push(""); + lines.push(`- Project: \`${report.projectId}\``); + lines.push(`- Collection: \`${report.collectionAddress}\``); + lines.push(`- Generated: \`${report.generatedAt}\``); + lines.push(`- Warmup: \`${report.warmup}\``); + lines.push(`- Iterations: \`${report.iterations}\``); + lines.push(""); + lines.push("| Operation | p50 (ms) | p95 (ms) | mean (ms) |"); + lines.push("| --- | ---: | ---: | ---: |"); + for (const operation of report.operations) { + lines.push( + `| ${operation.name} | ${operation.stats.p50Ms} | ${operation.stats.p95Ms} | ${operation.stats.meanMs} |`, + ); + } + + if (report.failures && report.failures.length > 0) { + lines.push(""); + lines.push("### Failed Operations"); + lines.push(""); + lines.push("| Operation | Error |"); + lines.push("| --- | --- |"); + for (const failure of report.failures) { + lines.push( + `| ${escapeTableCell(failure.name)} | ${escapeTableCell( + failure.error, + )} |`, + ); + } + } + + if (comparison.length > 0) { + lines.push(""); + lines.push("### Base vs Head"); + lines.push(""); + lines.push( + "| Operation | base p50 | head p50 | delta p50 | base p95 | head p95 | delta p95 |", + ); + lines.push("| --- | ---: | ---: | ---: | ---: | ---: | ---: |"); + for (const row of comparison) { + lines.push( + `| ${row.name} | ${row.baseP50Ms} | ${row.headP50Ms} | ${formatDelta( + row.deltaP50Pct, + )} | ${row.baseP95Ms} | ${row.headP95Ms} | ${formatDelta( + row.deltaP95Pct, + )} |`, + ); + } + } + + return lines.join("\n"); +}; + +export const resolveBenchmarkHelpers = (marketplace) => { + const { createMarketplaceClient, fetchCollectionTraitMetadata, fetchTraitValues } = + marketplace ?? {}; + + if (!createMarketplaceClient) { + throw new Error("createMarketplaceClient export was not found"); + } + + const runBenchmarkOperation = + marketplace?.runBenchmarkOperation ?? fallbackRunBenchmarkOperation; + const compareBenchmarkReports = + marketplace?.compareBenchmarkReports ?? fallbackCompareBenchmarkReports; + const renderBenchmarkMarkdown = + marketplace?.renderBenchmarkMarkdown ?? fallbackRenderBenchmarkMarkdown; + + const usingFallbackHelpers = + !marketplace?.runBenchmarkOperation || + !marketplace?.compareBenchmarkReports || + !marketplace?.renderBenchmarkMarkdown; + + return { + createMarketplaceClient, + fetchCollectionTraitMetadata, + fetchTraitValues, + runBenchmarkOperation, + compareBenchmarkReports, + renderBenchmarkMarkdown, + usingFallbackHelpers, + }; +}; diff --git a/packages/arcade-ts/scripts/sql-benchmark.mjs b/packages/arcade-ts/scripts/sql-benchmark.mjs index 89476ee5..151bc260 100644 --- a/packages/arcade-ts/scripts/sql-benchmark.mjs +++ b/packages/arcade-ts/scripts/sql-benchmark.mjs @@ -5,6 +5,7 @@ import path from "node:path"; import { performance } from "node:perf_hooks"; import { pathToFileURL } from "node:url"; import { constants } from "starknet"; +import { resolveBenchmarkHelpers } from "./sql-benchmark-helpers.mjs"; const DEFAULT_COLLECTION = "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4"; @@ -134,13 +135,13 @@ const main = async () => { runBenchmarkOperation, compareBenchmarkReports, renderBenchmarkMarkdown, - } = marketplace; + usingFallbackHelpers, + } = resolveBenchmarkHelpers(marketplace); - if (!createMarketplaceClient) { - throw new Error("createMarketplaceClient export was not found"); - } - if (!runBenchmarkOperation) { - throw new Error("runBenchmarkOperation export was not found"); + if (usingFallbackHelpers) { + console.warn( + "[benchmark] dist module missing benchmark helper exports, using script fallbacks", + ); } const client = await createMarketplaceClient({ diff --git a/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts b/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts new file mode 100644 index 00000000..9b619121 --- /dev/null +++ b/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from "vitest"; + +describe("sql benchmark helper resolution", () => { + it("provides fallback benchmark helpers when dist module is missing them", async () => { + const helpersUrl = new URL( + "../../scripts/sql-benchmark-helpers.mjs", + import.meta.url, + ); + const { resolveBenchmarkHelpers } = await import(helpersUrl.href); + + const resolved = resolveBenchmarkHelpers({ + createMarketplaceClient: async () => ({}), + }); + + expect(resolved.createMarketplaceClient).toBeTypeOf("function"); + expect(resolved.runBenchmarkOperation).toBeTypeOf("function"); + expect(resolved.compareBenchmarkReports).toBeTypeOf("function"); + expect(resolved.renderBenchmarkMarkdown).toBeTypeOf("function"); + + const outcome = await resolved.runBenchmarkOperation({ + name: "op", + warmup: 0, + iterations: 1, + execute: async () => ({ ok: true }), + now: (() => { + let n = 0; + return () => { + n += 5; + return n; + }; + })(), + }); + + expect(outcome.result?.name).toBe("op"); + expect(outcome.result?.stats.count).toBe(1); + }); +}); From dfc4a98a7ee4a37c8e506ab3128c71573fd3dcf3 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 11:29:45 +1100 Subject: [PATCH 13/14] Implement deferred metadata listing and benchmark regression gates --- .artifacts/sql-benchmark/head.json | 236 ++++++++++---- .artifacts/sql-benchmark/head.md | 20 +- .github/workflows/benchmark-sql.yml | 27 ++ ...-metadata-preserving-listing-sprint.prd.md | 290 ++++++++++++++++++ .../scripts/sql-benchmark-helpers.mjs | 42 +++ packages/arcade-ts/scripts/sql-benchmark.mjs | 187 ++++++++--- packages/arcade-ts/src/marketplace/README.md | 45 +++ .../src/marketplace/benchmark.test.ts | 81 +++++ .../arcade-ts/src/marketplace/benchmark.ts | 52 ++++ .../arcade-ts/src/marketplace/client.dojo.ts | 43 +++ .../src/marketplace/client.edge.test.ts | 118 +++++++ .../arcade-ts/src/marketplace/client.edge.ts | 64 +++- .../arcade-ts/src/marketplace/react.test.tsx | 1 + .../marketplace/sql-benchmark-helpers.test.ts | 1 + packages/arcade-ts/src/marketplace/types.ts | 11 + 15 files changed, 1108 insertions(+), 110 deletions(-) create mode 100644 packages/arcade-ts/docs/sql-metadata-preserving-listing-sprint.prd.md diff --git a/.artifacts/sql-benchmark/head.json b/.artifacts/sql-benchmark/head.json index c0fd73fd..c94bf7a1 100644 --- a/.artifacts/sql-benchmark/head.json +++ b/.artifacts/sql-benchmark/head.json @@ -1,116 +1,224 @@ { - "generatedAt": "2026-02-22T22:08:19.338Z", + "generatedAt": "2026-02-23T00:27:59.247Z", "projectId": "arcade-main", "collectionAddress": "0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4", "warmup": 1, "iterations": 5, "operations": [ { - "name": "listCollectionTokens:first-page", + "name": "getCollection", "samplesMs": [ - 2901.5, - 1937.87, - 3123.66, - 1911.57, - 2305.36 + 413.37, + 265.24, + 239.4, + 243.34, + 253.98 ], "stats": { "count": 5, - "minMs": 1911.57, - "maxMs": 3123.66, - "meanMs": 2435.99, - "p50Ms": 2305.36, - "p95Ms": 3123.66 + "minMs": 239.4, + "maxMs": 413.37, + "meanMs": 283.07, + "p50Ms": 253.98, + "p95Ms": 413.37 } }, { - "name": "listCollectionTokens:next-page", + "name": "listCollectionTokens:first-page:eager", "samplesMs": [ - 1826.39, - 956.93, - 1082.47, - 787.28, - 1729.39 + 1972.51, + 1737.69, + 1567.52, + 1823.13, + 1980.78 ], "stats": { "count": 5, - "minMs": 787.28, - "maxMs": 1826.39, - "meanMs": 1276.49, - "p50Ms": 1082.47, - "p95Ms": 1826.39 + "minMs": 1567.52, + "maxMs": 1980.78, + "meanMs": 1816.33, + "p50Ms": 1823.13, + "p95Ms": 1980.78 } }, { - "name": "listCollectionTokens:attribute-filters", + "name": "listCollectionTokens:next-page:eager", "samplesMs": [ - 225.09, - 238.99, - 283.47, - 237.76, - 230.43 + 1918.12, + 1825.4, + 1567.17, + 1841.87, + 1503.16 ], "stats": { "count": 5, - "minMs": 225.09, - "maxMs": 283.47, - "meanMs": 243.15, - "p50Ms": 237.76, - "p95Ms": 283.47 + "minMs": 1503.16, + "maxMs": 1918.12, + "meanMs": 1731.14, + "p50Ms": 1825.4, + "p95Ms": 1918.12 + } + }, + { + "name": "listCollectionTokens:attribute-filters:eager", + "samplesMs": [ + 234.02, + 240.87, + 252.03, + 248.14, + 275.03 + ], + "stats": { + "count": 5, + "minMs": 234.02, + "maxMs": 275.03, + "meanMs": 250.02, + "p50Ms": 248.14, + "p95Ms": 275.03 + } + }, + { + "name": "listCollectionTokens:first-page:deferred", + "samplesMs": [ + 251.48, + 269.44, + 258.23, + 285.79, + 292.5 + ], + "stats": { + "count": 5, + "minMs": 251.48, + "maxMs": 292.5, + "meanMs": 271.49, + "p50Ms": 269.44, + "p95Ms": 292.5 + } + }, + { + "name": "listCollectionTokens:next-page:deferred", + "samplesMs": [ + 260.31, + 260.12, + 297.95, + 264.29, + 258.07 + ], + "stats": { + "count": 5, + "minMs": 258.07, + "maxMs": 297.95, + "meanMs": 268.15, + "p50Ms": 260.31, + "p95Ms": 297.95 + } + }, + { + "name": "listCollectionTokens:attribute-filters:deferred", + "samplesMs": [ + 238.79, + 243.81, + 245.82, + 246.28, + 231.81 + ], + "stats": { + "count": 5, + "minMs": 231.81, + "maxMs": 246.28, + "meanMs": 241.3, + "p50Ms": 243.81, + "p95Ms": 246.28 } }, { "name": "getCollectionOrders", "samplesMs": [ - 297.88, - 283.2, - 271.02, - 252.66, - 329.6 + 276.46, + 283.34, + 263.46, + 270.94, + 274.84 ], "stats": { "count": 5, - "minMs": 252.66, - "maxMs": 329.6, - "meanMs": 286.87, - "p50Ms": 283.2, - "p95Ms": 329.6 + "minMs": 263.46, + "maxMs": 283.34, + "meanMs": 273.81, + "p50Ms": 274.84, + "p95Ms": 283.34 } }, { "name": "listCollectionListings:verifyOwnership=false", "samplesMs": [ - 349.91, - 275.41, - 260.89, - 258.94, - 316.09 + 264.37, + 330.38, + 279.5, + 262.1, + 415.67 + ], + "stats": { + "count": 5, + "minMs": 262.1, + "maxMs": 415.67, + "meanMs": 310.4, + "p50Ms": 279.5, + "p95Ms": 415.67 + } + }, + { + "name": "listCollectionListings:verifyOwnership=true", + "samplesMs": [ + 523.32, + 510.16, + 533.3, + 529.26, + 601.69 + ], + "stats": { + "count": 5, + "minMs": 510.16, + "maxMs": 601.69, + "meanMs": 539.55, + "p50Ms": 529.26, + "p95Ms": 601.69 + } + }, + { + "name": "fetchCollectionTraitMetadata", + "samplesMs": [ + 272.62, + 263.1, + 265.88, + 275.31, + 272.92 ], "stats": { "count": 5, - "minMs": 258.94, - "maxMs": 349.91, - "meanMs": 292.25, - "p50Ms": 275.41, - "p95Ms": 349.91 + "minMs": 263.1, + "maxMs": 275.31, + "meanMs": 269.97, + "p50Ms": 272.62, + "p95Ms": 275.31 } }, { "name": "fetchTraitValues:beast id", "samplesMs": [ - 264.28, - 241.67, - 228.59, - 222.28, - 224.45 + 244.28, + 234.24, + 251.52, + 241.34, + 247.06 ], "stats": { "count": 5, - "minMs": 222.28, - "maxMs": 264.28, - "meanMs": 236.25, - "p50Ms": 228.59, - "p95Ms": 264.28 + "minMs": 234.24, + "maxMs": 251.52, + "meanMs": 243.69, + "p50Ms": 244.28, + "p95Ms": 251.52 } } ] diff --git a/.artifacts/sql-benchmark/head.md b/.artifacts/sql-benchmark/head.md index 20f8b481..13b37a7f 100644 --- a/.artifacts/sql-benchmark/head.md +++ b/.artifacts/sql-benchmark/head.md @@ -2,15 +2,21 @@ - Project: `arcade-main` - Collection: `0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4` -- Generated: `2026-02-22T22:08:19.338Z` +- Generated: `2026-02-23T00:27:59.247Z` - Warmup: `1` - Iterations: `5` | Operation | p50 (ms) | p95 (ms) | mean (ms) | | --- | ---: | ---: | ---: | -| listCollectionTokens:first-page | 2305.36 | 3123.66 | 2435.99 | -| listCollectionTokens:next-page | 1082.47 | 1826.39 | 1276.49 | -| listCollectionTokens:attribute-filters | 237.76 | 283.47 | 243.15 | -| getCollectionOrders | 283.2 | 329.6 | 286.87 | -| listCollectionListings:verifyOwnership=false | 275.41 | 349.91 | 292.25 | -| fetchTraitValues:beast id | 228.59 | 264.28 | 236.25 | \ No newline at end of file +| getCollection | 253.98 | 413.37 | 283.07 | +| listCollectionTokens:first-page:eager | 1823.13 | 1980.78 | 1816.33 | +| listCollectionTokens:next-page:eager | 1825.4 | 1918.12 | 1731.14 | +| listCollectionTokens:attribute-filters:eager | 248.14 | 275.03 | 250.02 | +| listCollectionTokens:first-page:deferred | 269.44 | 292.5 | 271.49 | +| listCollectionTokens:next-page:deferred | 260.31 | 297.95 | 268.15 | +| listCollectionTokens:attribute-filters:deferred | 243.81 | 246.28 | 241.3 | +| getCollectionOrders | 274.84 | 283.34 | 273.81 | +| listCollectionListings:verifyOwnership=false | 279.5 | 415.67 | 310.4 | +| listCollectionListings:verifyOwnership=true | 529.26 | 601.69 | 539.55 | +| fetchCollectionTraitMetadata | 272.62 | 275.31 | 269.97 | +| fetchTraitValues:beast id | 244.28 | 251.52 | 243.69 | \ No newline at end of file diff --git a/.github/workflows/benchmark-sql.yml b/.github/workflows/benchmark-sql.yml index 36708dfc..174d3e8b 100644 --- a/.github/workflows/benchmark-sql.yml +++ b/.github/workflows/benchmark-sql.yml @@ -45,6 +45,18 @@ on: description: "Fail workflow when one benchmark operation errors" required: false default: "false" + fail_on_deferred_regression: + description: "Fail workflow when deferred benchmark regressions exceed threshold" + required: false + default: "false" + deferred_max_p95_delta_pct: + description: "Max allowed deferred p95 delta (%) vs baseline" + required: false + default: "10" + eager_max_p95_delta_pct: + description: "Max allowed eager p95 delta (%) vs baseline" + required: false + default: "10" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -82,6 +94,9 @@ jobs: TIMEOUT_INPUT: ${{ github.event.inputs.operation_timeout_ms }} OPTIONAL_OPS_INPUT: ${{ github.event.inputs.include_optional_ops }} FAIL_FAST_INPUT: ${{ github.event.inputs.fail_on_operation_error }} + FAIL_DEFERRED_INPUT: ${{ github.event.inputs.fail_on_deferred_regression }} + DEFERRED_DELTA_INPUT: ${{ github.event.inputs.deferred_max_p95_delta_pct }} + EAGER_DELTA_INPUT: ${{ github.event.inputs.eager_max_p95_delta_pct }} run: | project_id="${PROJECT_ID_INPUT:-arcade-main}" collection_address="${COLLECTION_INPUT:-0x046da8955829adf2bda310099a0063451923f02e648cf25a1203aac6335cf0e4}" @@ -92,6 +107,9 @@ jobs: operation_timeout_ms="${TIMEOUT_INPUT:-15000}" include_optional_ops="${OPTIONAL_OPS_INPUT:-false}" fail_on_operation_error="${FAIL_FAST_INPUT:-false}" + fail_on_deferred_regression="${FAIL_DEFERRED_INPUT:-false}" + deferred_max_p95_delta_pct="${DEFERRED_DELTA_INPUT:-10}" + eager_max_p95_delta_pct="${EAGER_DELTA_INPUT:-10}" mkdir -p .artifacts/sql-benchmark @@ -104,6 +122,9 @@ jobs: echo "operation_timeout_ms=${operation_timeout_ms}" >> "$GITHUB_OUTPUT" echo "include_optional_ops=${include_optional_ops}" >> "$GITHUB_OUTPUT" echo "fail_on_operation_error=${fail_on_operation_error}" >> "$GITHUB_OUTPUT" + echo "fail_on_deferred_regression=${fail_on_deferred_regression}" >> "$GITHUB_OUTPUT" + echo "deferred_max_p95_delta_pct=${deferred_max_p95_delta_pct}" >> "$GITHUB_OUTPUT" + echo "eager_max_p95_delta_pct=${eager_max_p95_delta_pct}" >> "$GITHUB_OUTPUT" - name: Benchmark pull request base if: github.event_name == 'pull_request' @@ -118,6 +139,9 @@ jobs: BENCH_OPERATION_TIMEOUT_MS: ${{ steps.settings.outputs.operation_timeout_ms }} BENCH_INCLUDE_OPTIONAL_OPS: ${{ steps.settings.outputs.include_optional_ops }} BENCH_FAIL_ON_OPERATION_ERROR: ${{ steps.settings.outputs.fail_on_operation_error }} + BENCH_FAIL_ON_DEFERRED_REGRESSION: ${{ steps.settings.outputs.fail_on_deferred_regression }} + BENCH_DEFERRED_MAX_P95_DELTA_PCT: ${{ steps.settings.outputs.deferred_max_p95_delta_pct }} + BENCH_EAGER_MAX_P95_DELTA_PCT: ${{ steps.settings.outputs.eager_max_p95_delta_pct }} BENCH_OUTPUT_FILE: .artifacts/sql-benchmark/base.json BENCH_MARKDOWN_FILE: .artifacts/sql-benchmark/base.md run: | @@ -139,6 +163,9 @@ jobs: BENCH_OPERATION_TIMEOUT_MS: ${{ steps.settings.outputs.operation_timeout_ms }} BENCH_INCLUDE_OPTIONAL_OPS: ${{ steps.settings.outputs.include_optional_ops }} BENCH_FAIL_ON_OPERATION_ERROR: ${{ steps.settings.outputs.fail_on_operation_error }} + BENCH_FAIL_ON_DEFERRED_REGRESSION: ${{ steps.settings.outputs.fail_on_deferred_regression }} + BENCH_DEFERRED_MAX_P95_DELTA_PCT: ${{ steps.settings.outputs.deferred_max_p95_delta_pct }} + BENCH_EAGER_MAX_P95_DELTA_PCT: ${{ steps.settings.outputs.eager_max_p95_delta_pct }} BENCH_OUTPUT_FILE: .artifacts/sql-benchmark/head.json BENCH_MARKDOWN_FILE: .artifacts/sql-benchmark/head.md run: | diff --git a/packages/arcade-ts/docs/sql-metadata-preserving-listing-sprint.prd.md b/packages/arcade-ts/docs/sql-metadata-preserving-listing-sprint.prd.md new file mode 100644 index 00000000..efdf7f08 --- /dev/null +++ b/packages/arcade-ts/docs/sql-metadata-preserving-listing-sprint.prd.md @@ -0,0 +1,290 @@ +# SQL Metadata-Preserving Listing Performance PRD (Sprint TDD) + +## Document Control + +- Status: Completed +- Owner: `packages/arcade-ts` maintainers +- Last updated: 2026-02-23 +- Sprint window: current sprint (1 sprint) +- Priority: P0 + +## Objective + +Reduce SQL token-list latency in `packages/arcade-ts` while preserving NFT visibility and metadata access. + +Key principle for this sprint: +- metadata is required for full NFT UX, +- but metadata does not need to be eagerly fetched for every token card on first page load. + +## Context and Baseline + +Current benchmark (`.artifacts/sql-benchmark/head.json`, generated 2026-02-22): + +- `listCollectionTokens:first-page`: p50 `1497.68ms`, p95 `1918.1ms` +- `listCollectionTokens:next-page`: p50 `1745.04ms`, p95 `2003.09ms` +- `listCollectionTokens:attribute-filters`: p50 `240.95ms`, p95 `251.43ms` + +Direct SQL profiling against `arcade-main` Beasts collection showed payload dominance: + +- with metadata (`LIMIT 100`): ~`3.25MB` response, ~`1.69s` avg +- without metadata (`LIMIT 100`): ~`16.9KB` response, ~`0.26s` avg + +This indicates first-page latency is primarily response size + transfer + JSON parsing, not only predicate/index quality. + +## Problem Statement + +`listCollectionTokens` currently always selects `metadata` in the edge SQL path, which over-fetches for list/grid surfaces that only need: + +- token identity (`contract_address`, `token_id`), +- image URL (derived from Torii static endpoint), +- optional lightweight labels. + +We need a TDD-scoped path that: + +1. keeps current default behavior safe for existing consumers, +2. enables deferred metadata loading for high-volume list views, +3. preserves eventual full metadata access without changing business semantics. + +## Goals + +1. Preserve existing default API behavior for backwards compatibility. +2. Introduce an opt-in deferred metadata mode for token listing. +3. Add explicit metadata hydration path for selected token IDs. +4. Add benchmark/CI coverage to prevent regressions and prove benefit. + +## Non-Goals + +- Removing metadata support. +- Rewriting Dojo runtime path. +- Contract/index migrations. +- Frontend redesign outside API integration examples. + +## In Scope + +- `packages/arcade-ts/src/marketplace/types.ts` +- `packages/arcade-ts/src/marketplace/client.edge.ts` +- `packages/arcade-ts/src/marketplace/index.ts` +- `packages/arcade-ts/src/marketplace/README.md` +- `packages/arcade-ts/scripts/sql-benchmark.mjs` +- `packages/arcade-ts/src/marketplace/client.edge.test.ts` +- `packages/arcade-ts/src/marketplace/benchmark.test.ts` + +## Out of Scope + +- Client app route-level virtualization work. +- Multi-project cache invalidation redesign. +- Marketplace schema changes. + +## Functional Requirements + +### FR-1: Backwards-compatible default + +- `listCollectionTokens` behavior remains unchanged when no new option is provided. +- Existing callers continue receiving metadata as today. + +### FR-2: Deferred metadata option + +- Add an option on `FetchCollectionTokensOptions`: + - `includeMetadata?: boolean` (default `true`). +- When `includeMetadata === false`, SQL projection must exclude metadata-heavy fields. +- Returned token objects must still include: + - canonical `contract_address`, + - `token_id`, + - image URL resolution path (`fetchImages` behavior remains functional). + +### FR-3: Batch metadata hydration + +- Add a new client method for targeted hydration by token IDs for a collection: + - `getCollectionTokenMetadataBatch(...)` (name finalization during implementation). +- It must support chunking for large token-id inputs and return normalized tokens with metadata. + +### FR-4: Deterministic behavior and safety + +- Existing token ID canonicalization and dedupe behavior must be reused. +- SQL generation remains escaped and chunked for large `IN` sets. + +### FR-5: Benchmark visibility and gating + +- Benchmark script must include both modes: + - eager metadata list path, + - deferred metadata list path. +- Markdown report must clearly separate these operations. +- CI should fail on deferred-mode regressions once baseline stabilizes. + +## Success Metrics (Sprint Exit) + +1. Deferred-mode benchmark target on Beasts (`LIMIT 100`): +- `listCollectionTokens:first-page:deferred` p50 <= `700ms` +- `listCollectionTokens:next-page:deferred` p50 <= `800ms` + +2. No regression guardrails: +- Existing eager-mode ops do not regress > `10%` p95 vs base. + +3. Correctness: +- 100% passing tests for new API behavior and compatibility. + +4. UX compatibility: +- Deferred-mode tokens still produce image URLs when `fetchImages=true`. + +## TDD Delivery Plan (RED/GREEN/REFACTOR) + +### Epic A: Deferred Metadata Listing (P0) + +#### A1. Add API surface [x] + +RED: +- Add type-level and runtime tests asserting: + - default call includes metadata projection, + - `includeMetadata: false` excludes metadata projection. + +GREEN: +- Introduce `includeMetadata?: boolean` in `FetchCollectionTokensOptions`. +- Keep default `true`. + +REFACTOR: +- Extract SQL projection builder for token queries. + +#### A2. Preserve image visibility in deferred mode [x] + +RED: +- Add test proving returned tokens still include deterministic image URL when: + - `includeMetadata=false` + - `fetchImages=true`. + +GREEN: +- Ensure normalization path tolerates absent metadata and still resolves image URL. + +REFACTOR: +- Minimize branching in token normalization. + +### Epic B: Metadata Hydration Batch API (P0) + +#### B1. Add batch metadata fetch method [x] + +RED: +- Add tests for new method: + - hydrates metadata for requested token IDs, + - returns empty for invalid token IDs, + - chunks large token ID sets. + +GREEN: +- Implement SQL query path scoped to collection + token IDs. +- Reuse `normalizeTokenIds` and chunk helpers. + +REFACTOR: +- Reuse shared query builder utilities between list + hydrate methods. + +#### B2. Edge cases and compatibility [x] + +RED: +- Add tests for decimal/hex/bare-hex token ID equivalence in hydration path. + +GREEN: +- Route hydration path through canonicalization utility. + +REFACTOR: +- Consolidate token-id normalization entry points. + +### Epic C: Benchmarks and CI Gates (P1) + +#### C1. Benchmark operation expansion [x] + +RED: +- Add benchmark helper/unit tests for additional operation names. + +GREEN: +- Add operations: + - `listCollectionTokens:first-page:eager` + - `listCollectionTokens:first-page:deferred` + - `listCollectionTokens:next-page:eager` + - `listCollectionTokens:next-page:deferred` + - optional: `getCollectionTokenMetadataBatch:100` + +REFACTOR: +- Centralize operation registry in benchmark script. + +#### C2. CI threshold enforcement [x] + +RED: +- Add script/unit tests for threshold evaluation logic. + +GREEN: +- Add fail condition for deferred-mode regressions above threshold. +- Keep optional heavy operations non-blocking for now. + +REFACTOR: +- Separate core and optional comparison sets. + +## Sprint Backlog and Estimates + +1. [x] Story A: Deferred metadata option + SQL projection split +- Estimate: 2 days +- Owner: SDK engineer +- Risk: medium (API + normalization semantics) + +2. [x] Story B: Batch metadata hydration API +- Estimate: 2 days +- Owner: SDK engineer +- Risk: medium (API shape + chunk behavior) + +3. [x] Story C: Benchmark/CI expansion and gates +- Estimate: 1 day +- Owner: infra + SDK +- Risk: low/medium (flaky network variance) + +4. [x] Story D: Docs and migration examples +- Estimate: 0.5 day +- Owner: SDK engineer +- Risk: low + +Total: 5.5 engineering days (fits one sprint with review buffer). + +## Test Plan + +Primary files: + +- `packages/arcade-ts/src/marketplace/client.edge.test.ts` +- `packages/arcade-ts/src/marketplace/benchmark.test.ts` +- optional new tests: + - `packages/arcade-ts/src/marketplace/metadata-batch.test.ts` + +Execution: + +```bash +pnpm -C packages/arcade-ts test -- src/marketplace/client.edge.test.ts +pnpm -C packages/arcade-ts test -- src/marketplace/benchmark.test.ts +pnpm -C packages/arcade-ts test +``` + +Benchmark validation: + +```bash +pnpm --filter @cartridge/arcade build +BENCH_WARMUP=1 BENCH_ITERATIONS=5 BENCH_INCLUDE_OPTIONAL_OPS=1 node packages/arcade-ts/scripts/sql-benchmark.mjs +``` + +## Rollout Plan + +1. Land API + tests behind backward-compatible defaults. +2. Land hydration API + tests. +3. Land benchmark operation expansion and CI thresholds in warning mode. +4. Flip CI thresholds to blocking after 3-5 stable PR runs. + +## Risks and Mitigations + +1. Consumers rely on metadata in list call implicitly. +- Mitigation: default remains eager (`includeMetadata=true`), deferred is opt-in. + +2. Deferred mode adopted without hydration strategy. +- Mitigation: provide batch hydration API and README usage pattern in same sprint. + +3. Benchmark noise from network/backend variance. +- Mitigation: compare base/head in same workflow; use conservative p95 threshold. + +## Definition of Done + +- [x] New deferred metadata mode exists and is fully tested. +- [x] Batch metadata hydration method exists and is fully tested. +- [x] Benchmark reports include eager vs deferred operations. +- [x] CI can detect/flag deferred-mode regressions. +- [x] README documents when to use eager vs deferred mode and how to hydrate metadata. diff --git a/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs b/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs index 9829edc6..f856c41e 100644 --- a/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs +++ b/packages/arcade-ts/scripts/sql-benchmark-helpers.mjs @@ -121,6 +121,43 @@ export const fallbackCompareBenchmarkReports = (base, head) => { return rows; }; +const getComparisonDelta = (row, metric) => + metric === "p50" ? row.deltaP50Pct : row.deltaP95Pct; + +export const fallbackEvaluateBenchmarkRegressions = ( + rows, + thresholds, +) => { + if (!rows?.length || !thresholds?.length) { + return []; + } + + const rowsByName = new Map(rows.map((row) => [row.name, row])); + const violations = []; + + for (const threshold of thresholds) { + const row = rowsByName.get(threshold.operationName); + if (!row) continue; + + const maxDeltaPct = Number(threshold.maxDeltaPct); + if (!Number.isFinite(maxDeltaPct) || maxDeltaPct < 0) { + continue; + } + + const actualDeltaPct = getComparisonDelta(row, threshold.metric); + if (actualDeltaPct > maxDeltaPct) { + violations.push({ + name: row.name, + metric: threshold.metric, + maxDeltaPct, + actualDeltaPct, + }); + } + } + + return violations; +}; + const formatDelta = (value) => { const signed = value > 0 ? `+${value}` : `${value}`; return `${signed}%`; @@ -199,12 +236,16 @@ export const resolveBenchmarkHelpers = (marketplace) => { marketplace?.runBenchmarkOperation ?? fallbackRunBenchmarkOperation; const compareBenchmarkReports = marketplace?.compareBenchmarkReports ?? fallbackCompareBenchmarkReports; + const evaluateBenchmarkRegressions = + marketplace?.evaluateBenchmarkRegressions ?? + fallbackEvaluateBenchmarkRegressions; const renderBenchmarkMarkdown = marketplace?.renderBenchmarkMarkdown ?? fallbackRenderBenchmarkMarkdown; const usingFallbackHelpers = !marketplace?.runBenchmarkOperation || !marketplace?.compareBenchmarkReports || + !marketplace?.evaluateBenchmarkRegressions || !marketplace?.renderBenchmarkMarkdown; return { @@ -213,6 +254,7 @@ export const resolveBenchmarkHelpers = (marketplace) => { fetchTraitValues, runBenchmarkOperation, compareBenchmarkReports, + evaluateBenchmarkRegressions, renderBenchmarkMarkdown, usingFallbackHelpers, }; diff --git a/packages/arcade-ts/scripts/sql-benchmark.mjs b/packages/arcade-ts/scripts/sql-benchmark.mjs index 151bc260..7e0506bd 100644 --- a/packages/arcade-ts/scripts/sql-benchmark.mjs +++ b/packages/arcade-ts/scripts/sql-benchmark.mjs @@ -18,6 +18,18 @@ const toPositiveInt = (value, fallback) => { return parsed; }; +const toNonNegativeNumber = (value, fallback) => { + if (value == null || `${value}`.trim().length === 0) { + return fallback; + } + + const parsed = Number.parseFloat(String(value)); + if (!Number.isFinite(parsed) || parsed < 0) { + return fallback; + } + return parsed; +}; + const toBoolean = (value, fallback = false) => { if (value == null || `${value}`.trim().length === 0) { return fallback; @@ -106,9 +118,21 @@ const main = async () => { process.env.BENCH_FAIL_ON_OPERATION_ERROR, false, ); + const failOnDeferredRegression = toBoolean( + process.env.BENCH_FAIL_ON_DEFERRED_REGRESSION, + false, + ); const tokenLimit = toPositiveInt(process.env.BENCH_TOKEN_LIMIT, 100); const orderLimit = toPositiveInt(process.env.BENCH_ORDER_LIMIT, 100); const listingLimit = toPositiveInt(process.env.BENCH_LISTING_LIMIT, 100); + const deferredMaxP95DeltaPct = toNonNegativeNumber( + process.env.BENCH_DEFERRED_MAX_P95_DELTA_PCT, + 10, + ); + const eagerMaxP95DeltaPct = toNonNegativeNumber( + process.env.BENCH_EAGER_MAX_P95_DELTA_PCT, + 10, + ); const distDir = process.env.BENCH_ARCADE_DIST_DIR || getDefaultDistDir(cwd); const outputFile = path.resolve( @@ -134,6 +158,7 @@ const main = async () => { fetchTraitValues, runBenchmarkOperation, compareBenchmarkReports, + evaluateBenchmarkRegressions, renderBenchmarkMarkdown, usingFallbackHelpers, } = resolveBenchmarkHelpers(marketplace); @@ -212,46 +237,66 @@ const main = async () => { ); } - const firstPageResult = await runAndRecord( - "listCollectionTokens:first-page", - async () => - ensureTokenPageResult( - client.listCollectionTokens({ - address: collectionAddress, - project: projectId, - limit: tokenLimit, - fetchImages: false, - }), - ), - ); - - const seedCursor = firstPageResult?.page?.nextCursor; - if (seedCursor) { - await runAndRecord("listCollectionTokens:next-page", async () => - ensureTokenPageResult( - client.listCollectionTokens({ - address: collectionAddress, - project: projectId, - cursor: seedCursor, - limit: tokenLimit, - fetchImages: false, - }), - ), + const listingModes = [ + { label: "eager", includeMetadata: true }, + { label: "deferred", includeMetadata: false }, + ]; + let metadataBatchTokenIds = []; + + for (const mode of listingModes) { + const firstPageResult = await runAndRecord( + `listCollectionTokens:first-page:${mode.label}`, + async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + limit: tokenLimit, + includeMetadata: mode.includeMetadata, + fetchImages: false, + }), + ), ); - } - if (attributeFilters) { - await runAndRecord("listCollectionTokens:attribute-filters", async () => - ensureTokenPageResult( - client.listCollectionTokens({ - address: collectionAddress, - project: projectId, - limit: tokenLimit, - attributeFilters, - fetchImages: false, - }), - ), - ); + if (metadataBatchTokenIds.length === 0) { + metadataBatchTokenIds = (firstPageResult?.page?.tokens ?? []) + .map((token) => String(token?.token_id ?? "")) + .filter((tokenId) => tokenId.length > 0) + .slice(0, 100); + } + + const seedCursor = firstPageResult?.page?.nextCursor; + if (seedCursor) { + await runAndRecord(`listCollectionTokens:next-page:${mode.label}`, async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + cursor: seedCursor, + limit: tokenLimit, + includeMetadata: mode.includeMetadata, + fetchImages: false, + }), + ), + ); + } + + if (attributeFilters) { + await runAndRecord( + `listCollectionTokens:attribute-filters:${mode.label}`, + async () => + ensureTokenPageResult( + client.listCollectionTokens({ + address: collectionAddress, + project: projectId, + limit: tokenLimit, + includeMetadata: mode.includeMetadata, + attributeFilters, + fetchImages: false, + }), + ), + ); + } } await runAndRecord("getCollectionOrders", async () => @@ -304,6 +349,21 @@ const main = async () => { ); } + if ( + includeOptionalOps && + metadataBatchTokenIds.length >= 100 && + typeof client.getCollectionTokenMetadataBatch === "function" + ) { + await runAndRecord("getCollectionTokenMetadataBatch:100", async () => + client.getCollectionTokenMetadataBatch({ + address: collectionAddress, + project: projectId, + tokenIds: metadataBatchTokenIds.slice(0, 100), + fetchImages: false, + }), + ); + } + if (operationResults.length === 0) { throw new Error("No successful benchmark operations completed"); } @@ -324,6 +384,57 @@ const main = async () => { ? compareBenchmarkReports(baseline, report) : []; + const coreThresholds = [ + { + operationName: "listCollectionTokens:first-page:deferred", + metric: "p95", + maxDeltaPct: deferredMaxP95DeltaPct, + }, + { + operationName: "listCollectionTokens:next-page:deferred", + metric: "p95", + maxDeltaPct: deferredMaxP95DeltaPct, + }, + ]; + const optionalThresholds = [ + { + operationName: "listCollectionTokens:first-page:eager", + metric: "p95", + maxDeltaPct: eagerMaxP95DeltaPct, + }, + { + operationName: "listCollectionTokens:next-page:eager", + metric: "p95", + maxDeltaPct: eagerMaxP95DeltaPct, + }, + ]; + + const coreViolations = + comparison.length > 0 + ? evaluateBenchmarkRegressions(comparison, coreThresholds) + : []; + const optionalViolations = + comparison.length > 0 + ? evaluateBenchmarkRegressions(comparison, optionalThresholds) + : []; + + for (const violation of coreViolations) { + console.warn( + `[benchmark] core regression ${violation.name} ${violation.metric}: +${violation.actualDeltaPct}% (threshold ${violation.maxDeltaPct}%)`, + ); + } + for (const violation of optionalViolations) { + console.warn( + `[benchmark] optional regression ${violation.name} ${violation.metric}: +${violation.actualDeltaPct}% (threshold ${violation.maxDeltaPct}%)`, + ); + } + + if (failOnDeferredRegression && coreViolations.length > 0) { + throw new Error( + `Deferred benchmark regression threshold exceeded (${coreViolations.length} operations)`, + ); + } + const markdown = renderBenchmarkMarkdown(report, comparison); await ensureDir(outputFile); diff --git a/packages/arcade-ts/src/marketplace/README.md b/packages/arcade-ts/src/marketplace/README.md index 1b315047..4a3c7e16 100644 --- a/packages/arcade-ts/src/marketplace/README.md +++ b/packages/arcade-ts/src/marketplace/README.md @@ -110,6 +110,7 @@ if (result.error) { | `cursor` | `string \| null` | No | Pagination cursor from a previous call. | | `attributeFilters` | `AttributeFilterInput` | No | Trait filters as `{ trait: value \| values[] }`. | | `tokenIds` | `string[]` | No | Return only specific token IDs. | +| `includeMetadata` | `boolean` | No | Include token metadata payloads (default `true`). | | `fetchImages` | `boolean` | No | Resolve token images. | | `project` | `string` | No | Override project for this request. | | `resolveTokenImage`| `ResolveTokenImage` | No | Per-call image resolver override. | @@ -117,6 +118,50 @@ if (result.error) { Returns `Promise` — `{ page, error }`. +For high-volume grids, prefer deferred metadata and hydrate selected tokens on demand: + +```ts +const deferredPage = await client.listCollectionTokens({ + address: "0x04f5...b15f", + limit: 100, + includeMetadata: false, + fetchImages: true, +}); + +const tokenIdsToHydrate = (deferredPage.page?.tokens ?? []) + .slice(0, 24) + .map((token) => String(token.token_id)); + +const hydrated = await client.getCollectionTokenMetadataBatch({ + address: "0x04f5...b15f", + tokenIds: tokenIdsToHydrate, + fetchImages: true, +}); +``` + +--- + +### `getCollectionTokenMetadataBatch` + +Hydrates metadata for a targeted set of token IDs in a collection. + +```ts +const tokens = await client.getCollectionTokenMetadataBatch({ + address: "0x04f5...b15f", + tokenIds: ["1", "2", "3"], + fetchImages: false, +}); +``` + +| Option | Type | Required | Description | +| ------------- | --------- | -------- | ------------------------------------ | +| `address` | `string` | Yes | Contract address of the collection. | +| `tokenIds` | `string[]`| Yes | Token IDs to hydrate metadata for. | +| `project` | `string` | No | Override the default Torii project. | +| `fetchImages` | `boolean` | No | Resolve token image URLs. | + +Returns `Promise`. + --- ### `getCollectionOrders` diff --git a/packages/arcade-ts/src/marketplace/benchmark.test.ts b/packages/arcade-ts/src/marketplace/benchmark.test.ts index c6014bd0..087645e3 100644 --- a/packages/arcade-ts/src/marketplace/benchmark.test.ts +++ b/packages/arcade-ts/src/marketplace/benchmark.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { compareBenchmarkReports, computeBenchmarkStats, + evaluateBenchmarkRegressions, renderBenchmarkMarkdown, runBenchmarkOperation, type BenchmarkReport, @@ -156,4 +157,84 @@ describe("marketplace benchmark helpers", () => { expect(markdown).toContain("getCollection"); expect(markdown).toContain("status: 400"); }); + + it("flags deferred operation regressions above configured threshold", () => { + const base: BenchmarkReport = { + generatedAt: "2026-01-01T00:00:00.000Z", + projectId: "arcade-main", + collectionAddress: "0x1", + warmup: 1, + iterations: 3, + operations: [ + { + name: "listCollectionTokens:first-page:deferred", + samplesMs: [100, 110, 120], + stats: computeBenchmarkStats([100, 110, 120]), + }, + ], + }; + const head: BenchmarkReport = { + ...base, + operations: [ + { + name: "listCollectionTokens:first-page:deferred", + samplesMs: [140, 145, 150], + stats: computeBenchmarkStats([140, 145, 150]), + }, + ], + }; + + const rows = compareBenchmarkReports(base, head); + const regressions = evaluateBenchmarkRegressions(rows, [ + { + operationName: "listCollectionTokens:first-page:deferred", + metric: "p95", + maxDeltaPct: 10, + }, + ]); + + expect(regressions).toHaveLength(1); + expect(regressions[0]?.name).toBe( + "listCollectionTokens:first-page:deferred", + ); + expect(regressions[0]?.actualDeltaPct).toBeGreaterThan(10); + }); + + it("does not flag deferred operation when delta stays within threshold", () => { + const base: BenchmarkReport = { + generatedAt: "2026-01-01T00:00:00.000Z", + projectId: "arcade-main", + collectionAddress: "0x1", + warmup: 1, + iterations: 3, + operations: [ + { + name: "listCollectionTokens:next-page:deferred", + samplesMs: [100, 110, 120], + stats: computeBenchmarkStats([100, 110, 120]), + }, + ], + }; + const head: BenchmarkReport = { + ...base, + operations: [ + { + name: "listCollectionTokens:next-page:deferred", + samplesMs: [105, 112, 121], + stats: computeBenchmarkStats([105, 112, 121]), + }, + ], + }; + + const rows = compareBenchmarkReports(base, head); + const regressions = evaluateBenchmarkRegressions(rows, [ + { + operationName: "listCollectionTokens:next-page:deferred", + metric: "p95", + maxDeltaPct: 10, + }, + ]); + + expect(regressions).toEqual([]); + }); }); diff --git a/packages/arcade-ts/src/marketplace/benchmark.ts b/packages/arcade-ts/src/marketplace/benchmark.ts index 2de65e67..4b583019 100644 --- a/packages/arcade-ts/src/marketplace/benchmark.ts +++ b/packages/arcade-ts/src/marketplace/benchmark.ts @@ -39,6 +39,19 @@ export interface BenchmarkComparisonRow { deltaP95Pct: number; } +export interface BenchmarkRegressionThreshold { + operationName: string; + metric: "p50" | "p95"; + maxDeltaPct: number; +} + +export interface BenchmarkRegressionViolation { + name: string; + metric: "p50" | "p95"; + maxDeltaPct: number; + actualDeltaPct: number; +} + const round = (value: number, precision = 2): number => { const factor = 10 ** precision; return Math.round(value * factor) / factor; @@ -108,6 +121,45 @@ export function compareBenchmarkReports( return rows; } +const getComparisonDelta = ( + row: BenchmarkComparisonRow, + metric: "p50" | "p95", +): number => (metric === "p50" ? row.deltaP50Pct : row.deltaP95Pct); + +export function evaluateBenchmarkRegressions( + rows: BenchmarkComparisonRow[], + thresholds: BenchmarkRegressionThreshold[], +): BenchmarkRegressionViolation[] { + if (rows.length === 0 || thresholds.length === 0) { + return []; + } + + const rowsByName = new Map(rows.map((row) => [row.name, row])); + const violations: BenchmarkRegressionViolation[] = []; + + for (const threshold of thresholds) { + const row = rowsByName.get(threshold.operationName); + if (!row) continue; + + const maxDeltaPct = Number(threshold.maxDeltaPct); + if (!Number.isFinite(maxDeltaPct) || maxDeltaPct < 0) { + continue; + } + + const actualDeltaPct = getComparisonDelta(row, threshold.metric); + if (actualDeltaPct > maxDeltaPct) { + violations.push({ + name: row.name, + metric: threshold.metric, + maxDeltaPct, + actualDeltaPct, + }); + } + } + + return violations; +} + const withTimeout = async ( promise: Promise, timeoutMs: number | undefined, diff --git a/packages/arcade-ts/src/marketplace/client.dojo.ts b/packages/arcade-ts/src/marketplace/client.dojo.ts index f0610160..d0fb2900 100644 --- a/packages/arcade-ts/src/marketplace/client.dojo.ts +++ b/packages/arcade-ts/src/marketplace/client.dojo.ts @@ -28,9 +28,11 @@ import { defaultResolveContractImage, defaultResolveTokenImage, inferImageFromMetadata, + normalizeTokenIds, parseJsonSafe, } from "./utils"; import type { + CollectionTokenMetadataBatchOptions, CollectionListingsOptions, CollectionOrdersOptions, CollectionSummaryOptions, @@ -38,6 +40,7 @@ import type { MarketplaceClientConfig, MarketplaceFees, NormalizedCollection, + NormalizedToken, RoyaltyFee, RoyaltyFeeOptions, TokenDetails, @@ -310,6 +313,45 @@ export async function createDojoMarketplaceClient( return queryOrders(options); }; + const getCollectionTokenMetadataBatch = async ( + options: CollectionTokenMetadataBatchOptions, + ): Promise => { + const projectId = ensureProjectId(options.project, defaultProject); + const normalizedTokenIds = [ + ...new Set(normalizeTokenIds(options.tokenIds)), + ]; + if (normalizedTokenIds.length === 0) { + return []; + } + + const { page, error } = await fetchCollectionTokens({ + address: options.address, + project: projectId, + tokenIds: normalizedTokenIds, + limit: normalizedTokenIds.length, + includeMetadata: true, + fetchImages: options.fetchImages ?? false, + resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage, + defaultProjectId: defaultProject, + }); + if (error) { + throw error.error; + } + + const tokensById = new Map(); + for (const token of page?.tokens ?? []) { + const normalizedId = normalizeTokenIdForQuery(String(token.token_id)); + if (!normalizedId) continue; + if (!tokensById.has(normalizedId)) { + tokensById.set(normalizedId, token); + } + } + + return normalizedTokenIds + .map((tokenId) => tokensById.get(tokenId)) + .filter((token): token is NormalizedToken => Boolean(token)); + }; + const listCollectionListings = async ( options: CollectionListingsOptions, ): Promise => { @@ -513,6 +555,7 @@ export async function createDojoMarketplaceClient( resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage, defaultProjectId: defaultProject, }), + getCollectionTokenMetadataBatch, getCollectionOrders, listCollectionListings, getToken, diff --git a/packages/arcade-ts/src/marketplace/client.edge.test.ts b/packages/arcade-ts/src/marketplace/client.edge.test.ts index 2be3321b..30b80539 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.test.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.test.ts @@ -139,6 +139,55 @@ describe("createEdgeMarketplaceClient", () => { ); }); + it("includes metadata projection by default when listing tokens", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.listCollectionTokens({ + address: "0xabc", + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("SELECT contract_address, token_id, metadata"); + }); + + it("omits metadata projection when includeMetadata is false", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [{ contract_address: "0xabc", token_id: "0x1" }], + }, + ], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const result = await client.listCollectionTokens({ + address: "0xabc", + includeMetadata: false, + fetchImages: true, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain( + "SELECT contract_address, token_id, name, symbol, decimals", + ); + expect(sql).not.toContain("metadata"); + expect(result.error).toBeNull(); + expect(result.page?.tokens[0]?.image).toContain("/torii/static/"); + }); + it("normalizes tokenIds before building SQL IN clause", async () => { mockedFetchToriisSql.mockResolvedValueOnce({ data: [{ endpoint: "arcade-main", data: [] }], @@ -204,6 +253,75 @@ describe("createEdgeMarketplaceClient", () => { expect(sql).toContain(" OR token_id IN ("); }); + it("hydrates metadata for normalized token ids through batch API", async () => { + mockedFetchToriisSql.mockResolvedValueOnce({ + data: [ + { + endpoint: "arcade-main", + data: [ + { + contract_address: "0xabc", + token_id: "255", + metadata: JSON.stringify({ name: "Token 255" }), + }, + ], + }, + ], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const tokens = await client.getCollectionTokenMetadataBatch({ + address: "0xabc", + tokenIds: ["ff", "0xff", "255"], + fetchImages: false, + }); + + const sql = mockedFetchToriisSql.mock.calls[0]?.[1] ?? ""; + expect(sql).toContain("FROM tokens"); + expect(sql).toContain("'255'"); + expect((sql.match(/'255'/g) ?? []).length).toBe(1); + expect(tokens).toHaveLength(1); + expect(tokens[0]?.metadata?.name).toBe("Token 255"); + }); + + it("returns empty metadata batch and avoids SQL when token ids are invalid", async () => { + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + const tokens = await client.getCollectionTokenMetadataBatch({ + address: "0xabc", + tokenIds: ["", " "], + fetchImages: false, + }); + + expect(tokens).toEqual([]); + expect(mockedFetchToriisSql).not.toHaveBeenCalled(); + }); + + it("chunks metadata hydration for large token id sets", async () => { + mockedFetchToriisSql.mockResolvedValue({ + data: [{ endpoint: "arcade-main", data: [] }], + errors: [], + } as any); + + const client = await createEdgeMarketplaceClient({ + chainId: constants.StarknetChainId.SN_MAIN, + }); + + await client.getCollectionTokenMetadataBatch({ + address: "0xabc", + tokenIds: Array.from({ length: 450 }, (_, index) => String(index + 1)), + fetchImages: false, + }); + + expect(mockedFetchToriisSql.mock.calls.length).toBeGreaterThan(1); + }); + it("returns null nextCursor when limit is invalid and no rows are returned", async () => { mockedFetchToriisSql.mockResolvedValueOnce({ data: [{ endpoint: "arcade-main", data: [] }], diff --git a/packages/arcade-ts/src/marketplace/client.edge.ts b/packages/arcade-ts/src/marketplace/client.edge.ts index 8c817866..72aa89f1 100644 --- a/packages/arcade-ts/src/marketplace/client.edge.ts +++ b/packages/arcade-ts/src/marketplace/client.edge.ts @@ -3,6 +3,7 @@ import { fetchToriisSql } from "../modules/torii-sql-fetcher"; import { CategoryType, StatusType } from "../classes"; import { OrderModel } from "../modules/marketplace/order"; import type { + CollectionTokenMetadataBatchOptions, CollectionListingsOptions, CollectionOrdersOptions, CollectionSummaryOptions, @@ -120,6 +121,11 @@ const buildChunkedInPredicate = ( .join(" OR ")})`; }; +const buildTokenProjectionSql = (includeMetadata: boolean): string => + includeMetadata + ? "contract_address, token_id, metadata, name, symbol, decimals" + : "contract_address, token_id, name, symbol, decimals"; + const KEYSET_CURSOR_PREFIX = "keyset:"; const parseTokenCursor = ( @@ -388,6 +394,7 @@ LIMIT 1`, attributeFilters, tokenIds, limit = DEFAULT_LIMIT, + includeMetadata = true, fetchImages = false, } = options; const projectId = ensureProjectId(project, defaultProject); @@ -419,7 +426,8 @@ LIMIT 1`, conditions.push(traitClause); } - const sql = `SELECT contract_address, token_id, metadata, name, symbol, decimals + const projection = buildTokenProjectionSql(includeMetadata); + const sql = `SELECT ${projection} FROM tokens WHERE ${conditions.join(" AND ")} ORDER BY token_id @@ -467,6 +475,59 @@ OFFSET ${cursorState.offset}` } }; + const getCollectionTokenMetadataBatch = async ( + options: CollectionTokenMetadataBatchOptions, + ): Promise => { + const { address, tokenIds, project, fetchImages = false } = options; + const projectId = ensureProjectId(project, defaultProject); + const collection = addAddressPadding( + getChecksumAddress(address), + ).toLowerCase(); + const normalizedTokenIds = [...new Set(normalizeTokenIds(tokenIds))]; + + if (normalizedTokenIds.length === 0) { + return []; + } + + const tokenIdChunks = chunkArray(normalizedTokenIds, SQL_IN_CHUNK_SIZE); + const hydratedRows: any[] = []; + + for (const tokenIdChunk of tokenIdChunks) { + if (tokenIdChunk.length === 0) continue; + + const sql = `SELECT ${buildTokenProjectionSql(true)} +FROM tokens +WHERE contract_address = '${escapeSqlValue(collection)}' + AND token_id IN (${toSqlList(tokenIdChunk)}) +ORDER BY token_id`; + + const rows = await querySql(projectId, sql); + hydratedRows.push(...rows); + } + + const normalizedTokens = await normalizeTokens( + hydratedRows as any[], + projectId, + { + fetchImages, + resolveTokenImage: resolveTokenImage ?? defaultResolveTokenImage, + }, + ); + + const tokensByCanonicalId = new Map(); + for (const token of normalizedTokens as NormalizedToken[]) { + const canonicalId = canonicalizeTokenId(String(token.token_id ?? "")); + if (!canonicalId) continue; + if (!tokensByCanonicalId.has(canonicalId)) { + tokensByCanonicalId.set(canonicalId, token); + } + } + + return normalizedTokenIds + .map((tokenId) => tokensByCanonicalId.get(tokenId)) + .filter((token): token is NormalizedToken => Boolean(token)); + }; + const getCollectionOrders = async ( options: CollectionOrdersOptions, projectIdOverride?: string, @@ -645,6 +706,7 @@ LIMIT 1`, return { getCollection, listCollectionTokens, + getCollectionTokenMetadataBatch, getCollectionOrders, listCollectionListings, getToken, diff --git a/packages/arcade-ts/src/marketplace/react.test.tsx b/packages/arcade-ts/src/marketplace/react.test.tsx index 849d86d2..d465f464 100644 --- a/packages/arcade-ts/src/marketplace/react.test.tsx +++ b/packages/arcade-ts/src/marketplace/react.test.tsx @@ -36,6 +36,7 @@ describe("useMarketplaceCollectionTokens", () => { const createClient = (): MarketplaceClient => ({ getCollection: vi.fn(), listCollectionTokens: vi.fn().mockResolvedValue(mockResult), + getCollectionTokenMetadataBatch: vi.fn().mockResolvedValue([]), getCollectionOrders: vi.fn(), listCollectionListings: vi.fn(), getToken: vi.fn(), diff --git a/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts b/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts index 9b619121..ff227b33 100644 --- a/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts +++ b/packages/arcade-ts/src/marketplace/sql-benchmark-helpers.test.ts @@ -15,6 +15,7 @@ describe("sql benchmark helper resolution", () => { expect(resolved.createMarketplaceClient).toBeTypeOf("function"); expect(resolved.runBenchmarkOperation).toBeTypeOf("function"); expect(resolved.compareBenchmarkReports).toBeTypeOf("function"); + expect(resolved.evaluateBenchmarkRegressions).toBeTypeOf("function"); expect(resolved.renderBenchmarkMarkdown).toBeTypeOf("function"); const outcome = await resolved.runBenchmarkOperation({ diff --git a/packages/arcade-ts/src/marketplace/types.ts b/packages/arcade-ts/src/marketplace/types.ts index 01fea37f..e6ff053c 100644 --- a/packages/arcade-ts/src/marketplace/types.ts +++ b/packages/arcade-ts/src/marketplace/types.ts @@ -50,6 +50,7 @@ export interface FetchCollectionTokensOptions { attributeFilters?: AttributeFilterInput; tokenIds?: string[]; limit?: number; + includeMetadata?: boolean; fetchImages?: boolean; resolveTokenImage?: ResolveTokenImage; defaultProjectId?: string; @@ -60,6 +61,13 @@ export interface FetchCollectionTokensResult { error: CollectionTokensError | null; } +export interface CollectionTokenMetadataBatchOptions { + address: string; + tokenIds: string[]; + project?: string; + fetchImages?: boolean; +} + export interface NormalizedCollection { projectId: string; address: string; @@ -144,6 +152,9 @@ export interface MarketplaceClient { listCollectionTokens( options: FetchCollectionTokensOptions, ): Promise; + getCollectionTokenMetadataBatch( + options: CollectionTokenMetadataBatchOptions, + ): Promise; getCollectionOrders(options: CollectionOrdersOptions): Promise; listCollectionListings( options: CollectionListingsOptions, From 407cc263720b78e34a8173ace7a13109792feca9 Mon Sep 17 00:00:00 2001 From: ponderingdemocritus Date: Mon, 23 Feb 2026 12:11:18 +1100 Subject: [PATCH 14/14] fix(dojo): canonicalize token id filters and honor includeMetadata --- .../arcade-ts/src/marketplace/tokens.test.ts | 61 +++++++++++++++++++ packages/arcade-ts/src/marketplace/tokens.ts | 38 ++++++++++-- 2 files changed, 94 insertions(+), 5 deletions(-) diff --git a/packages/arcade-ts/src/marketplace/tokens.test.ts b/packages/arcade-ts/src/marketplace/tokens.test.ts index 10adb65d..79b7da46 100644 --- a/packages/arcade-ts/src/marketplace/tokens.test.ts +++ b/packages/arcade-ts/src/marketplace/tokens.test.ts @@ -97,6 +97,67 @@ describe("fetchCollectionTokens", () => { expect(result.error?.error).toBeInstanceOf(Error); expect(result.error?.error.message).toBe("network error"); }); + + it("normalizes equivalent decimal and hex token ids to a single Torii filter id", async () => { + mockFetchToriis.mockResolvedValueOnce({ + data: [ + { + items: [], + next_cursor: null, + }, + ], + } as any); + + await fetchCollectionTokens({ + address: + "0x04f51290f2b0e16524084c27890711c7a955eb276cffec185d6f24f2a620b15f", + project: "projectA", + tokenIds: ["255", "0xff", "ff"], + fetchImages: false, + }); + + const callArgs = mockFetchToriis.mock.calls[0][1]; + const clientFn = callArgs.client; + expect(typeof clientFn).toBe("function"); + + const getTokens = vi.fn().mockResolvedValue({ + items: [], + next_cursor: null, + }); + await (clientFn as (params: any) => Promise)({ + client: { getTokens }, + } as any); + + expect(getTokens).toHaveBeenCalledWith( + expect.objectContaining({ + token_ids: [ + "00000000000000000000000000000000000000000000000000000000000000ff", + ], + }), + ); + }); + + it("omits metadata values when includeMetadata is false", async () => { + mockFetchToriis.mockResolvedValueOnce({ + data: [ + { + items: [sampleToken], + next_cursor: null, + }, + ], + } as any); + + const result = await fetchCollectionTokens({ + address: + "0x04f51290f2b0e16524084c27890711c7a955eb276cffec185d6f24f2a620b15f", + project: "projectA", + includeMetadata: false, + fetchImages: false, + }); + + expect(result.error).toBeNull(); + expect(result.page?.tokens[0]?.metadata).toBeUndefined(); + }); }); const sampleBalance = { diff --git a/packages/arcade-ts/src/marketplace/tokens.ts b/packages/arcade-ts/src/marketplace/tokens.ts index e96a2ccf..f1efed41 100644 --- a/packages/arcade-ts/src/marketplace/tokens.ts +++ b/packages/arcade-ts/src/marketplace/tokens.ts @@ -19,6 +19,7 @@ import type { TokenBalancesPage, } from "./types"; import { + canonicalizeTokenId, DEFAULT_PROJECT_ID, normalizeAttributeFilters, normalizeTokens, @@ -31,10 +32,29 @@ const DEFAULT_LIMIT = 100; const normalizeTokenIdsForQuery = (tokenIds?: string[]): string[] => { if (!tokenIds || tokenIds.length === 0) return []; - return tokenIds - .map(addAddressPadding) - .map((id) => (id.startsWith("0x") ? id.slice(2) : id)) - .filter((id) => id.length > 0); + + const normalized = tokenIds + .map((tokenId) => canonicalizeTokenId(tokenId)) + .flatMap((tokenId) => { + if (!tokenId) return []; + + try { + const hexTokenId = `0x${BigInt(tokenId).toString(16)}`; + return [addAddressPadding(hexTokenId).slice(2)]; + } catch (_error) { + try { + const padded = addAddressPadding(tokenId); + return [padded.startsWith("0x") ? padded.slice(2) : padded]; + } catch (_paddingError) { + const fallback = tokenId.startsWith("0x") + ? tokenId.slice(2) + : tokenId; + return fallback.length > 0 ? [fallback] : []; + } + } + }); + + return Array.from(new Set(normalized)); }; export async function fetchCollectionTokens( @@ -47,6 +67,7 @@ export async function fetchCollectionTokens( attributeFilters, tokenIds, limit = DEFAULT_LIMIT, + includeMetadata = true, fetchImages = false, resolveTokenImage, } = options; @@ -103,8 +124,15 @@ export async function fetchCollectionTokens( resolveTokenImage, }); + const pageTokens = includeMetadata + ? enriched + : enriched.map((token) => ({ + ...token, + metadata: undefined, + })); + const page: CollectionTokensPage = { - tokens: enriched, + tokens: pageTokens, nextCursor, };