From cb2f3eef8390a457965b9b457429e84e70a9ca10 Mon Sep 17 00:00:00 2001 From: Valentin Dosimont Date: Mon, 28 Apr 2025 16:08:44 +0200 Subject: [PATCH] chore: bump dojo 1.5 --- .changeset/thirty-cheetahs-design.md | 15 + .github/workflows/ci.yaml | 5 +- .github/workflows/release.yaml | 18 +- examples/example-node-worker/dojoConfig.ts | 4 +- examples/example-node-worker/env.ts | 9 + examples/example-node-worker/main.ts | 196 +++- examples/example-node-worker/package.json | 15 +- .../src/typescript/contracts.gen.ts | 59 ++ .../src/typescript/models.gen.ts | 171 ++++ examples/example-node-worker/tsconfig.json | 19 + examples/example-nodejs-bot/package.json | 3 +- .../example-vite-experimental-sdk/src/main.ts | 3 +- .../src/dojo/setup.ts | 6 +- .../src/dojo/generated/setup.ts | 6 +- .../src/dojo/generated/setup.ts | 2 +- .../src/historical-events.tsx | 8 +- .../src/dojo/generated/setup.ts | 6 +- .../src/dojo/generated/setup.ts | 6 +- package.json | 4 +- packages/core/package.json | 2 +- packages/react/package.json | 5 +- packages/sdk/package.json | 10 +- .../sdk/src/__tests__/parseEntities.test.ts | 51 +- .../__tests__/parseHistoricalEvents.test.ts | 796 --------------- packages/sdk/src/__tests__/state.test.ts | 13 +- .../src/__tests__/toriiQueryBuilder.test.ts | 99 +- .../sdk/src/__tests__/zustand.perf.test.ts | 5 +- packages/sdk/src/internal/errors.ts | 3 + .../sdk/src/internal/generateTypedData.ts | 4 +- packages/sdk/src/internal/merge.ts | 160 +++ packages/sdk/src/internal/models.ts | 77 ++ packages/sdk/src/internal/parseEntities.ts | 27 +- .../sdk/src/internal/parseHistoricalEvents.ts | 78 -- .../sdk/src/internal/toriiQueryBuilder.ts | 93 +- packages/sdk/src/internal/types.ts | 22 +- packages/sdk/src/node/index.ts | 117 +-- packages/sdk/src/node/worker.ts | 44 + packages/sdk/src/web/experimental/index.ts | 49 +- packages/sdk/src/web/index.ts | 105 +- packages/sdk/src/web/react/hooks/entities.ts | 15 +- packages/sdk/src/web/react/hooks/events.ts | 36 +- packages/sdk/src/web/react/hooks/hooks.ts | 22 +- packages/sdk/src/web/state/zustand.ts | 159 +-- packages/state/src/recs/index.ts | 98 +- packages/torii-client/package.json | 5 +- packages/torii-wasm/dojo.c | 2 +- pnpm-lock.yaml | 949 ++++++++++++++---- turbo.json | 4 + worlds/dojo-starter | 2 +- worlds/onchain-dash | 2 +- 50 files changed, 1942 insertions(+), 1667 deletions(-) create mode 100644 .changeset/thirty-cheetahs-design.md create mode 100644 examples/example-node-worker/env.ts create mode 100644 examples/example-node-worker/src/typescript/contracts.gen.ts create mode 100644 examples/example-node-worker/src/typescript/models.gen.ts create mode 100644 examples/example-node-worker/tsconfig.json delete mode 100644 packages/sdk/src/__tests__/parseHistoricalEvents.test.ts create mode 100644 packages/sdk/src/internal/errors.ts create mode 100644 packages/sdk/src/internal/merge.ts create mode 100644 packages/sdk/src/internal/models.ts delete mode 100644 packages/sdk/src/internal/parseHistoricalEvents.ts create mode 100644 packages/sdk/src/node/worker.ts diff --git a/.changeset/thirty-cheetahs-design.md b/.changeset/thirty-cheetahs-design.md new file mode 100644 index 00000000..7e8c3250 --- /dev/null +++ b/.changeset/thirty-cheetahs-design.md @@ -0,0 +1,15 @@ +--- +"@dojoengine/torii-wasm": minor +"@dojoengine/state": minor +"@dojoengine/sdk": minor +"@dojoengine/core": minor +"@dojoengine/create-burner": minor +"@dojoengine/create-dojo": minor +"@dojoengine/predeployed-connector": minor +"@dojoengine/react": minor +"@dojoengine/torii-client": minor +"@dojoengine/utils": minor +"@dojoengine/utils-wasm": minor +--- + +chore: bump dojo 1.5 diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5e701099..e822d0cc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -46,10 +46,11 @@ jobs: - run: curl -L https://install.dojoengine.org | bash - uses: software-mansion/setup-scarb@v1 with: - scarb-version: "2.9.2" - - run: /home/runner/.config/.dojo/bin/dojoup -v v1.2.1 + scarb-version: "2.10.1" + - run: /home/runner/.config/.dojo/dojoup/dojoup install v1.5.0-alpha.2 - run: | cd worlds/dojo-starter + ls -la /home/runner/.config/.dojo/bin /home/runner/.config/.dojo/bin/sozo build /home/runner/.config/.dojo/bin/sozo test - run: | diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 572b81b0..607ef828 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -28,10 +28,10 @@ jobs: - name: Setup Node.js with PNPM cache uses: actions/setup-node@v4 with: - node-version: 'lts/*' - cache: 'pnpm' + node-version: "lts/*" + cache: "pnpm" # The cache will be invalidated if these files change - cache-dependency-path: '**/pnpm-lock.yaml' + cache-dependency-path: "**/pnpm-lock.yaml" # Cache the PNPM store to speed up installations - name: Get PNPM store directory @@ -58,7 +58,7 @@ jobs: key: ${{ runner.os }}-build-${{ github.sha }} restore-keys: | ${{ runner.os }}-build- - + # Add Cargo cache for torii-wasm - name: Cache Cargo dependencies and build artifacts uses: actions/cache@v3 @@ -74,8 +74,8 @@ jobs: - run: curl -L https://install.dojoengine.org | bash - uses: software-mansion/setup-scarb@v1 with: - scarb-version: "2.9.2" - - run: /home/runner/.config/.dojo/bin/dojoup -v v1.2.1 + scarb-version: "2.10.1" + - run: /home/runner/.config/.dojo/dojoup/dojoup install v1.5.0-alpha.2 - run: | cd worlds/dojo-starter /home/runner/.config/.dojo/bin/sozo build @@ -106,7 +106,7 @@ jobs: STATUS=$(pnpm changeset status) echo "Changeset status:" echo "$STATUS" - + # Check if we have packages to bump if echo "$STATUS" | grep -q "NO packages to be bumped at patch" && \ echo "$STATUS" | grep -q "NO packages to be bumped at minor" && \ @@ -124,7 +124,7 @@ jobs: run: | # Apply version bump based on release type pnpm changeset version - + # If this is a dry run, revert the version changes if [ "${{ github.event.inputs.dry_run }}" == "true" ]; then echo "DRY RUN: Would version packages to ${NEW_VERSION}" @@ -166,4 +166,4 @@ jobs: TAGS=$(pnpm changeset tag) echo "DRY RUN: Would commit changes with message: chore: release" echo "DRY RUN: Would create and push tag: $TAGS" - git status \ No newline at end of file + git status diff --git a/examples/example-node-worker/dojoConfig.ts b/examples/example-node-worker/dojoConfig.ts index e45ee85a..44d8f057 100644 --- a/examples/example-node-worker/dojoConfig.ts +++ b/examples/example-node-worker/dojoConfig.ts @@ -1,6 +1,8 @@ import { createDojoConfig } from "@dojoengine/core"; -import manifest from "../../worlds/dojo-starter/manifest_dev.json"; +import manifest from "../../worlds/dojo-starter/manifest_dev.json" with { + type: "json", +}; export const dojoConfig = createDojoConfig({ manifest, diff --git a/examples/example-node-worker/env.ts b/examples/example-node-worker/env.ts new file mode 100644 index 00000000..a8f1c5d7 --- /dev/null +++ b/examples/example-node-worker/env.ts @@ -0,0 +1,9 @@ +import "dotenv/config"; +import { z } from "zod"; + +const envSchema = z.object({ + IDENTITY: z.string(), + SECRET_KEY: z.string(), +}); + +export const env = envSchema.parse(process.env); diff --git a/examples/example-node-worker/main.ts b/examples/example-node-worker/main.ts index 6fe80e80..fcabfe71 100644 --- a/examples/example-node-worker/main.ts +++ b/examples/example-node-worker/main.ts @@ -1,53 +1,177 @@ -import { init, KeysClause, ToriiQueryBuilder } from "@dojoengine/sdk/node"; -import { dojoConfig } from "./dojoConfig"; +import { + KeysClause, + ToriiQueryBuilder, + createWorker, + init, + type ParsedEntity, + getModel, + HistoricalToriiQueryBuilder, +} from "@dojoengine/sdk/node"; +import { SigningKey } from "@dojoengine/torii-wasm/node"; +import { dojoConfig } from "./dojoConfig.ts"; +import { + ModelsMapping, + type Moves, + type SchemaType, +} from "./src/typescript/models.gen.ts"; +import { addAddressPadding, type BigNumberish } from "starknet"; +import { w3cwebsocket } from "websocket"; +import { env } from "./env.ts"; + +// Those lines are require so that websocket works. +// @ts-ignore +global.Websocket = w3cwebsocket; +// @ts-ignore +global.WorkerGlobalScope = global; const sdk = await init({ client: { toriiUrl: dojoConfig.toriiUrl, - relayUrl: dojoConfig.relayUrl, + relayUrl: "/ip4/127.0.0.1/tcp/9092/ws", worldAddress: dojoConfig.manifest.world.address, }, - domain: {}, + domain: { + name: "node-worker", + version: "0.0.1", + chainId: "KATANA", + revision: "1", + }, + + identity: env.IDENTITY, + signer: SigningKey.fromSecretScalar(env.SECRET_KEY), }); -const query = new ToriiQueryBuilder() - .withClause( - KeysClause( - ["dojo_starter-Position", "dojo_starter-Moves"], - [undefined] - ).build() - ) - .includeHashedKeys(); - -function onEntityUpdated({ data, error }) { - if (error) { - console.error(error); - return; +type PositionCount = { + Up: number; + Down: number; + Left: number; + Right: number; +}; +const defaultPositionCount = { + Up: 0, + Down: 0, + Left: 0, + Right: 0, +}; + +const positionToU8 = (position: string) => { + const mapping = { + Up: 0, + Down: 1, + Left: 2, + Right: 3, + }; + + // 10 is used as default value + return mapping[position] ?? 10; +}; +const intoPositionCount = ( + pos: PositionCount +): Array<[BigNumberish, BigNumberish]> => { + return [ + [positionToU8("Up"), `0x${pos.Up.toString(16)}`], + [positionToU8("Down"), `0x${pos.Down.toString(16)}`], + [positionToU8("Left"), `0x${pos.Left.toString(16)}`], + [positionToU8("Right"), `0x${pos.Right.toString(16)}`], + ]; +}; + +async function publishOffchainPositionCount(moves: Moves): Promise { + const model = await sdk.getEntities({ + query: new ToriiQueryBuilder() + .withClause( + KeysClause( + [ModelsMapping.PositionCount], + [addAddressPadding(moves.player)] + ).build() + ) + .includeHashedKeys(), + }); + const m = getModel(ModelsMapping.PositionCount, model); + if (!m) { + const data = sdk.generateTypedData( + ModelsMapping.PositionCount, + { + identity: moves.player, + position: intoPositionCount(positionCount), + }, + [ + { + name: "identity", + type: "felt", + }, + { + name: "position", + type: "(u8, u128)*", + }, + ] + ); + + try { + await sdk.sendMessage(data); + } catch (err) { + console.error(err); + } + } else { + console.log(m.position); } +} - const entity = data.pop(); - if (entity && entity.entityId !== "0x0") { - // do whatever you need here - console.log(entity.models.dojo_starter); +let positionCount = defaultPositionCount; + +function initPositionFromEvent( + events: ParsedEntity[] +): PositionCount { + const pc = defaultPositionCount; + for (const e of events) { + const moved = e.models.dojo_starter.Moved; + if (!moved) { + continue; + } + pc[moved.direction] += 1; } + return pc; } -const [entities, sub] = await sdk.subscribeEntityQuery({ - query, - callback: onEntityUpdated, - historical: false, -}); +await createWorker(async () => { + async function onEntityUpdated({ data, error }) { + if (error) { + console.error(error); + return; + } -console.log(entities); + const entity = data.pop(); + if (entity && entity.entityId !== "0x0") { + // do whatever you need here + const model = entity.models.dojo_starter; + if (model?.Moves) { + await publishOffchainPositionCount(model.Moves); + } + } + } -process.on("SIGTERM", () => { - // NOTE: do not forget to free sub here; - sub.free(); - process.exit(0); -}); + const query = new HistoricalToriiQueryBuilder() + .withClause( + KeysClause( + [ModelsMapping.Moved, ModelsMapping.Moves], + [undefined] + ).build() + ) + .includeHashedKeys(); + + const events = await sdk.getEventMessages({ + query: query, + }); + positionCount = initPositionFromEvent(events); + + const [entities, sub] = await sdk.subscribeEntityQuery({ + query, + callback: onEntityUpdated, + }); + + console.log("Entities from worker", entities); + console.log(positionCount); -process.on("SIGINT", () => { - // NOTE: do not forget to free sub here; - sub.free(); - process.exit(0); + return []; + return [sub]; }); diff --git a/examples/example-node-worker/package.json b/examples/example-node-worker/package.json index 8dc18de4..c1a5979c 100644 --- a/examples/example-node-worker/package.json +++ b/examples/example-node-worker/package.json @@ -3,11 +3,22 @@ "version": "0.0.1", "private": true, "type": "module", + "scripts": { + "bun": "IDENTITY=0x0127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec SECRET_KEY=0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912 bun run main.ts", + "node": "IDENTITY=0x0127fd5f1fe78a71f8bcd1fec63e3fe2f0486b6ecd5c86a0466c3a21fa5cfcec SECRET_KEY=0xc5b2fcab997346f3ea1c00b002ecf6f382c5f9c9659a3894eb783c5320f912 node main.ts", + "build": "tsc -b" + }, "dependencies": { "@dojoengine/core": "workspace:*", - "@dojoengine/sdk": "workspace:*" + "@dojoengine/sdk": "workspace:*", + "@dojoengine/torii-wasm": "workspace:*", + "dotenv": "^16.4.7", + "starknet": "catalog:", + "websocket": "^1.0.35", + "zod": "^3.24.3" }, "devDependencies": { - "@types/node": "^22.14.1" + "@types/node": "^22.14.1", + "@types/websocket": "^1.0.10" } } diff --git a/examples/example-node-worker/src/typescript/contracts.gen.ts b/examples/example-node-worker/src/typescript/contracts.gen.ts new file mode 100644 index 00000000..c093a257 --- /dev/null +++ b/examples/example-node-worker/src/typescript/contracts.gen.ts @@ -0,0 +1,59 @@ +import { DojoProvider, DojoCall } from "@dojoengine/core"; +import { Account, AccountInterface, BigNumberish, CairoOption, CairoCustomEnum, ByteArray } from "starknet"; +import * as models from "./models.gen"; + +export function setupWorld(provider: DojoProvider) { + + const build_actions_move_calldata = (direction: CairoCustomEnum): DojoCall => { + return { + contractName: "actions", + entrypoint: "move", + calldata: [direction], + }; + }; + + const actions_move = async (snAccount: Account | AccountInterface, direction: CairoCustomEnum) => { + try { + return await provider.execute( + snAccount, + build_actions_move_calldata(direction), + "dojo_starter", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + const build_actions_spawn_calldata = (): DojoCall => { + return { + contractName: "actions", + entrypoint: "spawn", + calldata: [], + }; + }; + + const actions_spawn = async (snAccount: Account | AccountInterface) => { + try { + return await provider.execute( + snAccount, + build_actions_spawn_calldata(), + "dojo_starter", + ); + } catch (error) { + console.error(error); + throw error; + } + }; + + + + return { + actions: { + move: actions_move, + buildMoveCalldata: build_actions_move_calldata, + spawn: actions_spawn, + buildSpawnCalldata: build_actions_spawn_calldata, + }, + }; +} \ No newline at end of file diff --git a/examples/example-node-worker/src/typescript/models.gen.ts b/examples/example-node-worker/src/typescript/models.gen.ts new file mode 100644 index 00000000..695bd380 --- /dev/null +++ b/examples/example-node-worker/src/typescript/models.gen.ts @@ -0,0 +1,171 @@ +import type { SchemaType as ISchemaType } from "@dojoengine/sdk"; + +import { CairoCustomEnum, CairoOption, CairoOptionVariant, BigNumberish } from 'starknet'; + +// Type definition for `dojo_starter::models::DirectionsAvailable` struct +export interface DirectionsAvailable { + player: string; + directions: Array; +} + +// Type definition for `dojo_starter::models::DirectionsAvailableValue` struct +export interface DirectionsAvailableValue { + directions: Array; +} + +// Type definition for `dojo_starter::models::Moves` struct +export interface Moves { + player: string; + remaining: BigNumberish; + last_direction: CairoOption; + can_move: boolean; +} + +// Type definition for `dojo_starter::models::MovesValue` struct +export interface MovesValue { + remaining: BigNumberish; + last_direction: CairoOption; + can_move: boolean; +} + +// Type definition for `dojo_starter::models::Position` struct +export interface Position { + player: string; + vec: Vec2; +} + +// Type definition for `dojo_starter::models::PositionCount` struct +export interface PositionCount { + identity: string; + positition: Array<[BigNumberish, BigNumberish]>; +} + +// Type definition for `dojo_starter::models::PositionCountValue` struct +export interface PositionCountValue { + positition: Array<[BigNumberish, BigNumberish]>; +} + +// Type definition for `dojo_starter::models::PositionValue` struct +export interface PositionValue { + vec: Vec2; +} + +// Type definition for `dojo_starter::models::Vec2` struct +export interface Vec2 { + x: BigNumberish; + y: BigNumberish; +} + +// Type definition for `dojo_starter::systems::actions::actions::Moved` struct +export interface Moved { + player: string; + direction: DirectionEnum; +} + +// Type definition for `dojo_starter::systems::actions::actions::MovedValue` struct +export interface MovedValue { + direction: DirectionEnum; +} + +// Type definition for `dojo_starter::models::Direction` enum +export const direction = [ + 'Left', + 'Right', + 'Up', + 'Down', +] as const; +export type Direction = { [key in typeof direction[number]]: string }; +export type DirectionEnum = CairoCustomEnum; + +export interface SchemaType extends ISchemaType { + dojo_starter: { + DirectionsAvailable: DirectionsAvailable, + DirectionsAvailableValue: DirectionsAvailableValue, + Moves: Moves, + MovesValue: MovesValue, + Position: Position, + PositionCount: PositionCount, + PositionCountValue: PositionCountValue, + PositionValue: PositionValue, + Vec2: Vec2, + Moved: Moved, + MovedValue: MovedValue, + }, +} +export const schema: SchemaType = { + dojo_starter: { + DirectionsAvailable: { + player: "", + directions: [new CairoCustomEnum({ + Left: "", + Right: undefined, + Up: undefined, + Down: undefined, })], + }, + DirectionsAvailableValue: { + directions: [new CairoCustomEnum({ + Left: "", + Right: undefined, + Up: undefined, + Down: undefined, })], + }, + Moves: { + player: "", + remaining: 0, + last_direction: new CairoOption(CairoOptionVariant.None), + can_move: false, + }, + MovesValue: { + remaining: 0, + last_direction: new CairoOption(CairoOptionVariant.None), + can_move: false, + }, + Position: { + player: "", + vec: { x: 0, y: 0, }, + }, + PositionCount: { + identity: "", + positition: [[0, 0]], + }, + PositionCountValue: { + positition: [[0, 0]], + }, + PositionValue: { + vec: { x: 0, y: 0, }, + }, + Vec2: { + x: 0, + y: 0, + }, + Moved: { + player: "", + direction: new CairoCustomEnum({ + Left: "", + Right: undefined, + Up: undefined, + Down: undefined, }), + }, + MovedValue: { + direction: new CairoCustomEnum({ + Left: "", + Right: undefined, + Up: undefined, + Down: undefined, }), + }, + }, +}; +export enum ModelsMapping { + Direction = 'dojo_starter-Direction', + DirectionsAvailable = 'dojo_starter-DirectionsAvailable', + DirectionsAvailableValue = 'dojo_starter-DirectionsAvailableValue', + Moves = 'dojo_starter-Moves', + MovesValue = 'dojo_starter-MovesValue', + Position = 'dojo_starter-Position', + PositionCount = 'dojo_starter-PositionCount', + PositionCountValue = 'dojo_starter-PositionCountValue', + PositionValue = 'dojo_starter-PositionValue', + Vec2 = 'dojo_starter-Vec2', + Moved = 'dojo_starter-Moved', + MovedValue = 'dojo_starter-MovedValue', +} \ No newline at end of file diff --git a/examples/example-node-worker/tsconfig.json b/examples/example-node-worker/tsconfig.json new file mode 100644 index 00000000..7da5b8c4 --- /dev/null +++ b/examples/example-node-worker/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + // "composite": true, + "module": "nodenext", + "moduleResolution": "nodenext", + "declaration": true, + "sourceMap": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "skipLibCheck": true, + "strict": true, + "strictNullChecks": true, + "esModuleInterop": true, + "allowImportingTsExtensions": true + }, + "include": ["../*.ts"], + "references": [] +} diff --git a/examples/example-nodejs-bot/package.json b/examples/example-nodejs-bot/package.json index 8c1562df..03a1dc08 100644 --- a/examples/example-nodejs-bot/package.json +++ b/examples/example-nodejs-bot/package.json @@ -33,7 +33,6 @@ "scripts": { "build": "tsc", "serve": "tsc && node dist/src/index.js", - "codegen": "graphql-codegen", - "test": "echo \"Error: no test specified\"" + "codegen": "graphql-codegen" } } diff --git a/examples/example-vite-experimental-sdk/src/main.ts b/examples/example-vite-experimental-sdk/src/main.ts index 8ea0deb7..80335bdc 100644 --- a/examples/example-vite-experimental-sdk/src/main.ts +++ b/examples/example-vite-experimental-sdk/src/main.ts @@ -34,8 +34,7 @@ async function main() { const events = await sdk.getEvents( new ToriiQueryBuilder() .withClause(new ClauseBuilder().keys([], [undefined]).build()) - .build(), - true + .build() ); console.log("events", events); diff --git a/examples/example-vite-react-app-recs/src/dojo/setup.ts b/examples/example-vite-react-app-recs/src/dojo/setup.ts index 259334d0..11cf89dd 100644 --- a/examples/example-vite-react-app-recs/src/dojo/setup.ts +++ b/examples/example-vite-react-app-recs/src/dojo/setup.ts @@ -1,8 +1,8 @@ -import { DojoConfig, DojoProvider } from "@dojoengine/core"; +import { type DojoConfig, DojoProvider } from "@dojoengine/core"; import { BurnerManager } from "@dojoengine/create-burner"; import { getSyncEntities, getSyncEvents } from "@dojoengine/state"; import * as torii from "@dojoengine/torii-client"; -import { Account, ArraySignatureType } from "starknet"; +import { Account, type ArraySignatureType } from "starknet"; import { createClientComponents } from "./createClientComponents"; import { createSystemCalls } from "./createSystemCalls"; @@ -14,7 +14,7 @@ export type SetupResult = Awaited>; export async function setup({ ...config }: DojoConfig) { // Initialize Torii client for interacting with the Dojo network - const toriiClient = await torii.createClient({ + const toriiClient = new torii.ToriiClient({ toriiUrl: config.toriiUrl, relayUrl: "", worldAddress: config.manifest.world.address || "", diff --git a/examples/example-vite-react-phaser-recs/src/dojo/generated/setup.ts b/examples/example-vite-react-phaser-recs/src/dojo/generated/setup.ts index cd70868b..4cfcbccc 100644 --- a/examples/example-vite-react-phaser-recs/src/dojo/generated/setup.ts +++ b/examples/example-vite-react-phaser-recs/src/dojo/generated/setup.ts @@ -5,14 +5,14 @@ import { createSystemCalls } from "../createSystemCalls"; import { defineContractComponents } from "./contractComponents"; import { world } from "./world"; import { setupWorld } from "./generated"; -import { DojoConfig, DojoProvider } from "@dojoengine/core"; -import { ArraySignatureType } from "starknet"; +import { type DojoConfig, DojoProvider } from "@dojoengine/core"; +import type { ArraySignatureType } from "starknet"; export type SetupResult = Awaited>; export async function setup({ ...config }: DojoConfig) { // torii client - const toriiClient = await torii.createClient({ + const toriiClient = new torii.ToriiClient({ toriiUrl: config.toriiUrl, relayUrl: config.relayUrl, worldAddress: config.manifest.world.address || "", diff --git a/examples/example-vite-react-pwa-recs/src/dojo/generated/setup.ts b/examples/example-vite-react-pwa-recs/src/dojo/generated/setup.ts index 88de8eef..6e134ea4 100644 --- a/examples/example-vite-react-pwa-recs/src/dojo/generated/setup.ts +++ b/examples/example-vite-react-pwa-recs/src/dojo/generated/setup.ts @@ -14,7 +14,7 @@ export type SetupResult = Awaited>; export async function setup({ ...config }: DojoConfig) { // torii client - const toriiClient = await torii.createClient({ + const toriiClient = new torii.ToriiClient({ toriiUrl: config.toriiUrl, relayUrl: config.relayUrl, worldAddress: config.manifest.world.address || "", diff --git a/examples/example-vite-react-sdk/src/historical-events.tsx b/examples/example-vite-react-sdk/src/historical-events.tsx index ae38b878..aaffeec1 100644 --- a/examples/example-vite-react-sdk/src/historical-events.tsx +++ b/examples/example-vite-react-sdk/src/historical-events.tsx @@ -1,4 +1,8 @@ -import { KeysClause, ParsedEntity, ToriiQueryBuilder } from "@dojoengine/sdk"; +import { + KeysClause, + ParsedEntity, + HistoricalToriiQueryBuilder, +} from "@dojoengine/sdk"; import { useAccount } from "@starknet-react/core"; import { SchemaType } from "./typescript/models.gen"; import { addAddressPadding } from "starknet"; @@ -7,7 +11,7 @@ import { useHistoricalEventsQuery } from "@dojoengine/sdk/react"; export function HistoricalEvents() { const { account } = useAccount(); const events = useHistoricalEventsQuery( - new ToriiQueryBuilder().withClause( + new HistoricalToriiQueryBuilder().withClause( KeysClause( [], [addAddressPadding(account?.address ?? "0")], diff --git a/examples/example-vite-react-threejs-recs/src/dojo/generated/setup.ts b/examples/example-vite-react-threejs-recs/src/dojo/generated/setup.ts index ce205f00..c85dc334 100644 --- a/examples/example-vite-react-threejs-recs/src/dojo/generated/setup.ts +++ b/examples/example-vite-react-threejs-recs/src/dojo/generated/setup.ts @@ -1,8 +1,8 @@ -import { DojoConfig, DojoProvider } from "@dojoengine/core"; +import { type DojoConfig, DojoProvider } from "@dojoengine/core"; import { BurnerManager } from "@dojoengine/create-burner"; import { getSyncEntities } from "@dojoengine/state"; import * as torii from "@dojoengine/torii-client"; -import { Account, ArraySignatureType } from "starknet"; +import { Account, type ArraySignatureType } from "starknet"; import { createClientComponents } from "../createClientComponents"; import { createSystemCalls } from "../createSystemCalls"; @@ -14,7 +14,7 @@ export type SetupResult = Awaited>; export async function setup({ ...config }: DojoConfig) { // torii client - const toriiClient = await torii.createClient({ + const toriiClient = new torii.ToriiClient({ toriiUrl: config.toriiUrl, relayUrl: config.relayUrl, worldAddress: config.manifest.world.address || "", diff --git a/examples/example-vue-app-recs/src/dojo/generated/setup.ts b/examples/example-vue-app-recs/src/dojo/generated/setup.ts index 7637ca3d..b4933b5b 100644 --- a/examples/example-vue-app-recs/src/dojo/generated/setup.ts +++ b/examples/example-vue-app-recs/src/dojo/generated/setup.ts @@ -1,7 +1,7 @@ -import { DojoConfig, DojoProvider } from "@dojoengine/core"; +import { type DojoConfig, DojoProvider } from "@dojoengine/core"; import { getSyncEntities } from "@dojoengine/state"; import * as torii from "@dojoengine/torii-client"; -import { ArraySignatureType } from "starknet"; +import type { ArraySignatureType } from "starknet"; import { createClientComponents } from "../createClientComponents"; import { createSystemCalls } from "../createSystemCalls"; @@ -13,7 +13,7 @@ export type SetupResult = Awaited>; export async function setup({ ...config }: DojoConfig) { // torii client - const toriiClient = await torii.createClient({ + const toriiClient = new torii.ToriiClient({ toriiUrl: config.toriiUrl, relayUrl: "", worldAddress: config.manifest.world.address || "", diff --git a/package.json b/package.json index 002f6ff4..f45963ef 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "dev": "turbo watch dev --concurrency 20", "dev:deps": "turbo watch build:deps --concurrency 20", "docs": "turbo run docs --ui stream && typedoc --entryPointStrategy merge 'docs-json/*.json'", - "typedoc": "typedoc --options typedoc.json && typedoc" + "typedoc": "typedoc --options typedoc.json && typedoc", + "test": "turbo test", + "test:watch": "turbo watch test" }, "devDependencies": { "@commitlint/cli": "^18.6.1", diff --git a/packages/core/package.json b/packages/core/package.json index d769e687..86a220ba 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,7 +11,7 @@ "build": "pnpm build:deps", "format:check": "prettier --check .", "format": "prettier --write .", - "test": "vitest run --coverage", + "test": "vitest run --passWithNoTests --coverage", "docs": "typedoc" }, "exports": { diff --git a/packages/react/package.json b/packages/react/package.json index efadccc2..7f1f9085 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -9,7 +9,7 @@ "scripts": { "build:deps": "tsup --dts-resolve", "build": "pnpm build:deps", - "test": "echo \"Error: no test specified\"", + "test": "vitest run --passWithNoTests", "format:check": "prettier --check .", "format": "prettier --write .", "docs": "typedoc" @@ -35,7 +35,8 @@ "@types/react-dom": "^18.3.0", "@types/web": "^0.0.114", "tsup": "^8.3.5", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "vitest": "^3.1.2" }, "dependencies": { "@dojoengine/recs": "2.0.13", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 892c91ff..8807d712 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -57,6 +57,7 @@ "devDependencies": { "@anymud/bun-plugin-dts": "^1.0.2", "@rollup/plugin-commonjs": "^28.0.2", + "@types/node": "^22.14.1", "@vitest/coverage-v8": "^1.6.1", "benchmark": "^2.1.4", "bun-plugin-dts": "^0.3.0", @@ -85,6 +86,7 @@ "@starknet-react/chains": "catalog:", "@starknet-react/core": "catalog:", "immer": "^10.1.1", + "neverthrow": "^8.2.0", "zustand": "^4.5.6" }, "repository": { @@ -95,13 +97,7 @@ "url": "https://github.com/dojoengine/sdk/issues" }, "homepage": "https://github.com/dojoengine/sdk#readme", - "keywords": [ - "dojo", - "sdk", - "engine", - "typescript", - "torii" - ], + "keywords": ["dojo", "sdk", "engine", "typescript", "torii"], "engines": { "node": ">=18.0.0" } diff --git a/packages/sdk/src/__tests__/parseEntities.test.ts b/packages/sdk/src/__tests__/parseEntities.test.ts index c59b1fd1..959034bd 100644 --- a/packages/sdk/src/__tests__/parseEntities.test.ts +++ b/packages/sdk/src/__tests__/parseEntities.test.ts @@ -7,9 +7,11 @@ import { SchemaType } from "./models.gen.ts"; describe("parseEntities", () => { it("should parse entities correctly", () => { - const mockEntities: torii.Entities = { - "0x14c362c17947ef1d40152d6e3bedd859c98bebfad41f75ef3f26798556a4c85": - { + const mockEntities: torii.Entity[] = [ + { + hashed_keys: + "0x14c362c17947ef1d40152d6e3bedd859c98bebfad41f75ef3f26798556a4c85", + models: { "dojo_starter-Position": { player: { type: "primitive", @@ -72,8 +74,11 @@ describe("parseEntities", () => { }, }, }, - "0x144c128b8ead7d0da39c6a150abbfdd38f572ba9418d3e36929eb6107b4ce4d": - { + }, + { + hashed_keys: + "0x144c128b8ead7d0da39c6a150abbfdd38f572ba9418d3e36929eb6107b4ce4d", + models: { "dojo_starter-Moves": { remaining: { type: "primitive", @@ -136,7 +141,8 @@ describe("parseEntities", () => { }, }, }, - }; + }, + ]; const result = parseEntities(mockEntities); @@ -187,9 +193,11 @@ describe("parseEntities", () => { }); it("should parse Options", () => { - const toriiResult: torii.Entities = { - "0x43ebbfee0476dcc36cae36dfa9b47935cc20c36cb4dc7d014076e5f875cf164": - { + const toriiResult: torii.Entity[] = [ + { + hashed_keys: + "0x43ebbfee0476dcc36cae36dfa9b47935cc20c36cb4dc7d014076e5f875cf164", + models: { "onchain_dash-CallerCounter": { counter: { type: "primitive", @@ -219,7 +227,8 @@ describe("parseEntities", () => { }, }, }, - }; + }, + ]; const res = parseEntities(toriiResult); const expected = new CairoOption(CairoOptionVariant.Some, 1734537235); expect(res[0]?.models?.onchain_dash?.CallerCounter?.timestamp).toEqual( @@ -227,9 +236,11 @@ describe("parseEntities", () => { ); }); it("should parse complex enums", () => { - const toriiResult: torii.Entities = { - "0x5248d30cafd7af5e7f9255ed9bef2bd7aa0f191669a4c1e3a03b8c64ea5a9d8": - { + const toriiResult: torii.Entity[] = [ + { + hashed_keys: + "0x5248d30cafd7af5e7f9255ed9bef2bd7aa0f191669a4c1e3a03b8c64ea5a9d8", + models: { "onchain_dash-Theme": { theme_key: { type: "primitive", @@ -273,16 +284,19 @@ describe("parseEntities", () => { }, }, }, - }; + }, + ]; const res = parseEntities(toriiResult); const expected = new CairoCustomEnum({ Predefined: "Dojo" }); expect(res[0]?.models?.onchain_dash?.Theme?.value).toEqual(expected); }); it("should parse enum with nested struct", () => { - const toriiResult: torii.Entities = { - "0x5248d30cafd7af5e7f9255ed9bef2bd7aa0f191669a4c1e3a03b8c64ea5a9d8": - { + const toriiResult: torii.Entity[] = [ + { + hashed_keys: + "0x5248d30cafd7af5e7f9255ed9bef2bd7aa0f191669a4c1e3a03b8c64ea5a9d8", + models: { "onchain_dash-Theme": { theme_key: { type: "primitive", @@ -325,7 +339,8 @@ describe("parseEntities", () => { }, }, }, - }; + }, + ]; const res = parseEntities(toriiResult); const expected = new CairoCustomEnum({ Custom: { diff --git a/packages/sdk/src/__tests__/parseHistoricalEvents.test.ts b/packages/sdk/src/__tests__/parseHistoricalEvents.test.ts deleted file mode 100644 index 49031421..00000000 --- a/packages/sdk/src/__tests__/parseHistoricalEvents.test.ts +++ /dev/null @@ -1,796 +0,0 @@ -import * as torii from "@dojoengine/torii-wasm"; -import { describe, expect, it } from "vitest"; - -import { - parseHistoricalEvents, - orderKeys, -} from "../internal/parseHistoricalEvents"; - -describe("parseHistoricalEvents", () => { - it("should preserve order", () => { - const res1 = parseHistoricalEvents( - toriiResultUnsorted as torii.Entities, - { logging: false } - ); - const res2 = parseHistoricalEvents( - toriiResultSorted as torii.Entities, - { logging: false } - ); - - expect(res1).toEqual(res2); - }); - it("should order keys", () => { - const key1Unsorted = Object.keys( - toriiResultUnsorted[ - "0x681d68850e9c98f4383832aa206f00de22040754d6094f7b9a5a6802c25d2a3" - ] - ); - const key2Sorted = Object.keys( - toriiResultSorted[ - "0x681d68850e9c98f4383832aa206f00de22040754d6094f7b9a5a6802c25d2a3" - ] - ); - expect(key1Unsorted).not.toEqual(key2Sorted); - - expect(orderKeys(key1Unsorted)).toEqual(orderKeys(key2Sorted)); - expect(orderKeys(key1Unsorted)).toEqual(orderKeys(key1Unsorted)); - expect(orderKeys(key2Sorted)).toEqual(orderKeys(key2Sorted)); - }); -}); - -const toriiResultUnsorted = { - "0x681d68850e9c98f4383832aa206f00de22040754d6094f7b9a5a6802c25d2a3": { - "dojo_starter-Moved-5": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-14": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-3": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-11": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-8": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-13": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-6": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-2": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-12": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-9": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-15": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-16": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-7": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-10": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-4": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-1": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - }, -}; -const toriiResultSorted = { - "0x681d68850e9c98f4383832aa206f00de22040754d6094f7b9a5a6802c25d2a3": { - "dojo_starter-Moved": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-1": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-2": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-3": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Up", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-4": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-5": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-6": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-7": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-8": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-9": { - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Down", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - }, - "dojo_starter-Moved-10": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-11": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-12": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-13": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-14": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-15": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - "dojo_starter-Moved-16": { - direction: { - type: "enum", - type_name: "Direction", - value: { - option: "Right", - value: { - type: "tuple", - type_name: "()", - value: [], - key: false, - }, - }, - key: false, - }, - player: { - type: "primitive", - type_name: "ContractAddress", - value: "0x013d9ee239f33fea4f8785b9e3870ade909e20a9599ae7cd62c1c292b73af1b7", - key: true, - }, - }, - }, -}; diff --git a/packages/sdk/src/__tests__/state.test.ts b/packages/sdk/src/__tests__/state.test.ts index 6cd1b7a9..bcc18dee 100644 --- a/packages/sdk/src/__tests__/state.test.ts +++ b/packages/sdk/src/__tests__/state.test.ts @@ -105,10 +105,10 @@ describe("createDojoStore", () => { ]); const state = useStore.getState(); expect(state.getEntities()).toHaveLength(4); - expect(state.entities["player1"]).toEqual(initialPlayer); - expect(state.entities["game1"]).toEqual(initialGame); - expect(state.entities["item1"]).toEqual(initialItem); - expect(state.entities["galaxy1"]).toEqual(initialGalaxy); + expect(state.entities.player1).toEqual(initialPlayer); + expect(state.entities.game1).toEqual(initialGame); + expect(state.entities.item1).toEqual(initialItem); + expect(state.entities.galaxy1).toEqual(initialGalaxy); state.resetStore(); expect(state.getEntities()).toHaveLength(0); }); @@ -119,10 +119,11 @@ describe("createDojoStore", () => { entityId: "player1", models: { world: { player: { score: 120 } }, universe: {} }, }; + useStore.getState().mergeEntities([updatedPlayer]); const state = useStore.getState(); expect(state.getEntities()).toHaveLength(1); - const player = state.entities["player1"]; + const player = state.entities.player1; expect(player.models.world?.player?.name).toEqual("Alice"); expect(player.models.world?.player?.score).toEqual(120); }); @@ -142,7 +143,7 @@ describe("createDojoStore", () => { }); const state = useStore.getState(); expect(state.getEntities()).toHaveLength(1); - expect(state.entities["player1"].models.world?.player?.name).toEqual( + expect(state.entities.player1.models.world?.player?.name).toEqual( "Bob" ); }); diff --git a/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts b/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts index 5d55a705..a5aaf4fc 100644 --- a/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts +++ b/packages/sdk/src/__tests__/toriiQueryBuilder.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { ToriiQueryBuilder } from "../internal/toriiQueryBuilder"; -import { Clause, OrderBy } from "@dojoengine/torii-wasm"; -import { SchemaType } from "../internal/types"; +import type { Clause, OrderBy } from "@dojoengine/torii-wasm"; +import type { SchemaType } from "../internal/types"; import { ClauseBuilder } from "../web/clauseBuilder"; interface TestModels extends SchemaType { @@ -22,17 +22,17 @@ interface TestModels extends SchemaType { describe("ToriiQueryBuilder", () => { describe("basic query building", () => { it("override default options", () => { - const builder = new ToriiQueryBuilder({ limit: 25 }); + const builder = new ToriiQueryBuilder({ + pagination: { limit: 25 }, + }); const query = builder.build(); expect(query).toEqual({ - limit: 25, - offset: 0, + pagination: { limit: 25 }, clause: undefined, - dont_include_hashed_keys: true, - order_by: [], - entity_models: [], - entity_updated_after: 0, + no_hashed_keys: true, + models: [], + historical: false, }); }); @@ -41,22 +41,25 @@ describe("ToriiQueryBuilder", () => { const query = builder.build(); expect(query).toEqual({ - limit: 100, - offset: 0, + pagination: { + limit: 100, + cursor: undefined, + direction: "Forward", + order_by: [], + }, clause: undefined, - dont_include_hashed_keys: true, - order_by: [], - entity_models: [], - entity_updated_after: 0, + no_hashed_keys: true, + models: [], + historical: false, }); }); it("should set limit and offset", () => { const builder = new ToriiQueryBuilder(); - const query = builder.withLimit(10).withOffset(20).build(); + const query = builder.withLimit(10).withCursor("cursor").build(); - expect(query.limit).toBe(10); - expect(query.offset).toBe(20); + expect(query.pagination.limit).toBe(10); + expect(query.pagination.cursor).toBe("cursor"); }); it("should set clause", () => { @@ -89,7 +92,7 @@ describe("ToriiQueryBuilder", () => { .addOrderBy("dojo_starter", "x", "Asc") .build(); - expect(query.order_by).toEqual([ + expect(query.pagination.order_by).toEqual([ { model: "dojo_starter", member: "x", direction: "Asc" }, ]); }); @@ -103,7 +106,7 @@ describe("ToriiQueryBuilder", () => { const builder = new ToriiQueryBuilder(); const query = builder.withOrderBy(orderBy).build(); - expect(query.order_by).toEqual(orderBy); + expect(query.pagination.order_by).toEqual(orderBy); }); }); @@ -112,73 +115,67 @@ describe("ToriiQueryBuilder", () => { const builder = new ToriiQueryBuilder(); const query = builder.addEntityModel("dojo_starter").build(); - expect(query.entity_models).toEqual(["dojo_starter"]); + expect(query.models).toEqual(["dojo_starter"]); }); it("should set multiple entity models", () => { const builder = new ToriiQueryBuilder(); const query = builder.withEntityModels(["dojo_starter"]).build(); - expect(query.entity_models).toEqual(["dojo_starter"]); + expect(query.models).toEqual(["dojo_starter"]); }); }); - describe("timestamp and hashed keys handling", () => { - it("should set updated after timestamp", () => { - const timestamp = Date.now(); - const builder = new ToriiQueryBuilder(); - const query = builder.updatedAfter(timestamp).build(); - - expect(query.entity_updated_after).toBe(timestamp); - }); - + describe("hashed keys handling", () => { it("should handle hashed keys inclusion", () => { const builder = new ToriiQueryBuilder(); const query = builder.includeHashedKeys().build(); - expect(query.dont_include_hashed_keys).toBe(false); + expect(query.no_hashed_keys).toBe(false); }); }); describe("static methods", () => { it("should create a paginated query", () => { const query = ToriiQueryBuilder.withPagination( - 2, - 25 + "cursor", + 25, + "Forward" ).build(); - expect(query.limit).toBe(25); - expect(query.offset).toBe(50); + expect(query.pagination.limit).toBe(25); + expect(query.pagination.cursor).toBe("cursor"); }); }); describe("chaining", () => { it("should support method chaining", () => { - const timestamp = Date.now(); const builder = new ToriiQueryBuilder(); const query = builder .withLimit(10) - .withOffset(20) + .withCursor("cursor") .addEntityModel("dojo_starter-Position") .addOrderBy("dojo_starter-Position", "x", "Asc") .includeHashedKeys() - .updatedAfter(timestamp) .build(); expect(query).toEqual({ - limit: 10, - offset: 20, + pagination: { + limit: 10, + cursor: "cursor", + direction: "Forward", + order_by: [ + { + model: "dojo_starter-Position", + member: "x", + direction: "Asc", + }, + ], + }, clause: undefined, - dont_include_hashed_keys: false, - order_by: [ - { - model: "dojo_starter-Position", - member: "x", - direction: "Asc", - }, - ], - entity_models: ["dojo_starter-Position"], - entity_updated_after: timestamp, + no_hashed_keys: false, + models: ["dojo_starter-Position"], + historical: false, }); }); }); diff --git a/packages/sdk/src/__tests__/zustand.perf.test.ts b/packages/sdk/src/__tests__/zustand.perf.test.ts index b36857eb..349ebdb7 100644 --- a/packages/sdk/src/__tests__/zustand.perf.test.ts +++ b/packages/sdk/src/__tests__/zustand.perf.test.ts @@ -128,8 +128,9 @@ describe("Zustand Store Performance Tests", () => { useStore .getState() .applyOptimisticUpdate("txn_perf", (draft) => { - draft.entities["entity500"].models.world! - .item!.durability = 75; + draft.entities[ + "entity500" + ].models.world!.item!.durability = 75; }); }) .on("cycle", (event: any) => { diff --git a/packages/sdk/src/internal/errors.ts b/packages/sdk/src/internal/errors.ts new file mode 100644 index 00000000..f3dc0fc5 --- /dev/null +++ b/packages/sdk/src/internal/errors.ts @@ -0,0 +1,3 @@ +export const NO_SIGNER = "No signer configured in sdk.init()"; +export const NO_IDENTITY = "No identity configured in sdk.init()"; +export const NO_ACCOUNT = "Account is undefined"; diff --git a/packages/sdk/src/internal/generateTypedData.ts b/packages/sdk/src/internal/generateTypedData.ts index cecc2601..59e0fe83 100644 --- a/packages/sdk/src/internal/generateTypedData.ts +++ b/packages/sdk/src/internal/generateTypedData.ts @@ -17,7 +17,8 @@ export function generateTypedData< nsModel: string, message: M, domain: StarknetDomain, - modelMapping?: Array<{ name: string; type: string }> + modelMapping?: Array<{ name: string; type: string }>, + additionnalTypes?: Record> ): TypedData { return { types: { @@ -27,6 +28,7 @@ export function generateTypedData< { name: "chainId", type: "shortstring" }, { name: "revision", type: "shortstring" }, ], + ...additionnalTypes, [nsModel]: undefined !== modelMapping ? modelMapping diff --git a/packages/sdk/src/internal/merge.ts b/packages/sdk/src/internal/merge.ts new file mode 100644 index 00000000..fa7dee9f --- /dev/null +++ b/packages/sdk/src/internal/merge.ts @@ -0,0 +1,160 @@ +import { CairoCustomEnum, CairoOption, CairoOptionVariant } from "starknet"; +import type { ParsedEntity, SchemaType } from "./types"; + +/** + * Check if a value is a CairoOption + * @param value - The value to check + * @returns True if the value is a CairoOption, false otherwise + */ +export function isCairoOption(value: unknown): value is CairoOption { + return value instanceof CairoOption; +} + +/** + * Merge two CairoOption instances + * @param target - The target CairoOption + * @param source - The source CairoOption + * @returns A new CairoOption instance with the merged value + */ +export function mergeCairoOption( + target: MergedModels, + source: Partial> +): MergedModels { + // If source is Some, prefer source's value + if (source instanceof CairoOption && source.isSome()) { + return new CairoOption( + CairoOptionVariant.Some, + source.unwrap() + ) as unknown as MergedModels; + } + + // If source is None or undefined, keep target + if (target instanceof CairoOption) { + if (target.isSome()) { + return new CairoOption( + CairoOptionVariant.Some, + target.unwrap() + ) as unknown as MergedModels; + } + return new CairoOption( + CairoOptionVariant.None + ) as unknown as MergedModels; + } + + // This should not happen if both are CairoOption instances + return target as unknown as MergedModels; +} + +/** + * Check if a value is a CairoCustomEnum + * @param value - The value to check + * @returns True if the value is a CairoCustomEnum, false otherwise + */ +export function isCairoCustomEnum(value: unknown): value is CairoCustomEnum { + return value instanceof CairoCustomEnum; +} + +/** + * Merge two CairoCustomEnum instances + * @param target - The target CairoCustomEnum + * @param source - The source CairoCustomEnum + * @returns A new CairoCustomEnum instance with the merged value + */ +export function mergeCairoCustomEnum( + target: MergedModels, + source: Partial> +): MergedModels { + if (!isCairoCustomEnum(target) || !isCairoCustomEnum(source)) { + return target; + } + // If source has an active variant, prefer it + const sourceActiveVariant = source.activeVariant(); + const sourceValue = source.unwrap(); + + if (sourceActiveVariant && sourceValue !== undefined) { + // Create a new enum with source's active variant + const newEnumContent: Record = {}; + + // Initialize all variants from target with undefined + for (const key in target.variant) { + newEnumContent[key] = undefined; + } + + // Set the active variant from source + newEnumContent[sourceActiveVariant] = sourceValue; + + return new CairoCustomEnum( + newEnumContent + ) as unknown as MergedModels; + } + + // If source doesn't have an active variant, keep target + const targetActiveVariant = target.activeVariant(); + const targetValue = target.unwrap(); + + if (targetActiveVariant && targetValue !== undefined) { + const newEnumContent: Record = {}; + + // Initialize all variants with undefined + for (const key in target.variant) { + newEnumContent[key] = undefined; + } + + // Set the active variant from target + newEnumContent[targetActiveVariant] = targetValue; + + return new CairoCustomEnum( + newEnumContent + ) as unknown as MergedModels; + } + + // Fallback if not both CairoCustomEnum + return target; +} + +/** + * Merged models type + * @template T - The schema type + * @returns The merged models type + */ +export type MergedModels = + ParsedEntity["models"][keyof ParsedEntity["models"]]; + +export function deepMerge( + target: MergedModels, + source: Partial> +): MergedModels { + if (isCairoOption(target) && isCairoOption(source)) { + return mergeCairoOption(target, source); + } + if (isCairoCustomEnum(target) && isCairoCustomEnum(source)) { + return mergeCairoCustomEnum(target, source); + } + const result = { ...target } as Record; + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + if ( + source[key] !== null && + typeof source[key] === "object" && + !Array.isArray(source[key]) + ) { + // If the property is an object in both source and target, recursively merge + if ( + key in target && + typeof target[key] === "object" && + !Array.isArray(target[key]) + ) { + result[key] = deepMerge(target[key], source[key]); + } else { + // If the key doesn't exist in target or isn't an object, just assign + result[key] = source[key]; + } + } else { + // For non-objects (primitives, arrays, null), just assign + result[key] = source[key]; + } + } + } + + return result; +} diff --git a/packages/sdk/src/internal/models.ts b/packages/sdk/src/internal/models.ts new file mode 100644 index 00000000..ea95f86b --- /dev/null +++ b/packages/sdk/src/internal/models.ts @@ -0,0 +1,77 @@ +import type { BigNumberish } from "starknet"; +import type { SchemaType, StandardizedQueryResult } from "./types.ts"; + +/** + * Custom hook to retrieve a specific model for a given entityId within a specified namespace. + * + * @param entityId - The ID of the entity. + * @param model - The model to retrieve, specified as a string in the format "namespace-modelName". + * @returns The model structure if found, otherwise undefined. + */ +export function getModelByEntityId< + N extends keyof SchemaType, + M extends keyof SchemaType[N] & string, + Schema extends SchemaType +>( + entityId: BigNumberish, + model: `${N}-${M}`, + value: StandardizedQueryResult +): SchemaType[N][M] | undefined { + const [namespace, modelName] = model.split("-") as [N, M]; + for (const v of value) { + if (v.entityId !== entityId) { + continue; + } + return v.models?.[namespace]?.[modelName] as + | SchemaType[N][M] + | undefined; + } +} + +/** + * Custom hook to retrieve a specific model for a given entityId within a specified namespace. + * + * @param entityId - The ID of the entity. + * @param model - The model to retrieve, specified as a string in the format "namespace-modelName". + * @returns The model structure if found, otherwise undefined. + */ +export function getModel< + N extends keyof SchemaType, + M extends keyof SchemaType[N] & string, + Schema extends SchemaType +>( + model: `${N}-${M}`, + value: StandardizedQueryResult +): SchemaType[N][M] | undefined { + const [namespace, modelName] = model.split("-") as [N, M]; + for (const v of value) { + return v.models?.[namespace]?.[modelName] as + | SchemaType[N][M] + | undefined; + } +} + +// /** +// * Custom hook to retrieve all entities that have a specific model. +// * +// * @param model - The model to retrieve, specified as a string in the format "namespace-modelName". +// * @returns The model structure if found, otherwise undefined. +// */ +// export function getModels< +// N extends keyof SchemaType, +// M extends keyof SchemaType[N] & string, +// Client extends (...args: any) => any, +// Schema extends SchemaType, +// >(model: `${N}-${M}`): { [entityId: string]: SchemaType[N][M] | undefined } { +// const [namespace, modelName] = model.split("-") as [N, M]; +// const { useDojoStore } = +// useContext>(DojoContext); +// +// const modelData = useDojoStore((state) => +// state.getEntitiesByModel(namespace, modelName).map((entity) => ({ +// [entity.entityId]: entity.models?.[namespace]?.[modelName], +// })) +// ) as unknown as { [entityId: string]: SchemaType[N][M] | undefined }; +// +// return modelData; +// } diff --git a/packages/sdk/src/internal/parseEntities.ts b/packages/sdk/src/internal/parseEntities.ts index 8f58657b..7b62c9fe 100644 --- a/packages/sdk/src/internal/parseEntities.ts +++ b/packages/sdk/src/internal/parseEntities.ts @@ -8,24 +8,24 @@ import type { import { CairoCustomEnum, CairoOption, CairoOptionVariant } from "starknet"; export function parseEntities( - entities: torii.Entities, + entities: torii.Entity[], options?: { logging?: boolean } ): StandardizedQueryResult { // @ts-ignore - const result: Record = {}; - const entityIds = Object.keys(entities); + const result: ParsedEntity[] = []; - entityIds.forEach((entityId) => { - const entityData = entities[entityId]; + for (const entity of entities) { + const entityId = entity.hashed_keys; + const entityData = entity.models; const parsedEntity: ParsedEntity = { entityId, models: {} as ParsedEntity["models"], }; - for (const modelName in entityData) { + for (const modelName in entity.models) { const [schemaKey, modelKey] = modelName.split("-") as [ keyof T, - string + string, ]; if (!schemaKey || !modelKey) { @@ -44,13 +44,12 @@ export function parseEntities( ); } - result[entityId] = parsedEntity; + result.push(parsedEntity); if (options?.logging) { console.log(`Parsed entity:`, parsedEntity); } - return parsedEntity; - }); + } if (options?.logging) { console.log("Parsed result:", result); @@ -88,6 +87,7 @@ function parseValue(value: torii.Ty): any { // Handling simple enum as default case // Handling CairoCustomEnum for more complex types return parseCustomEnum(value); + case "tuple": case "array": return (value.value as torii.Ty[]).map(parseValue); default: @@ -125,7 +125,12 @@ function parseCustomEnum(value: torii.Ty): CairoCustomEnum | string { function parsePrimitive(value: torii.Ty): any { switch (value.type_name) { case "u64": - return parseInt(value.value as string, 16); + return Number.parseInt(value.value as string, 16); + case "i256": + case "i128": + case "u256": + case "u128": + return BigInt(value.value as string); default: return value.value; } diff --git a/packages/sdk/src/internal/parseHistoricalEvents.ts b/packages/sdk/src/internal/parseHistoricalEvents.ts deleted file mode 100644 index 34d82f19..00000000 --- a/packages/sdk/src/internal/parseHistoricalEvents.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type * as torii from "@dojoengine/torii-wasm/types"; -import type { SchemaType, StandardizedQueryResult } from "./types.ts"; - -import { parseEntities } from "./parseEntities.ts"; - -/** - * Parses historical events returned by torii - * - * @template T - The schema type. - * @param {torii.Entities} entities - The collection of entities to parse. - * @param {{ logging?: boolean }} [options] - Optional settings for logging. - * @returns {StandardizedQueryResult} - The parsed entities in a standardized query result format. - * - * @example - * const parsedResult = parseHistoricalEvents(entities, { logging: true }); - * console.log(parsedResult); - */ -export function parseHistoricalEvents( - entities: torii.Entities, - options?: { logging?: boolean } -): StandardizedQueryResult { - if (options?.logging) { - console.log("Raw historical events", entities); - } - // Events come from torii flagged as "dojo_starter-Moved-idx" - let events: StandardizedQueryResult = []; - for (const entityId in entities) { - const entityData = entities[entityId]; - const keys = orderKeys(Object.keys(entityData)); - - for (const model of keys) { - const modelData = entityData[model]; - const modelNameSplit = model.split("-"); - modelNameSplit.pop(); - // event at index 0 does not have index thus, we take modelName as is - const modelName = - modelNameSplit.length > 1 ? modelNameSplit.join("-") : model; - - events.push( - ...parseEntities( - { [entityId]: { [modelName]: modelData } }, - options - ) - ); - } - } - if (options?.logging) { - console.log("Parsed historical events", events); - } - - return events; -} - -/** - * Torii entities comes in format: - * { - * "entityId": { - * "ns-Model-idx": { - * ...toriiData - * } - * } - * } - * - * Object.keys returns keys but is not respecting defined keys order. - * Therefore, we need do sort keys before building up final parsedEntities array. - */ -export function orderKeys(keys: string[]) { - keys.sort((a, b) => { - // Extract the last number from each string using regex - const getLastNumber = (str: string) => { - const match = str.match(/-(\d+)$/); - return match ? parseInt(match[1]) : 0; - }; - - return getLastNumber(a) - getLastNumber(b); - }); - return keys; -} diff --git a/packages/sdk/src/internal/toriiQueryBuilder.ts b/packages/sdk/src/internal/toriiQueryBuilder.ts index 542e5863..36f40ef2 100644 --- a/packages/sdk/src/internal/toriiQueryBuilder.ts +++ b/packages/sdk/src/internal/toriiQueryBuilder.ts @@ -1,14 +1,22 @@ -import type { Clause, OrderBy, Query } from "@dojoengine/torii-wasm/types"; +import type { + Clause, + OrderBy, + Query, + PaginationDirection, +} from "@dojoengine/torii-wasm/types"; import type { SchemaType } from "./types.ts"; const defaultToriiOptions = () => ({ - limit: 100, // default limit - offset: 0, + pagination: { + limit: 100, + cursor: undefined, + direction: "Forward", + order_by: [], + }, clause: undefined, - dont_include_hashed_keys: true, - order_by: [], - entity_models: [], - entity_updated_after: 0, + no_hashed_keys: true, + models: [], + historical: false, }); type ToriiQueryBuilderOptions = Omit, "clause">; @@ -17,22 +25,40 @@ export class ToriiQueryBuilder { private query: Query; constructor(options?: ToriiQueryBuilderOptions) { - this.query = { ...defaultToriiOptions(), ...options }; + this.query = { ...(defaultToriiOptions() as Query), ...options }; } /** * Set the maximum number of results to return */ withLimit(limit: number): ToriiQueryBuilder { - this.query.limit = limit; + this.query.pagination.limit = limit; return this; } /** * Set the offset for pagination + * @deprecated Use `withCursor` instead */ - withOffset(offset: number): ToriiQueryBuilder { - this.query.offset = offset; + withOffset(): ToriiQueryBuilder { + return this; + } + + /** + * Set the cursor for pagination + * undefined is default, fetch from starting point + * `next_cursor` is return from queries + */ + withCursor(cursor: string): ToriiQueryBuilder { + this.query.pagination.cursor = cursor; + return this; + } + + /** + * Set the maximum number of results to return + */ + withDirection(direction: PaginationDirection): ToriiQueryBuilder { + this.query.pagination.direction = direction; return this; } @@ -49,7 +75,7 @@ export class ToriiQueryBuilder { * HashedKeys represent internal torii entity id. */ includeHashedKeys(): ToriiQueryBuilder { - this.query.dont_include_hashed_keys = false; + this.query.no_hashed_keys = false; return this; } @@ -61,7 +87,7 @@ export class ToriiQueryBuilder { member: string, direction: "Asc" | "Desc" ): ToriiQueryBuilder { - this.query.order_by.push({ + this.query.pagination.order_by.push({ model, member, direction, @@ -73,7 +99,7 @@ export class ToriiQueryBuilder { * Add multiple order by clauses at once */ withOrderBy(orderBy: OrderBy[]): ToriiQueryBuilder { - this.query.order_by = orderBy; + this.query.pagination.order_by = orderBy; return this; } @@ -81,7 +107,7 @@ export class ToriiQueryBuilder { * Add a single entity model to filter */ addEntityModel(model: keyof T & string): ToriiQueryBuilder { - this.query.entity_models.push(model); + this.query.models.push(model); return this; } @@ -89,15 +115,7 @@ export class ToriiQueryBuilder { * Set multiple entity models at once */ withEntityModels(models: (keyof T & string)[]): ToriiQueryBuilder { - this.query.entity_models = models; - return this; - } - - /** - * Set the minimum timestamp for entity updates - */ - updatedAfter(timestamp: number): ToriiQueryBuilder { - this.query.entity_updated_after = timestamp; + this.query.models = models; return this; } @@ -110,13 +128,32 @@ export class ToriiQueryBuilder { /** * Create a new builder instance with pagination settings + * */ static withPagination>>( - page: number, - pageSize: number + cursor: string, + limit: number, + direction: PaginationDirection ): ToriiQueryBuilder { return new ToriiQueryBuilder() - .withLimit(pageSize) - .withOffset(page * pageSize); + .withLimit(limit) + .withCursor(cursor) + .withDirection(direction); + } +} + +export type HistoricalToriiQueryBuilderOptions = Omit< + Partial, + "historical" +>; +export class HistoricalToriiQueryBuilder< + T extends SchemaType +> extends ToriiQueryBuilder { + constructor(options?: ToriiQueryBuilderOptions) { + super({ + ...(defaultToriiOptions() as Query), + ...options, + historical: true, + }); } } diff --git a/packages/sdk/src/internal/types.ts b/packages/sdk/src/internal/types.ts index a828ba1a..6b4ed8b7 100644 --- a/packages/sdk/src/internal/types.ts +++ b/packages/sdk/src/internal/types.ts @@ -1,6 +1,7 @@ import type * as torii from "@dojoengine/torii-wasm/types"; import type { Account, StarknetDomain, TypedData } from "starknet"; import { ToriiQueryBuilder } from "./toriiQueryBuilder.ts"; +import type { Result } from "neverthrow"; /** * Utility type to ensure at least one property is present @@ -361,10 +362,13 @@ export interface SDK { nsModel: string, message: M, modelMapping?: Array<{ name: string; type: string }>, - domain?: StarknetDomain + additionalTypes?: Record> ) => TypedData; - sendMessage: (data: TypedData, account: Account) => Promise; + sendMessage: ( + data: TypedData, + account?: Account + ) => Promise>; /** * @param {string[]} contract_addresses @@ -507,6 +511,16 @@ export interface SDKConfig { * It typically includes details like the chain ID, name, and version. */ domain: StarknetDomain; + + /** + * If you use torii builtin's OffchainMessages, we'll require that you provide signer + */ + signer?: torii.SigningKey; + /** + * If you use torii builtin's OffchainMessages, we'll require that you provide identity. + * This is your backend wallet address. This will be used to sign offchain messages. This *has* to map to `identity` field in your dojo model + */ + identity?: string; /** * Wether to include logger in queries and subscdription. * Could be useful while debugging @@ -527,7 +541,7 @@ export interface SubscribeParams< query: ToriiQueryBuilder; // The callback function to handle the response. callback: SubscriptionCallback>; - // historical events + // @deprecated: use `query.historical` instead historical?: Historical; } @@ -537,7 +551,7 @@ export interface GetParams< > { // The query object used to filter entities. query: ToriiQueryBuilder; - // historical events + // @deprecated: use `query.historical` instead historical?: Historical; } export { ToriiQueryBuilder }; diff --git a/packages/sdk/src/node/index.ts b/packages/sdk/src/node/index.ts index 280b2a72..8f63adad 100644 --- a/packages/sdk/src/node/index.ts +++ b/packages/sdk/src/node/index.ts @@ -16,7 +16,7 @@ import type { StandardizedQueryResult, } from "../internal/types.ts"; import { generateTypedData } from "../internal/generateTypedData.ts"; -import type { Account, Signature, StarknetDomain, TypedData } from "starknet"; +import type { Account, TypedData } from "starknet"; import { getTokenBalances, getTokens, @@ -26,10 +26,14 @@ import { } from "../internal/token.ts"; import { parseEntities } from "../internal/parseEntities.ts"; import { intoEntityKeysClause } from "../internal/convertClauseToEntityKeysClause.ts"; -import { parseHistoricalEvents } from "../internal/parseHistoricalEvents.ts"; +import { err, ok, type Result } from "neverthrow"; +import { NO_IDENTITY, NO_SIGNER } from "../internal/errors.ts"; export * from "../internal/toriiQueryBuilder.ts"; export * from "./clauseBuilder.ts"; +export * from "./worker.ts"; +export * from "../internal/types.ts"; +export * from "../internal/models.ts"; export const defaultClientConfig: Partial = { toriiUrl: "http://localhost:8080", @@ -43,7 +47,7 @@ export async function init( ...defaultClientConfig, ...options.client, } as torii.ClientConfig; - const client = await torii.createClient(clientConfig); + const client = await new torii.ToriiClient(clientConfig); return { client, @@ -57,7 +61,7 @@ export async function init( const q = query.build(); if ( - q.dont_include_hashed_keys && + q.no_hashed_keys && q.clause && !Object.hasOwn(q.clause, "Keys") ) { @@ -66,18 +70,18 @@ export async function init( ); } const entities = parseEntities( - await client.getEntities(q, false) + (await client.getEntities(q)).items ); return [ entities, client.onEntityUpdated( intoEntityKeysClause(q.clause, entities), - (entityId: string, entityData: any) => { + (_: string, entityData: torii.Entity) => { try { if (callback) { - const parsedData = parseEntities({ - [entityId]: entityData, - }); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData, error: undefined, @@ -107,13 +111,12 @@ export async function init( subscribeEventQuery: async ({ query, callback, - historical = false as Historical, }: SubscribeParams): Promise< SubscribeResponse > => { const q = query.build(); if ( - q.dont_include_hashed_keys && + q.no_hashed_keys && q.clause && !Object.hasOwn(q.clause, "Keys") ) { @@ -121,11 +124,9 @@ export async function init( "For subscription, you need to include entity ids" ); } - const events = await client.getEventMessages(q, historical); - const parsedEvents = ( - historical - ? parseHistoricalEvents(events) - : parseEntities(events) + const events = await client.getEventMessages(q); + const parsedEvents = parseEntities( + events.items ) as ToriiResponse; return [ parsedEvents, @@ -134,13 +135,12 @@ export async function init( q.clause, parsedEvents as StandardizedQueryResult ), - (entityId: string, entityData: any) => { + (_: string, entityData: torii.Entity) => { try { if (callback) { - const data = { [entityId]: entityData }; - const parsedData = historical - ? parseHistoricalEvents(data) - : parseEntities(data); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData as ToriiResponse< @@ -186,7 +186,7 @@ export async function init( */ getEntities: async ({ query }) => { const q = query.build(); - return parseEntities(await client.getEntities(q, false)); + return parseEntities((await client.getEntities(q)).items); }, /** * Fetches event messages based on the provided query. @@ -196,20 +196,12 @@ export async function init( */ getEventMessages: async ({ query, - historical, }: GetParams): Promise> => { const q = query.build(); - const events = await client.getEventMessages( - q, - historical ? historical : false - ); + const events = await client.getEventMessages(q); - return ( - historical - ? parseHistoricalEvents(events) - : parseEntities(events) - ) as ToriiResponse; + return parseEntities(events.items) as ToriiResponse; }, /** @@ -218,41 +210,58 @@ export async function init( * @template M - The message type defined by the schema models. * @param {string} nsModel - Model name prefixed with namespace joined by a hyphen. * @param {M} message - The user-defined message content, must be part of the schema models. - * @param {StarknetDomain} [domain] - The domain object. If not provided, uses the default domain from options. * @returns {TypedData} - The generated typed data. */ generateTypedData: >( nsModel: string, message: M, modelMapping?: Array<{ name: string; type: string }>, - domain: StarknetDomain = options.domain + additionalTypes?: Record< + string, + Array<{ name: string; type: string }> + > ): TypedData => - generateTypedData(nsModel, message, domain, modelMapping), + generateTypedData( + nsModel, + message, + options.domain, + modelMapping, + additionalTypes + ), /** * Sends a signed message. * * @param {TypedData} data - The typed data to be signed and sent. - * @param {Account} account - The account used to sign the message. + * @param {Account} _account? - The account used to sign the message. * @returns {Promise} - A promise that resolves when the message is sent successfully. * @throws {Error} If the message sending fails. */ sendMessage: async ( data: TypedData, - account: Account - ): Promise => { + _account?: Account + ): Promise> => { + if (!options.signer) { + return err(NO_SIGNER); + } + if (!options.identity) { + return err(NO_IDENTITY); + } + try { - // Sign the typed data - const signature: Signature = await account.signMessage(data); + const td = new torii.TypedData(JSON.stringify(data)).encode( + options.identity + ); + + const sig = options.signer.sign(td); - // Stringify typed data for publishing const dataString = JSON.stringify(data); - // Publish the signed message - await client.publishMessage( - dataString, - Array.isArray(signature) - ? signature - : [signature.r.toString(), signature.s.toString()] + + return ok( + await client.publishMessage(dataString, [ + sig.r.toString(), + sig.s.toString(), + ]) ); } catch (error) { console.error("Failed to send message:", error); @@ -378,7 +387,7 @@ export async function init( ): Promise<[ToriiResponse, torii.EntityKeysClause[]]> => { const q = query.build(); const entities = parseEntities( - await client.getEntities(q, false) + (await client.getEntities(q)).items ); return [entities, intoEntityKeysClause(q.clause, entities)]; }, @@ -390,18 +399,12 @@ export async function init( * @returns [ToriiResponse,torii.EntityKeysClause[]] */ toriiEventMessagesQueryIntoHashedKeys: async ( - query: ToriiQueryBuilder, - historical: H + query: ToriiQueryBuilder ): Promise<[ToriiResponse, torii.EntityKeysClause[]]> => { const q = query.build(); - const events = await client.getEventMessages( - q, - historical ? historical : false - ); - const parsedEvents = historical - ? parseHistoricalEvents(events) - : parseEntities(events); + const events = await client.getEventMessages(q); + const parsedEvents = parseEntities(events.items); return [ parsedEvents as ToriiResponse, intoEntityKeysClause( diff --git a/packages/sdk/src/node/worker.ts b/packages/sdk/src/node/worker.ts new file mode 100644 index 00000000..0e228d7e --- /dev/null +++ b/packages/sdk/src/node/worker.ts @@ -0,0 +1,44 @@ +import type { Subscription } from "@dojoengine/torii-wasm/types"; +// import process from "node:process"; + +export type DojoWorkerCallback = () => Promise; + +/** + * Creates a worker process that manages subscriptions. + * + * This function executes the provided callback to obtain subscriptions, + * and sets up signal handlers to ensure proper cleanup when the process + * is terminated. When SIGTERM or SIGINT signals are received, all subscriptions + * are freed before the process exits. + * + * @param callback - A function that returns a Promise resolving to an array of Subscriptions + * @returns A Promise that resolves when the worker is set up + * + * @example + * ```ts + * await createWorker(async () => { + * const client = await createClient(); + * return [client.subscribe(...)]; + * }); + * ``` + */ +export async function createWorker( + callback: DojoWorkerCallback +): Promise { + const sub = await callback(); + + process.on("SIGTERM", () => { + for (const s of sub) { + s.free(); + } + + process.exit(0); + }); + + process.on("SIGINT", () => { + for (const s of sub) { + s.free(); + } + process.exit(0); + }); +} diff --git a/packages/sdk/src/web/experimental/index.ts b/packages/sdk/src/web/experimental/index.ts index 6de3c12c..d3474cd3 100644 --- a/packages/sdk/src/web/experimental/index.ts +++ b/packages/sdk/src/web/experimental/index.ts @@ -5,7 +5,6 @@ import type { StandardizedQueryResult, } from "../../internal/types"; import { parseEntities } from "../../internal/parseEntities"; -import { parseHistoricalEvents } from "../../internal/parseHistoricalEvents"; import { intoEntityKeysClause } from "../../internal/convertClauseToEntityKeysClause"; import { defaultClientConfig } from ".."; @@ -21,24 +20,22 @@ export async function init(options: SDKConfig) { ...options.client, } as torii.ClientConfig; - const client = await torii.createClient(clientConfig); + const client = new torii.ToriiClient(clientConfig); return { getEntities: async (query: torii.Query) => { - return parseEntities(await client.getEntities(query, false)); + return parseEntities((await client.getEntities(query)).items); }, - getEvents: async (query: torii.Query, historical: boolean = false) => { - const events = await client.getEventMessages(query, historical); - return historical - ? parseHistoricalEvents(events) - : parseEntities(events); + getEvents: async (query: torii.Query) => { + const events = await client.getEventMessages(query); + return parseEntities(events.items); }, subscribeEntities: async ( query: torii.Query, callback: ToriiSubscriptionCallback ) => { if ( - query.dont_include_hashed_keys && + query.no_hashed_keys && query.clause && !Object.hasOwn(query.clause, "Keys") ) { @@ -47,18 +44,18 @@ export async function init(options: SDKConfig) { ); } const entities = parseEntities( - await client.getEntities(query, false) + (await client.getEntities(query)).items ); return [ entities, client.onEntityUpdated( intoEntityKeysClause(query.clause, entities), - (entityId: string, entityData: any) => { + (_: string, entityData: torii.Entity) => { try { if (callback) { - const parsedData = parseEntities({ - [entityId]: entityData, - }); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData }); } } catch (error) { @@ -77,11 +74,10 @@ export async function init(options: SDKConfig) { }, subscribeEvents: async ( query: torii.Query, - callback: ToriiSubscriptionCallback, - historical: boolean = false + callback: ToriiSubscriptionCallback ) => { if ( - query.dont_include_hashed_keys && + query.no_hashed_keys && query.clause && !Object.hasOwn(query.clause, "Keys") ) { @@ -89,24 +85,19 @@ export async function init(options: SDKConfig) { "For subscription, you need to include entity ids" ); } - const events = historical - ? parseHistoricalEvents( - await client.getEventMessages(query, historical) - ) - : parseEntities( - await client.getEventMessages(query, historical) - ); + const events = parseEntities( + (await client.getEventMessages(query)).items + ); return [ events, client.onEventMessageUpdated( intoEntityKeysClause(query.clause, events), - (entityId: string, entityData: any) => { + (_: string, entityData: any) => { try { if (callback) { - const data = { [entityId]: entityData }; - const parsedData = historical - ? parseHistoricalEvents(data) - : parseEntities(data); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData }); } } catch (error) { diff --git a/packages/sdk/src/web/index.ts b/packages/sdk/src/web/index.ts index 38ded8db..2b7647c5 100644 --- a/packages/sdk/src/web/index.ts +++ b/packages/sdk/src/web/index.ts @@ -1,5 +1,5 @@ import * as torii from "@dojoengine/torii-wasm"; -import type { Account, Signature, StarknetDomain, TypedData } from "starknet"; +import type { Account, Signature, TypedData } from "starknet"; import type { GetParams, @@ -18,7 +18,6 @@ import type { import { intoEntityKeysClause } from "../internal/convertClauseToEntityKeysClause"; import { parseEntities } from "../internal/parseEntities"; -import { parseHistoricalEvents } from "../internal/parseHistoricalEvents"; import type { ToriiQueryBuilder } from "../internal/toriiQueryBuilder"; import { generateTypedData } from "../internal/generateTypedData"; import { @@ -28,6 +27,8 @@ import { updateTokenBalanceSubscription, subscribeTokenBalance, } from "../internal/token"; +import { err, ok, type Result } from "neverthrow"; +import { NO_ACCOUNT } from "../internal/errors"; export * from "../internal/types"; export * from "../internal/convertClauseToEntityKeysClause"; @@ -44,7 +45,7 @@ export * from "../internal/toriiQueryBuilder"; export async function createClient( config: torii.ClientConfig ): Promise { - return await torii.createClient(config); + return await new torii.ToriiClient(config); } export const defaultClientConfig: Partial = { @@ -79,7 +80,7 @@ export async function init( const q = query.build(); if ( - q.dont_include_hashed_keys && + q.no_hashed_keys && q.clause && !Object.hasOwn(q.clause, "Keys") ) { @@ -87,19 +88,20 @@ export async function init( "For subscription, you need to include entity ids" ); } + const entities = parseEntities( - await client.getEntities(q, false) + (await client.getEntities(q)).items ); return [ entities, client.onEntityUpdated( intoEntityKeysClause(q.clause, entities), - (entityId: string, entityData: any) => { + (_: string, entityData: torii.Entity) => { try { if (callback) { - const parsedData = parseEntities({ - [entityId]: entityData, - }); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData, error: undefined, @@ -129,13 +131,12 @@ export async function init( subscribeEventQuery: async ({ query, callback, - historical = false as Historical, }: SubscribeParams): Promise< SubscribeResponse > => { const q = query.build(); if ( - q.dont_include_hashed_keys && + q.no_hashed_keys && q.clause && !Object.hasOwn(q.clause, "Keys") ) { @@ -143,27 +144,20 @@ export async function init( "For subscription, you need to include entity ids" ); } - const events = ( - historical - ? parseHistoricalEvents( - await client.getEventMessages(q, historical) - ) - : parseEntities( - await client.getEventMessages(q, historical) - ) + const events = parseEntities( + (await client.getEventMessages(q)).items ) as ToriiResponse; return [ events, client.onEventMessageUpdated( // @ts-expect-error TODO: fix type here intoEntityKeysClause(q.clause, events), - (entityId: string, entityData: any) => { + (_: string, entityData: torii.Entity) => { try { if (callback) { - const data = { [entityId]: entityData }; - const parsedData = historical - ? parseHistoricalEvents(data) - : parseEntities(data); + const parsedData = parseEntities([ + entityData, + ]); callback({ data: parsedData as ToriiResponse< @@ -209,7 +203,7 @@ export async function init( */ getEntities: async ({ query }) => { const q = query.build(); - return parseEntities(await client.getEntities(q, false)); + return parseEntities((await client.getEntities(q)).items); }, /** * Fetches event messages based on the provided query. @@ -219,20 +213,12 @@ export async function init( */ getEventMessages: async ({ query, - historical, }: GetParams): Promise> => { const q = query.build(); - const events = await client.getEventMessages( - q, - historical ? historical : false - ); + const events = await client.getEventMessages(q); - return ( - historical - ? parseHistoricalEvents(events) - : parseEntities(events) - ) as ToriiResponse; + return parseEntities(events.items) as ToriiResponse; }, /** @@ -241,16 +227,24 @@ export async function init( * @template M - The message type defined by the schema models. * @param {string} nsModel - Model name prefixed with namespace joined by a hyphen. * @param {M} message - The user-defined message content, must be part of the schema models. - * @param {StarknetDomain} [domain] - The domain object. If not provided, uses the default domain from options. * @returns {TypedData} - The generated typed data. */ generateTypedData: >( nsModel: string, message: M, modelMapping?: Array<{ name: string; type: string }>, - domain: StarknetDomain = options.domain + additionnalTypes?: Record< + string, + Array<{ name: string; type: string }> + > ): TypedData => - generateTypedData(nsModel, message, domain, modelMapping), + generateTypedData( + nsModel, + message, + options.domain, + modelMapping, + additionnalTypes + ), /** * Sends a signed message. @@ -262,8 +256,11 @@ export async function init( */ sendMessage: async ( data: TypedData, - account: Account - ): Promise => { + account?: Account + ): Promise> => { + if (!account) { + return err(NO_ACCOUNT); + } try { // Sign the typed data const signature: Signature = await account.signMessage(data); @@ -271,11 +268,13 @@ export async function init( // Stringify typed data for publishing const dataString = JSON.stringify(data); // Publish the signed message - await client.publishMessage( - dataString, - Array.isArray(signature) - ? signature - : [signature.r.toString(), signature.s.toString()] + return ok( + await client.publishMessage( + dataString, + Array.isArray(signature) + ? signature + : [signature.r.toString(), signature.s.toString()] + ) ); } catch (error) { console.error("Failed to send message:", error); @@ -401,7 +400,7 @@ export async function init( ): Promise<[ToriiResponse, torii.EntityKeysClause[]]> => { const q = query.build(); const entities = parseEntities( - await client.getEntities(q, false) + (await client.getEntities(q)).items ); return [entities, intoEntityKeysClause(q.clause, entities)]; }, @@ -413,21 +412,15 @@ export async function init( * @returns [ToriiResponse,torii.EntityKeysClause[]] */ toriiEventMessagesQueryIntoHashedKeys: async ( - query: ToriiQueryBuilder, - historical: H + query: ToriiQueryBuilder ): Promise<[ToriiResponse, torii.EntityKeysClause[]]> => { const q = query.build(); - const events = await client.getEventMessages( - q, - historical ? historical : false - ); + const events = await client.getEventMessages(q); return [ - (historical - ? parseHistoricalEvents(events) - : parseEntities(events)) as ToriiResponse, + parseEntities(events.items) as ToriiResponse, // @ts-expect-error TODO: fix type here - intoEntityKeysClause(q.clause, events), + intoEntityKeysClause(q.clause, events.items), ]; }, }; diff --git a/packages/sdk/src/web/react/hooks/entities.ts b/packages/sdk/src/web/react/hooks/entities.ts index be4adc20..10882cf7 100644 --- a/packages/sdk/src/web/react/hooks/entities.ts +++ b/packages/sdk/src/web/react/hooks/entities.ts @@ -19,12 +19,19 @@ export function useEntityQuery( updateSubscriptionMethod: (subscription, clause) => sdk.updateEntitySubscription(subscription, clause), queryToHashedKeysMethod: (query) => sdk.toriiQueryIntoHashedKeys(query), - processInitialData: (data) => state.mergeEntities(data), + processInitialData: (data) => { + state.mergeEntities(data); + }, processUpdateData: (data) => { - const entity = data.pop(); + if (data) { + const entities = data.filter( + (e) => Number.parseInt(e.entityId, 16) !== 0 + ); - if (entity && entity.entityId !== "0x0") { - state.updateEntity(entity); + const entity = entities[0]; + if (entity) { + state.updateEntity(entity); + } } }, getErrorPrefix: () => "Dojo.js - useEntityQuery", diff --git a/packages/sdk/src/web/react/hooks/events.ts b/packages/sdk/src/web/react/hooks/events.ts index 3e626305..794bd4cf 100644 --- a/packages/sdk/src/web/react/hooks/events.ts +++ b/packages/sdk/src/web/react/hooks/events.ts @@ -1,8 +1,11 @@ import { useDojoSDK } from "../hooks"; import { createSubscriptionHook } from "./hooks"; -import type { SchemaType, ToriiQueryBuilder } from "../../../internal/types"; +import type { + ParsedEntity, + SchemaType, + ToriiQueryBuilder, +} from "../../../internal/types"; import { useState } from "react"; -import type { StandardizedQueryResult } from "../../../internal/types"; /** * Subscribe to event changes. This hook fetches initial events from torii and subscribes to new events. @@ -21,11 +24,18 @@ export function useEventQuery( sdk.updateEventMessageSubscription(subscription, clause, false), queryToHashedKeysMethod: (query) => sdk.toriiEventMessagesQueryIntoHashedKeys(query, false), - processInitialData: (data) => state.mergeEntities(data), + processInitialData: (data) => { + state.mergeEntities(data); + }, processUpdateData: (data) => { - const event = data.pop(); - if (event && event.entityId !== "0x0") { - state.updateEntity(event); + if (data) { + const evts = data.filter( + (e) => Number.parseInt(e.entityId, 16) !== 0 + ); + const event = evts[0]; + if (event) { + state.updateEntity(event); + } } }, getErrorPrefix: () => "Dojo.js - useEventQuery", @@ -45,7 +55,7 @@ export function useHistoricalEventsQuery( query: ToriiQueryBuilder ) { const { sdk } = useDojoSDK<() => any, Schema>(); - const [events, setEvents] = useState[]>([]); + const [events, setEvents] = useState[]>([]); const useHistoricalEventsQueryHook = createSubscriptionHook({ subscribeMethod: (options) => sdk.subscribeEventQuery(options), @@ -53,11 +63,15 @@ export function useHistoricalEventsQuery( sdk.updateEventMessageSubscription(subscription, clause, true), queryToHashedKeysMethod: (query) => sdk.toriiEventMessagesQueryIntoHashedKeys(query, true), - processInitialData: (data) => setEvents(data), + processInitialData: (data) => { + setEvents(data); + }, processUpdateData: (data) => { - const event = data.pop(); - if (event) { - setEvents((ev) => [event, ...ev]); + if (data) { + const evts = data.filter( + (e) => Number.parseInt(e.entityId, 16) !== 0 + ); + setEvents((ev) => [...evts, ...ev]); } }, getErrorPrefix: () => "Dojo.js - useHistoricalEventsQuery", diff --git a/packages/sdk/src/web/react/hooks/hooks.ts b/packages/sdk/src/web/react/hooks/hooks.ts index 66f2cf74..33108006 100644 --- a/packages/sdk/src/web/react/hooks/hooks.ts +++ b/packages/sdk/src/web/react/hooks/hooks.ts @@ -4,6 +4,7 @@ import type { ToriiResponse, SchemaType, SubscribeParams, + ParsedEntity, } from "../../../internal/types"; import type { ToriiQueryBuilder } from "../../../internal/toriiQueryBuilder"; import type { EntityKeysClause, Subscription } from "@dojoengine/torii-wasm"; @@ -14,7 +15,7 @@ import { deepEqual, sleep } from "./utils"; */ export function createSubscriptionHook< Schema extends SchemaType, - Historical extends boolean = false + Historical extends boolean = false, >(config: { subscribeMethod: ( options: SubscribeParams @@ -28,8 +29,8 @@ export function createSubscriptionHook< query: ToriiQueryBuilder, historical?: boolean ) => Promise<[ToriiResponse, EntityKeysClause[]]>; - processInitialData: (data: ToriiResponse) => void; - processUpdateData: (data: any) => void; + processInitialData: (data: ParsedEntity[]) => void; + processUpdateData: (data: ParsedEntity[]) => void; getErrorPrefix: () => string; historical: Historical; }) { @@ -60,7 +61,10 @@ export function createSubscriptionHook< clause, config.historical ); - config.processInitialData(results); + + config.processInitialData( + results as unknown as ParsedEntity[] + ); return null; } @@ -68,7 +72,9 @@ export function createSubscriptionHook< query: fetchingRef.current!, callback: ({ data, error }) => { if (data) { - config.processUpdateData(data); + config.processUpdateData( + data as unknown as ParsedEntity[] + ); } if (error) { console.error( @@ -81,7 +87,9 @@ export function createSubscriptionHook< historical: config.historical, }); - config.processInitialData(initialData); + config.processInitialData( + initialData as unknown as ParsedEntity[] + ); return subscription; }, [query]); @@ -110,7 +118,7 @@ export function createSubscriptionHook< return () => { if (subscriptionRef.current) { - // subscriptionRef.current?.cancel(); + // subscriptionRef.current?.free(); // subscriptionRef.current = null; } }; diff --git a/packages/sdk/src/web/state/zustand.ts b/packages/sdk/src/web/state/zustand.ts index c76ec91a..a87ec901 100644 --- a/packages/sdk/src/web/state/zustand.ts +++ b/packages/sdk/src/web/state/zustand.ts @@ -11,7 +11,7 @@ import { import { subscribeWithSelector } from "zustand/middleware"; import type { ParsedEntity, SchemaType } from "../../internal/types"; import type { GameState } from "."; -import { CairoCustomEnum, CairoOption, CairoOptionVariant } from "starknet"; +import { deepMerge, MergedModels } from "../../internal/merge"; enablePatches(); @@ -26,163 +26,6 @@ type CreateStore = { ): StoreApi; }; -/** - * Check if a value is a CairoOption - * @param value - The value to check - * @returns True if the value is a CairoOption, false otherwise - */ -function isCairoOption(value: unknown): value is CairoOption { - return value instanceof CairoOption; -} - -/** - * Merge two CairoOption instances - * @param target - The target CairoOption - * @param source - The source CairoOption - * @returns A new CairoOption instance with the merged value - */ -function mergeCairoOption( - target: MergedModels, - source: Partial> -): MergedModels { - // If source is Some, prefer source's value - if (source instanceof CairoOption && source.isSome()) { - return new CairoOption( - CairoOptionVariant.Some, - source.unwrap() - ) as unknown as MergedModels; - } - - // If source is None or undefined, keep target - if (target instanceof CairoOption) { - if (target.isSome()) { - return new CairoOption( - CairoOptionVariant.Some, - target.unwrap() - ) as unknown as MergedModels; - } - return new CairoOption( - CairoOptionVariant.None - ) as unknown as MergedModels; - } - - // This should not happen if both are CairoOption instances - return target as unknown as MergedModels; -} - -/** - * Check if a value is a CairoCustomEnum - * @param value - The value to check - * @returns True if the value is a CairoCustomEnum, false otherwise - */ -function isCairoCustomEnum(value: unknown): value is CairoCustomEnum { - return value instanceof CairoCustomEnum; -} - -/** - * Merge two CairoCustomEnum instances - * @param target - The target CairoCustomEnum - * @param source - The source CairoCustomEnum - * @returns A new CairoCustomEnum instance with the merged value - */ -function mergeCairoCustomEnum( - target: MergedModels, - source: Partial> -): MergedModels { - if (!isCairoCustomEnum(target) || !isCairoCustomEnum(source)) { - return target; - } - // If source has an active variant, prefer it - const sourceActiveVariant = source.activeVariant(); - const sourceValue = source.unwrap(); - - if (sourceActiveVariant && sourceValue !== undefined) { - // Create a new enum with source's active variant - const newEnumContent: Record = {}; - - // Initialize all variants from target with undefined - for (const key in target.variant) { - newEnumContent[key] = undefined; - } - - // Set the active variant from source - newEnumContent[sourceActiveVariant] = sourceValue; - - return new CairoCustomEnum( - newEnumContent - ) as unknown as MergedModels; - } - - // If source doesn't have an active variant, keep target - const targetActiveVariant = target.activeVariant(); - const targetValue = target.unwrap(); - - if (targetActiveVariant && targetValue !== undefined) { - const newEnumContent: Record = {}; - - // Initialize all variants with undefined - for (const key in target.variant) { - newEnumContent[key] = undefined; - } - - // Set the active variant from target - newEnumContent[targetActiveVariant] = targetValue; - - return new CairoCustomEnum( - newEnumContent - ) as unknown as MergedModels; - } - - // Fallback if not both CairoCustomEnum - return target; -} - -/** - * Merged models type - * @template T - The schema type - * @returns The merged models type - */ -type MergedModels = - ParsedEntity["models"][keyof ParsedEntity["models"]]; - -function deepMerge( - target: MergedModels, - source: Partial> -): MergedModels { - if (isCairoOption(target) && isCairoOption(source)) { - return mergeCairoOption(target, source); - } - if (isCairoCustomEnum(target) && isCairoCustomEnum(source)) { - return mergeCairoCustomEnum(target, source); - } - const result = { ...target } as Record; - for (const key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - if ( - source[key] !== null && - typeof source[key] === "object" && - !Array.isArray(source[key]) - ) { - // If the property is an object in both source and target, recursively merge - if ( - key in target && - typeof target[key] === "object" && - !Array.isArray(target[key]) - ) { - result[key] = deepMerge(target[key], source[key]); - } else { - // If the key doesn't exist in target or isn't an object, just assign - result[key] = source[key]; - } - } else { - // For non-objects (primitives, arrays, null), just assign - result[key] = source[key]; - } - } - } - - return result; -} /** * Factory function to create a Zustand store based on a given SchemaType. * diff --git a/packages/state/src/recs/index.ts b/packages/state/src/recs/index.ts index 9183b5c7..6ae8d786 100644 --- a/packages/state/src/recs/index.ts +++ b/packages/state/src/recs/index.ts @@ -12,7 +12,7 @@ import { } from "@dojoengine/recs"; import type { Clause, - Entities, + Entity as ToriiEntity, EntityKeysClause, OrderBy, PatternMatching, @@ -159,37 +159,37 @@ export const getEntities = async ( } ) => { if (logging) console.log("Starting getEntities"); - let offset = 0; + let cursor = undefined; let continueFetching = true; - const time = dbConnection ? getCache(timestampCacheKey) : 0; + // const time = dbConnection ? getCache(timestampCacheKey) : 0; while (continueFetching) { - const entities = await client.getEntities( - { + const entities = await client.getEntities({ + pagination: { limit, - offset, - clause, + cursor, + direction: "Forward", order_by: orderBy, - entity_models: entityModels, - dont_include_hashed_keys: false, - entity_updated_after: time, }, - historical - ); + clause: clause || undefined, + no_hashed_keys: false, + models: entityModels, + historical, + }); if (dbConnection) { - await insertEntitiesInDB(dbConnection, entities); + await insertEntitiesInDB(dbConnection, entities.items); } - if (logging) console.log(`Fetched entities`, entities); + if (logging) console.log(`Fetched entities`, entities.items); - setEntities(entities, components, logging); + setEntities(entities.items, components, logging); - if (Object.keys(entities).length < limit) { + if (Object.keys(entities.items).length < limit) { continueFetching = false; } else { - offset += limit; + cursor = entities.next_cursor; } } @@ -222,31 +222,31 @@ export const getEvents = async ( callback?: () => void ) => { if (logging) console.log("Starting getEvents"); - let offset = 0; + let cursor = undefined; let continueFetching = true; while (continueFetching) { - const entities = await client.getEventMessages( - { + const entities = await client.getEventMessages({ + pagination: { limit, - offset, - clause, + cursor, + direction: "Forward", order_by: orderBy, - entity_models: entityModels, - dont_include_hashed_keys: false, - entity_updated_after: 0, }, - historical - ); + clause: clause || undefined, + no_hashed_keys: false, + models: entityModels, + historical, + }); - if (logging) console.log("entities", entities); + if (logging) console.log("entities", entities.items); - setEntities(entities, components, logging); + setEntities(entities.items, components, logging); - if (Object.keys(entities).length === 0) { + if (Object.keys(entities.items).length === 0) { continueFetching = false; } else { - offset += limit; + cursor = entities.next_cursor; } } @@ -284,7 +284,7 @@ export const getEntitiesQuery = async ( historical: boolean = false ) => { if (logging) console.log("Starting getEntitiesQuery"); - let cursor = 0; + let cursor = undefined; let continueFetching = true; const componentArray = Object.values(components); @@ -304,31 +304,31 @@ export const getEntitiesQuery = async ( } : null; - const fetchedEntities = await client.getEntities( - { + const fetchedEntities = await client.getEntities({ + pagination: { limit, - offset: cursor, - clause: clause || undefined, + cursor, + direction: "Forward", order_by: orderBy, - entity_models: entityModels, - dont_include_hashed_keys: false, - entity_updated_after: 0, }, - historical - ); + clause: clause || undefined, + no_hashed_keys: false, + models: entityModels, + historical, + }); while (continueFetching) { if (logging) console.log( - `Fetched ${Object.keys(fetchedEntities).length} entities ${cursor}` + `Fetched ${Object.keys(fetchedEntities.items).length} entities ${fetchedEntities.next_cursor}` ); - setEntities(fetchedEntities, components, logging); + setEntities(fetchedEntities.items, components, logging); - if (Object.keys(fetchedEntities).length < limit) { + if (Object.keys(fetchedEntities.items).length < limit) { continueFetching = false; } else { - cursor += limit; + cursor = fetchedEntities.next_cursor; } } }; @@ -509,13 +509,13 @@ const setCache = (time: number, timestampCacheKey: string) => { localStorage.setItem(timestampCacheKey, timeString); }; -const getCache = (timestampCacheKey: string) => { - return Number(localStorage.getItem(timestampCacheKey) || 0); -}; +// const getCache = (timestampCacheKey: string) => { +// return Number(localStorage.getItem(timestampCacheKey) || 0); +// }; async function insertEntitiesInDB( db: IDBDatabase, - entities: Entities + entities: ToriiEntity[] ): Promise { return new Promise((resolve, reject) => { const transaction = db.transaction(["entities"], "readwrite"); diff --git a/packages/torii-client/package.json b/packages/torii-client/package.json index 499de4e4..ba1a57f6 100644 --- a/packages/torii-client/package.json +++ b/packages/torii-client/package.json @@ -9,7 +9,7 @@ "scripts": { "build:deps": "tsup", "build": "pnpm build:deps", - "test": "vitest run", + "test": "vitest run --passWithNoTests", "format:check": "prettier --check .", "format": "prettier --write .", "docs": "typedoc" @@ -25,6 +25,7 @@ }, "devDependencies": { "tsup": "^8.3.5", - "typescript": "^5.6.2" + "typescript": "^5.6.2", + "vitest": "^3.1.2" } } diff --git a/packages/torii-wasm/dojo.c b/packages/torii-wasm/dojo.c index 4b7a7cfb..ca114b05 160000 --- a/packages/torii-wasm/dojo.c +++ b/packages/torii-wasm/dojo.c @@ -1 +1 @@ -Subproject commit 4b7a7cfb5c02e3704175aad42616b72b0c5a908f +Subproject commit ca114b05c76d00b691cbecc789310b722c80f27d diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f6f1dcc..ef56e5db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ catalogs: version: 3.6.2 '@types/react': specifier: ^18.3.1 - version: 19.0.10 + version: 18.3.18 '@types/react-dom': specifier: ^18.3.1 version: 18.3.5 @@ -23,7 +23,7 @@ catalogs: version: 4.0.0 react: specifier: ^18.3.1 - version: 19.0.0 + version: 18.3.1 react-dom: specifier: ^18.3.1 version: 18.3.1 @@ -84,10 +84,28 @@ importers: '@dojoengine/sdk': specifier: workspace:* version: link:../../packages/sdk + '@dojoengine/torii-wasm': + specifier: workspace:* + version: link:../../packages/torii-wasm + dotenv: + specifier: ^16.4.7 + version: 16.4.7 + starknet: + specifier: 'catalog:' + version: 6.23.1(encoding@0.1.13) + websocket: + specifier: ^1.0.35 + version: 1.0.35 + zod: + specifier: ^3.24.3 + version: 3.24.3 devDependencies: '@types/node': specifier: ^22.14.1 version: 22.14.1 + '@types/websocket': + specifier: ^1.0.10 + version: 1.0.10 examples/example-nodejs-bot: dependencies: @@ -105,7 +123,7 @@ importers: version: 5.3.1 discord.js: specifier: ^14.16.2 - version: 14.16.3 + version: 14.16.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) express: specifier: ^4.21.0 version: 4.21.2 @@ -114,7 +132,7 @@ importers: version: 2.12.6(graphql@16.10.0) langchain: specifier: ^0.0.200 - version: 0.0.200(@pinecone-database/pinecone@1.1.3)(axios@1.8.4)(cheerio@1.0.0)(encoding@0.1.13)(ignore@5.3.2)(jsdom@24.1.3)(lodash@4.17.21)(ws@8.18.0) + version: 0.0.200(@pinecone-database/pinecone@1.1.3)(axios@1.8.4)(cheerio@1.0.0)(encoding@0.1.13)(ignore@5.3.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lodash@4.17.21)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) node-cron: specifier: ^3.0.3 version: 3.0.3 @@ -130,7 +148,7 @@ importers: devDependencies: '@graphql-codegen/cli': specifier: ^5.0.2 - version: 5.0.3(@types/node@20.17.10)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2) + version: 5.0.3(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2)(utf-8-validate@5.0.10) '@graphql-codegen/typescript': specifier: ^4.0.9 version: 4.1.2(encoding@0.1.13)(graphql@16.10.0) @@ -151,7 +169,7 @@ importers: version: 3.0.11 bun-types: specifier: latest - version: 1.2.9 + version: 1.2.10 graphql: specifier: ^16.9.0 version: 16.10.0 @@ -175,7 +193,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) react: specifier: 'catalog:' version: 18.3.1 @@ -230,7 +248,7 @@ importers: version: link:../../packages/create-burner '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -413,7 +431,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.8.2) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.8.2)(utf-8-validate@5.0.10) '@t3-oss/env-core': specifier: ^0.11.1 version: 0.11.1(typescript@5.8.2)(zod@3.24.2) @@ -562,7 +580,7 @@ importers: version: link:../../packages/react '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -574,13 +592,13 @@ importers: version: link:../../packages/utils '@latticexyz/react': specifier: ^2.2.8 - version: 2.2.14(typescript@5.7.2)(zod@3.24.2) + version: 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@latticexyz/utils': specifier: ^2.2.8 version: 2.2.14 ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) mobx: specifier: ^6.13.2 version: 6.13.5 @@ -662,7 +680,7 @@ importers: version: link:../../packages/react '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.3)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -695,7 +713,7 @@ importers: version: 2.1.1 ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) events: specifier: ^3.3.0 version: 3.3.0 @@ -801,7 +819,7 @@ importers: version: link:../../packages/react '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -813,7 +831,7 @@ importers: version: link:../../packages/utils '@latticexyz/react': specifier: ^2.2.8 - version: 2.2.14(typescript@5.7.2)(zod@3.24.2) + version: 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@latticexyz/utils': specifier: ^2.2.8 version: 2.2.14 @@ -822,7 +840,7 @@ importers: version: 0.2.6 ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) graphql: specifier: ^16.9.0 version: 16.10.0 @@ -856,7 +874,7 @@ importers: devDependencies: '@graphql-codegen/cli': specifier: ^5.0.2 - version: 5.0.3(@types/node@20.17.10)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2) + version: 5.0.3(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2)(utf-8-validate@5.0.10) '@graphql-codegen/typescript': specifier: ^4.0.9 version: 4.1.2(encoding@0.1.13)(graphql@16.10.0) @@ -931,7 +949,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) '@types/uuid': specifier: ^10.0.0 version: 10.0.0 @@ -1022,7 +1040,7 @@ importers: version: link:../../packages/utils '@libsql/client': specifier: ^0.14.0 - version: 0.14.0 + version: 0.14.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@radix-ui/react-accordion': specifier: ^1.2.2 version: 1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1043,7 +1061,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: ^5.64.1 version: 5.64.1(react@18.3.1) @@ -1064,7 +1082,7 @@ importers: version: 2.1.1 drizzle-orm: specifier: ^0.38.3 - version: 0.38.3(@libsql/client@0.14.0)(@types/react@18.3.18)(bun-types@1.2.9)(react@18.3.1) + version: 0.38.3(@libsql/client@0.14.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.18)(bun-types@1.2.10)(react@18.3.1) lucide-react: specifier: ^0.469.0 version: 0.469.0(react@18.3.1) @@ -1152,7 +1170,7 @@ importers: version: link:../../packages/react '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -1179,7 +1197,7 @@ importers: version: 0.2.2(@fortawesome/fontawesome-svg-core@6.7.2)(react@18.3.1) '@latticexyz/react': specifier: ^2.2.8 - version: 2.2.14(typescript@5.7.2)(zod@3.24.2) + version: 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@latticexyz/utils': specifier: ^2.2.8 version: 2.2.14 @@ -1212,7 +1230,7 @@ importers: version: 2.1.1 ethers: specifier: ^5.7.2 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) graphql: specifier: ^16.9.0 version: 16.10.0 @@ -1327,7 +1345,7 @@ importers: version: 0.6.15(eslint@8.57.1)(typescript@5.7.2) storybook: specifier: ^7.6.20 - version: 7.6.20(encoding@0.1.13) + version: 7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) typescript: specifier: ^5.6.2 version: 5.7.2 @@ -1348,7 +1366,7 @@ importers: version: link:../../packages/create-burner '@dojoengine/recs': specifier: ^2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -1397,7 +1415,7 @@ importers: dependencies: '@cartridge/connector': specifier: ^0.7.6 - version: 0.7.6(@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3))(open@8.4.2)(starknet@6.23.1(encoding@0.1.13)) + version: 0.7.6(@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10))(open@8.4.2)(starknet@6.23.1(encoding@0.1.13)) '@cartridge/controller': specifier: ^0.7.6 version: 0.7.6(open@8.4.2)(starknet@6.23.1(encoding@0.1.13)) @@ -1421,7 +1439,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) '@tailwindcss/vite': specifier: ^4.0.1 version: 4.0.1(vite@6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0)) @@ -1491,7 +1509,7 @@ importers: version: link:../../packages/react '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@dojoengine/state': specifier: workspace:* version: link:../../packages/state @@ -1534,7 +1552,7 @@ importers: dependencies: '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.1) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1) starknet: specifier: 'catalog:' version: 6.23.1(encoding@0.1.13) @@ -1547,7 +1565,7 @@ importers: version: 6.4.18 '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0)) + version: 1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)) tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.11.13(@swc/helpers@0.5.5))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.2)(typescript@5.7.2)(yaml@2.7.0) @@ -1556,7 +1574,7 @@ importers: version: 5.7.2 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/create-burner: dependencies: @@ -1568,7 +1586,7 @@ importers: version: 1.6.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.2) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.2)(utf-8-validate@5.0.10) encoding: specifier: ^0.1.13 version: 0.1.13 @@ -1617,10 +1635,10 @@ importers: version: 0.0.114 '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0)) + version: 1.6.0(vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)) jsdom: specifier: ^24.1.3 - version: 24.1.3 + version: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.11.13(@swc/helpers@0.5.5))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.2)(typescript@5.7.2)(yaml@2.7.0) @@ -1629,7 +1647,7 @@ importers: version: 5.7.2 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@18.19.68)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.0(@types/node@18.19.68)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/create-dojo: dependencies: @@ -1681,7 +1699,7 @@ importers: version: 5.7.2 vitest: specifier: ^2.1.1 - version: 2.1.8(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 2.1.8(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/predeployed-connector: dependencies: @@ -1690,7 +1708,7 @@ importers: version: 0.7.10 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) react: specifier: 'catalog:' version: 18.3.1 @@ -1712,7 +1730,7 @@ importers: version: 18.3.5(@types/react@18.3.18) '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0)) + version: 1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)) eslint: specifier: ^8.57.1 version: 8.57.1 @@ -1730,13 +1748,13 @@ importers: version: 3.2.11(@types/node@22.14.1)(terser@5.39.0) vitest: specifier: ^1.6.0 - version: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/react: dependencies: '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@dojoengine/state': specifier: workspace:* version: link:../state @@ -1804,6 +1822,9 @@ importers: typescript: specifier: ^5.6.2 version: 5.7.2 + vitest: + specifier: ^3.1.2 + version: 3.1.2(@types/node@18.19.68)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) packages/sdk: dependencies: @@ -1824,7 +1845,7 @@ importers: version: 3.1.0 '@starknet-react/core': specifier: 'catalog:' - version: 3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + version: 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) '@tanstack/react-query': specifier: ^5.62.16 version: 5.66.9(react@19.0.0) @@ -1837,6 +1858,9 @@ importers: immer: specifier: ^10.1.1 version: 10.1.1 + neverthrow: + specifier: ^8.2.0 + version: 8.2.0 react: specifier: 'catalog:' version: 19.0.0 @@ -1856,9 +1880,12 @@ importers: '@rollup/plugin-commonjs': specifier: ^28.0.2 version: 28.0.2(rollup@4.37.0) + '@types/node': + specifier: ^22.14.1 + version: 22.14.1 '@vitest/coverage-v8': specifier: ^1.6.1 - version: 1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0)) + version: 1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)) benchmark: specifier: ^2.1.4 version: 2.1.4 @@ -1888,13 +1915,13 @@ importers: version: 3.4.1(vite@3.2.11(@types/node@22.14.1)(terser@5.39.0)) vitest: specifier: ^1.6.1 - version: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/state: dependencies: '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@dojoengine/torii-client': specifier: workspace:* version: link:../torii-client @@ -1903,7 +1930,7 @@ importers: version: 6.23.1(encoding@0.1.13) vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) devDependencies: tsup: specifier: ^8.3.5 @@ -1924,6 +1951,9 @@ importers: typescript: specifier: ^5.6.2 version: 5.7.2 + vitest: + specifier: ^3.1.2 + version: 3.1.2(@types/node@22.14.1)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) packages/torii-wasm: devDependencies: @@ -1941,7 +1971,7 @@ importers: dependencies: '@dojoengine/recs': specifier: 2.0.13 - version: 2.0.13(typescript@5.7.2)(zod@3.24.2) + version: 2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) '@latticexyz/utils': specifier: ^2.2.8 version: 2.2.14 @@ -1960,7 +1990,7 @@ importers: version: 6.4.18 '@vitest/coverage-v8': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0)) + version: 1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)) tsup: specifier: ^8.3.5 version: 8.3.5(@swc/core@1.11.13(@swc/helpers@0.5.5))(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.2)(typescript@5.7.2)(yaml@2.7.0) @@ -1969,7 +1999,7 @@ importers: version: 5.7.2 vitest: specifier: ^1.6.0 - version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) packages/utils-wasm: devDependencies: @@ -1981,7 +2011,7 @@ importers: version: 5.7.2 vitest: specifier: ^2.1.1 - version: 2.1.8(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + version: 2.1.8(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) wasm-pack: specifier: ^0.12.1 version: 0.12.1 @@ -7955,6 +7985,9 @@ packages: '@types/web@0.0.114': resolution: {integrity: sha512-nrkwsB8u0VNHwElFSl6ZCgu0BCbsQu5BPq7mJtBpW7rYBmiLZNWE5KqcHDw8GXQMqWsnFB3EnXsAx7UysQwcMg==} + '@types/websocket@1.0.10': + resolution: {integrity: sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==} + '@types/webxr@0.5.20': resolution: {integrity: sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==} @@ -8371,6 +8404,9 @@ packages: '@vitest/expect@2.1.8': resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} + '@vitest/expect@3.1.2': + resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} + '@vitest/mocker@2.1.8': resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} peerDependencies: @@ -8382,9 +8418,23 @@ packages: vite: optional: true + '@vitest/mocker@3.1.2': + resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@2.1.8': resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} + '@vitest/pretty-format@3.1.2': + resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} + '@vitest/runner@1.6.0': resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} @@ -8394,6 +8444,9 @@ packages: '@vitest/runner@2.1.8': resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} + '@vitest/runner@3.1.2': + resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} + '@vitest/snapshot@1.6.0': resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} @@ -8403,6 +8456,9 @@ packages: '@vitest/snapshot@2.1.8': resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} + '@vitest/snapshot@3.1.2': + resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} + '@vitest/spy@0.34.7': resolution: {integrity: sha512-NMMSzOY2d8L0mcOt4XcliDOS1ISyGlAXuQtERWVOoVHnKwmG+kKhinAiGw3dTtMQWybfa89FG8Ucg9tiC/FhTQ==} @@ -8415,6 +8471,9 @@ packages: '@vitest/spy@2.1.8': resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} + '@vitest/spy@3.1.2': + resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + '@vitest/utils@0.34.7': resolution: {integrity: sha512-ziAavQLpCYS9sLOorGrFFKmy2gnfiNU0ZJ15TsMz/K92NAPS/rp9K4z6AJQQk5Y8adCy4Iwpxy7pQumQ/psnRg==} @@ -8427,6 +8486,9 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vitest/utils@3.1.2': + resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + '@vladfrangu/async_event_emitter@2.4.6': resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -9027,11 +9089,15 @@ 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'} + bun-plugin-dts@0.3.0: resolution: {integrity: sha512-QpiAOKfPcdOToxySOqRY8FwL+brTvyXEHWzrSCRKt4Pv7Z4pnUrhK9tFtM7Ndm7ED09B/0cGXnHJKqmekr/ERw==} - bun-types@1.2.9: - resolution: {integrity: sha512-dk/kOEfQbajENN/D6FyiSgOKEuUi9PWfqKQJEgwKrCMWbjS/S6tEXp178mWvWAcUSYm9ArDlWHZKO3T/4cLXiw==} + bun-types@1.2.10: + resolution: {integrity: sha512-b5ITZMnVdf3m1gMvJHG+gIfeJHiQPJak0f7925Hxu6ZN5VKA8AGy4GZ4lM+Xkn6jtWxg5S3ldWvfmXdvnkp3GQ==} bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} @@ -9141,6 +9207,10 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + chalk@3.0.0: resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} engines: {node: '>=8'} @@ -9540,6 +9610,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -10068,9 +10142,20 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + esbuild-android-64@0.15.18: resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} @@ -10442,6 +10527,10 @@ packages: jiti: optional: true + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10491,6 +10580,9 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -10529,6 +10621,10 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -10539,6 +10635,9 @@ packages: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -10617,6 +10716,14 @@ packages: picomatch: optional: true + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fetch-blob@3.2.0: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} @@ -11508,6 +11615,9 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unc-path@1.0.0: resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} engines: {node: '>=0.10.0'} @@ -12155,6 +12265,7 @@ packages: libsql@0.4.7: resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} + cpu: [x64, arm64, wasm32] os: [darwin, linux, win32] lie@3.3.0: @@ -12349,6 +12460,9 @@ packages: loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + lower-case-first@2.0.2: resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} @@ -12763,12 +12877,19 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + neverthrow@8.2.0: + resolution: {integrity: sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==} + engines: {node: '>=18'} + next-themes@0.4.4: resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + next@14.2.12: resolution: {integrity: sha512-cDOtUSIeoOvt1skKNihdExWMTybx3exnvbFbb9ecZDIxlvIbREQzt9A5Km3Zn3PfU+IFjyYGsHS+lN9VInAGKA==} engines: {node: '>=18.17.0'} @@ -12838,6 +12959,10 @@ packages: resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} hasBin: true + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-gyp@10.3.1: resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -14380,6 +14505,9 @@ packages: std-env@3.8.1: resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -14761,6 +14889,10 @@ packages: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -14773,6 +14905,10 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + tinyspy@2.2.1: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} @@ -15051,6 +15187,9 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -15071,6 +15210,9 @@ packages: resolution: {integrity: sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==} engines: {node: '>= 18'} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -15327,6 +15469,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^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==} @@ -15422,6 +15568,11 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true + vite-node@3.1.2: + resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + vite-plugin-mkcert@1.17.8: resolution: {integrity: sha512-S+4tNEyGqdZQ3RLAG54ETeO2qyURHWrVjUWKYikLAbmhh/iJ+36gDEja4OWwFyXNuvyXcZwNt5TZZR9itPeG5Q==} engines: {node: '>=v16.7.0'} @@ -15859,6 +16010,34 @@ packages: jsdom: optional: true + vitest@3.1.2: + resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.1.2 + '@vitest/ui': 3.1.2 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -15931,6 +16110,10 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + websocket@1.0.35: + resolution: {integrity: sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==} + engines: {node: '>=4.0.0'} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -16160,6 +16343,11 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yaeti@0.0.6: + resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} + engines: {node: '>=0.10.32'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -16225,6 +16413,9 @@ packages: zod@3.24.2: resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + zustand@3.7.2: resolution: {integrity: sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==} engines: {node: '>=12.7.0'} @@ -17908,10 +18099,10 @@ snapshots: '@cartridge/account-wasm@0.7.6': {} - '@cartridge/connector@0.7.6(@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3))(open@8.4.2)(starknet@6.23.1(encoding@0.1.13))': + '@cartridge/connector@0.7.6(@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10))(open@8.4.2)(starknet@6.23.1(encoding@0.1.13))': dependencies: '@cartridge/controller': 0.7.6(open@8.4.2)(starknet@6.23.1(encoding@0.1.13)) - '@starknet-react/core': 3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3) + '@starknet-react/core': 3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - open - starknet @@ -18238,7 +18429,7 @@ snapshots: '@discordjs/util@1.1.1': {} - '@discordjs/ws@1.1.1': + '@discordjs/ws@1.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@discordjs/collection': 2.1.1 '@discordjs/rest': 2.4.0 @@ -18248,16 +18439,28 @@ snapshots: '@vladfrangu/async_event_emitter': 2.4.6 discord-api-types: 0.37.83 tslib: 2.8.1 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate '@discoveryjs/json-ext@0.5.7': {} - '@dojoengine/recs@2.0.13(typescript@5.7.2)(zod@3.24.1)': + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10) + '@latticexyz/utils': 2.0.12 + mobx: 6.13.5 + rxjs: 7.5.5 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1)': dependencies: - '@latticexyz/schema-type': 2.0.12(typescript@5.7.2)(zod@3.24.1) + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1) '@latticexyz/utils': 2.0.12 mobx: 6.13.5 rxjs: 7.5.5 @@ -18267,9 +18470,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(typescript@5.7.2)(zod@3.24.2)': + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - '@latticexyz/schema-type': 2.0.12(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@latticexyz/utils': 2.0.12 mobx: 6.13.5 rxjs: 7.5.5 @@ -18279,9 +18482,9 @@ snapshots: - utf-8-validate - zod - '@dojoengine/recs@2.0.13(typescript@5.7.3)(zod@3.24.2)': + '@dojoengine/recs@2.0.13(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': dependencies: - '@latticexyz/schema-type': 2.0.12(typescript@5.7.3)(zod@3.24.2) + '@latticexyz/schema-type': 2.0.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) '@latticexyz/utils': 2.0.12 mobx: 6.13.5 rxjs: 7.5.5 @@ -19182,7 +19385,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2': + '@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -19203,7 +19406,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6 + ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19349,7 +19552,7 @@ snapshots: graphql: 16.10.0 tslib: 2.6.3 - '@graphql-codegen/cli@5.0.3(@types/node@20.17.10)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2)': + '@graphql-codegen/cli@5.0.3(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(enquirer@2.4.1)(graphql@16.10.0)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@babel/generator': 7.26.3 '@babel/template': 7.25.9 @@ -19364,8 +19567,8 @@ snapshots: '@graphql-tools/graphql-file-loader': 8.0.9(graphql@16.10.0) '@graphql-tools/json-file-loader': 8.0.9(graphql@16.10.0) '@graphql-tools/load': 8.0.10(graphql@16.10.0) - '@graphql-tools/prisma-loader': 8.0.17(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0) - '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0) + '@graphql-tools/prisma-loader': 8.0.17(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10) + '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 10.7.0(graphql@16.10.0) '@whatwg-node/fetch': 0.9.23 chalk: 4.1.2 @@ -19373,7 +19576,7 @@ snapshots: debounce: 1.2.1 detect-indent: 6.1.0 graphql: 16.10.0 - graphql-config: 5.1.3(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0)(typescript@5.7.2) + graphql-config: 5.1.3(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(typescript@5.7.2)(utf-8-validate@5.0.10) inquirer: 8.2.6 is-glob: 4.0.3 jiti: 1.21.7 @@ -19628,16 +19831,16 @@ snapshots: '@graphql-tools/utils': 10.7.0(graphql@16.10.0) graphql: 16.10.0 - '@graphql-tools/executor-graphql-ws@1.3.7(graphql@16.10.0)': + '@graphql-tools/executor-graphql-ws@1.3.7(bufferutil@4.0.9)(graphql@16.10.0)(utf-8-validate@5.0.10)': dependencies: '@graphql-tools/executor-common': 0.0.1(graphql@16.10.0) '@graphql-tools/utils': 10.7.0(graphql@16.10.0) '@whatwg-node/disposablestack': 0.0.5 graphql: 16.10.0 graphql-ws: 5.16.0(graphql@16.10.0) - isomorphic-ws: 5.0.0(ws@8.18.0) + isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19658,14 +19861,14 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@graphql-tools/executor-legacy-ws@1.1.8(graphql@16.10.0)': + '@graphql-tools/executor-legacy-ws@1.1.8(bufferutil@4.0.9)(graphql@16.10.0)(utf-8-validate@5.0.10)': dependencies: '@graphql-tools/utils': 10.7.0(graphql@16.10.0) '@types/ws': 8.5.13 graphql: 16.10.0 - isomorphic-ws: 5.0.0(ws@8.18.0) + isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19768,9 +19971,9 @@ snapshots: graphql: 16.10.0 tslib: 2.6.3 - '@graphql-tools/prisma-loader@8.0.17(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0)': + '@graphql-tools/prisma-loader@8.0.17(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10)': dependencies: - '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0) + '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 10.7.0(graphql@16.10.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.10.1 @@ -19822,21 +20025,21 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/url-loader@8.0.21(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0)': + '@graphql-tools/url-loader@8.0.21(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10)': dependencies: '@ardatan/sync-fetch': 0.0.1(encoding@0.1.13) - '@graphql-tools/executor-graphql-ws': 1.3.7(graphql@16.10.0) + '@graphql-tools/executor-graphql-ws': 1.3.7(bufferutil@4.0.9)(graphql@16.10.0)(utf-8-validate@5.0.10) '@graphql-tools/executor-http': 1.2.3(@types/node@20.17.10)(graphql@16.10.0) - '@graphql-tools/executor-legacy-ws': 1.1.8(graphql@16.10.0) + '@graphql-tools/executor-legacy-ws': 1.1.8(bufferutil@4.0.9)(graphql@16.10.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 10.7.0(graphql@16.10.0) '@graphql-tools/wrap': 10.0.27(graphql@16.10.0) '@types/ws': 8.5.13 '@whatwg-node/fetch': 0.10.1 graphql: 16.10.0 - isomorphic-ws: 5.0.0(ws@8.18.0) + isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) tslib: 2.8.1 value-or-promise: 1.0.12 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - '@types/node' - bufferutil @@ -20113,18 +20316,18 @@ snapshots: uuid: 9.0.1 zod: 3.24.2 - '@latticexyz/common@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/common@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - '@latticexyz/schema-type': 2.2.14(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/schema-type': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@solidity-parser/parser': 0.16.2 - abitype: 1.0.6(typescript@5.7.2)(zod@3.24.2) + abitype: 1.0.6(typescript@5.7.2)(zod@3.24.3) debug: 4.4.0 execa: 7.2.0 p-queue: 7.4.1 p-retry: 5.1.2 prettier: 3.2.5 prettier-plugin-solidity: 1.3.1(prettier@3.2.5) - viem: 2.21.19(typescript@5.7.2)(zod@3.24.2) + viem: 2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - bufferutil - supports-color @@ -20132,14 +20335,14 @@ snapshots: - utf-8-validate - zod - '@latticexyz/config@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/config@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: '@ark/util': 0.2.2 - '@latticexyz/common': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/schema-type': 2.2.14(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/common': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/schema-type': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) esbuild: 0.17.19 find-up: 6.3.0 - viem: 2.21.19(typescript@5.7.2)(zod@3.24.2) + viem: 2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - '@aws-sdk/client-kms' - asn1.js @@ -20157,13 +20360,13 @@ snapshots: phaser: 3.60.0-beta.14 rxjs: 7.5.5 - '@latticexyz/protocol-parser@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/protocol-parser@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - '@latticexyz/common': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/config': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/schema-type': 2.2.14(typescript@5.7.2)(zod@3.24.2) - abitype: 1.0.6(typescript@5.7.2)(zod@3.24.2) - viem: 2.21.19(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/common': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/config': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/schema-type': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + abitype: 1.0.6(typescript@5.7.2)(zod@3.24.3) + viem: 2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - '@aws-sdk/client-kms' - asn1.js @@ -20173,10 +20376,10 @@ snapshots: - utf-8-validate - zod - '@latticexyz/react@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/react@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - '@latticexyz/recs': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/store': 2.2.14(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/recs': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/store': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) fast-deep-equal: 3.1.3 mobx: 6.13.5 react: 18.3.1 @@ -20190,9 +20393,9 @@ snapshots: - utf-8-validate - zod - '@latticexyz/recs@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/recs@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - '@latticexyz/schema-type': 2.2.14(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/schema-type': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) '@latticexyz/utils': 2.2.14 mobx: 6.13.5 rxjs: 7.5.5 @@ -20202,57 +20405,67 @@ snapshots: - utf-8-validate - zod - '@latticexyz/schema-type@2.0.12(typescript@5.7.2)(zod@3.24.1)': + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)': + dependencies: + abitype: 1.0.0(typescript@5.7.2)(zod@3.24.3) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1)': dependencies: abitype: 1.0.0(typescript@5.7.2)(zod@3.24.1) - viem: 2.9.20(typescript@5.7.2)(zod@3.24.1) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/schema-type@2.0.12(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - abitype: 1.0.0(typescript@5.7.2)(zod@3.24.2) - viem: 2.9.20(typescript@5.7.2)(zod@3.24.2) + abitype: 1.0.0(typescript@5.7.2)(zod@3.24.3) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/schema-type@2.0.12(typescript@5.7.3)(zod@3.24.2)': + '@latticexyz/schema-type@2.0.12(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)': dependencies: - abitype: 1.0.0(typescript@5.7.3)(zod@3.24.2) - viem: 2.9.20(typescript@5.7.3)(zod@3.24.2) + abitype: 1.0.0(typescript@5.7.3) + viem: 2.9.20(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/schema-type@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/schema-type@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: - abitype: 1.0.6(typescript@5.7.2)(zod@3.24.2) - viem: 2.21.19(typescript@5.7.2)(zod@3.24.2) + abitype: 1.0.6(typescript@5.7.2)(zod@3.24.3) + viem: 2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod - '@latticexyz/store@2.2.14(typescript@5.7.2)(zod@3.24.2)': + '@latticexyz/store@2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3)': dependencies: '@ark/util': 0.2.2 - '@latticexyz/common': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/config': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/protocol-parser': 2.2.14(typescript@5.7.2)(zod@3.24.2) - '@latticexyz/schema-type': 2.2.14(typescript@5.7.2)(zod@3.24.2) - abitype: 1.0.6(typescript@5.7.2)(zod@3.24.2) + '@latticexyz/common': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/config': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/protocol-parser': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + '@latticexyz/schema-type': 2.2.14(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) + abitype: 1.0.6(typescript@5.7.2)(zod@3.24.3) arktype: 2.0.0-beta.6 debug: 4.4.0 - viem: 2.21.19(typescript@5.7.2)(zod@3.24.2) + viem: 2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3) transitivePeerDependencies: - '@aws-sdk/client-kms' - asn1.js @@ -20369,10 +20582,10 @@ snapshots: - supports-color - typescript - '@libsql/client@0.14.0': + '@libsql/client@0.14.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@libsql/core': 0.14.0 - '@libsql/hrana-client': 0.7.0 + '@libsql/hrana-client': 0.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) js-base64: 3.7.7 libsql: 0.4.7 promise-limit: 2.7.0 @@ -20390,10 +20603,10 @@ snapshots: '@libsql/darwin-x64@0.4.7': optional: true - '@libsql/hrana-client@0.7.0': + '@libsql/hrana-client@0.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@libsql/isomorphic-fetch': 0.3.1 - '@libsql/isomorphic-ws': 0.1.5 + '@libsql/isomorphic-ws': 0.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10) js-base64: 3.7.7 node-fetch: 3.3.2 transitivePeerDependencies: @@ -20402,10 +20615,10 @@ snapshots: '@libsql/isomorphic-fetch@0.3.1': {} - '@libsql/isomorphic-ws@0.1.5': + '@libsql/isomorphic-ws@0.1.5(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@types/ws': 8.5.13 - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -22384,7 +22597,7 @@ snapshots: '@starknet-react/chains@3.1.0': {} - '@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.2)': + '@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 3.1.0 @@ -22393,14 +22606,14 @@ snapshots: get-starknet-core: 4.0.0 react: 18.3.1 starknet: 6.23.1(encoding@0.1.13) - viem: 2.23.15(typescript@5.7.2)(zod@3.24.2) + viem: 2.23.15(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: 3.24.2 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)': + '@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 3.1.0 @@ -22409,14 +22622,14 @@ snapshots: get-starknet-core: 4.0.0 react: 18.3.1 starknet: 6.23.1(encoding@0.1.13) - viem: 2.23.15(typescript@5.7.3)(zod@3.24.2) + viem: 2.23.15(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) zod: 3.24.2 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.8.2)': + '@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@18.3.1)(starknet@6.23.1(encoding@0.1.13))(typescript@5.8.2)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 3.1.0 @@ -22425,14 +22638,14 @@ snapshots: get-starknet-core: 4.0.0 react: 18.3.1 starknet: 6.23.1(encoding@0.1.13) - viem: 2.23.15(typescript@5.8.2)(zod@3.24.2) + viem: 2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) zod: 3.24.2 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@starknet-react/core@3.6.2(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)': + '@starknet-react/core@3.6.2(bufferutil@4.0.9)(get-starknet-core@4.0.0)(react@19.0.0)(starknet@6.23.1(encoding@0.1.13))(typescript@5.7.3)(utf-8-validate@5.0.10)': dependencies: '@starknet-io/types-js': 0.7.10 '@starknet-react/chains': 3.1.0 @@ -22441,7 +22654,7 @@ snapshots: get-starknet-core: 4.0.0 react: 19.0.0 starknet: 6.23.1(encoding@0.1.13) - viem: 2.23.15(typescript@5.7.3)(zod@3.24.2) + viem: 2.23.15(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2) zod: 3.24.2 transitivePeerDependencies: - bufferutil @@ -22664,7 +22877,7 @@ snapshots: telejson: 7.2.0 tiny-invariant: 1.3.3 - '@storybook/cli@7.6.20(encoding@0.1.13)': + '@storybook/cli@7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@babel/core': 7.26.10 '@babel/preset-env': 7.26.0(@babel/core@7.26.10) @@ -22673,7 +22886,7 @@ snapshots: '@storybook/codemod': 7.6.20 '@storybook/core-common': 7.6.20(encoding@0.1.13) '@storybook/core-events': 7.6.20 - '@storybook/core-server': 7.6.20(encoding@0.1.13) + '@storybook/core-server': 7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@storybook/csf-tools': 7.6.20 '@storybook/node-logger': 7.6.20 '@storybook/telemetry': 7.6.20(encoding@0.1.13) @@ -22699,7 +22912,7 @@ snapshots: ora: 5.4.1 prettier: 2.8.8 prompts: 2.4.2 - puppeteer-core: 2.1.1 + puppeteer-core: 2.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) read-pkg-up: 7.0.1 semver: 7.6.3 strip-json-comments: 3.1.1 @@ -22791,7 +23004,7 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@7.6.20(encoding@0.1.13)': + '@storybook/core-server@7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 @@ -22832,7 +23045,7 @@ snapshots: util: 0.12.5 util-deprecate: 1.0.2 watchpack: 2.4.2 - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -23828,6 +24041,10 @@ snapshots: '@types/web@0.0.114': {} + '@types/websocket@1.0.10': + dependencies: + '@types/node': 20.17.27 + '@types/webxr@0.5.20': {} '@types/wrap-ansi@3.0.0': {} @@ -24528,7 +24745,7 @@ snapshots: vite: 5.4.11(@types/node@22.14.1)(lightningcss@1.29.1)(terser@5.39.0) vue: 3.5.13(typescript@5.7.2) - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0))': + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -24543,11 +24760,11 @@ snapshots: std-env: 3.8.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@18.19.68)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + vitest: 1.6.0(@types/node@18.19.68)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0))': + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -24562,11 +24779,11 @@ snapshots: std-env: 3.8.0 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + vitest: 1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0))': + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -24581,7 +24798,7 @@ snapshots: std-env: 3.8.1 strip-literal: 2.1.1 test-exclude: 6.0.0 - vitest: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0) + vitest: 1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0) transitivePeerDependencies: - supports-color @@ -24610,6 +24827,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 + '@vitest/expect@3.1.2': + dependencies: + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + tinyrainbow: 2.0.0 + '@vitest/mocker@2.1.8(vite@5.4.15(@types/node@22.14.1)(lightningcss@1.29.1)(terser@5.39.0))': dependencies: '@vitest/spy': 2.1.8 @@ -24618,10 +24842,30 @@ snapshots: optionalDependencies: vite: 5.4.15(@types/node@22.14.1)(lightningcss@1.29.1)(terser@5.39.0) + '@vitest/mocker@3.1.2(vite@6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@vitest/spy': 3.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + + '@vitest/mocker@3.1.2(vite@6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@vitest/spy': 3.1.2 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 + '@vitest/pretty-format@3.1.2': + dependencies: + tinyrainbow: 2.0.0 + '@vitest/runner@1.6.0': dependencies: '@vitest/utils': 1.6.0 @@ -24639,6 +24883,11 @@ snapshots: '@vitest/utils': 2.1.8 pathe: 1.1.2 + '@vitest/runner@3.1.2': + dependencies: + '@vitest/utils': 3.1.2 + pathe: 2.0.3 + '@vitest/snapshot@1.6.0': dependencies: magic-string: 0.30.17 @@ -24657,6 +24906,12 @@ snapshots: magic-string: 0.30.17 pathe: 1.1.2 + '@vitest/snapshot@3.1.2': + dependencies: + '@vitest/pretty-format': 3.1.2 + magic-string: 0.30.17 + pathe: 2.0.3 + '@vitest/spy@0.34.7': dependencies: tinyspy: 2.2.1 @@ -24673,6 +24928,10 @@ snapshots: dependencies: tinyspy: 3.0.2 + '@vitest/spy@3.1.2': + dependencies: + tinyspy: 3.0.2 + '@vitest/utils@0.34.7': dependencies: diff-sequences: 29.6.3 @@ -24699,6 +24958,12 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vitest/utils@3.1.2': + dependencies: + '@vitest/pretty-format': 3.1.2 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + '@vladfrangu/async_event_emitter@2.4.6': {} '@volar/language-core@2.4.11': @@ -24859,20 +25124,19 @@ snapshots: typescript: 5.7.2 zod: 3.24.1 - abitype@1.0.0(typescript@5.7.2)(zod@3.24.2): + abitype@1.0.0(typescript@5.7.2)(zod@3.24.3): optionalDependencies: typescript: 5.7.2 - zod: 3.24.2 + zod: 3.24.3 - abitype@1.0.0(typescript@5.7.3)(zod@3.24.2): + abitype@1.0.0(typescript@5.7.3): optionalDependencies: typescript: 5.7.3 - zod: 3.24.2 - abitype@1.0.6(typescript@5.7.2)(zod@3.24.2): + abitype@1.0.6(typescript@5.7.2)(zod@3.24.3): optionalDependencies: typescript: 5.7.2 - zod: 3.24.2 + zod: 3.24.3 abitype@1.0.8(typescript@5.7.2)(zod@3.24.2): optionalDependencies: @@ -25472,16 +25736,19 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + bun-plugin-dts@0.3.0: dependencies: common-path-prefix: 3.0.0 dts-bundle-generator: 9.5.1 get-tsconfig: 4.10.0 - bun-types@1.2.9: + bun-types@1.2.10: dependencies: '@types/node': 20.17.27 - '@types/ws': 8.5.13 bundle-require@5.1.0(esbuild@0.24.2): dependencies: @@ -25621,6 +25888,14 @@ snapshots: loupe: 3.1.2 pathval: 2.0.0 + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + chalk@3.0.0: dependencies: ansi-styles: 4.3.0 @@ -26091,6 +26366,11 @@ snapshots: csstype@3.1.3: {} + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + damerau-levenshtein@1.0.8: {} dargs@7.0.0: {} @@ -26299,14 +26579,14 @@ snapshots: discord-api-types@0.37.97: {} - discord.js@14.16.3: + discord.js@14.16.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@discordjs/builders': 1.9.0 '@discordjs/collection': 1.5.3 '@discordjs/formatters': 0.5.0 '@discordjs/rest': 2.4.0 '@discordjs/util': 1.1.1 - '@discordjs/ws': 1.1.1 + '@discordjs/ws': 1.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@sapphire/snowflake': 3.5.3 discord-api-types: 0.37.100 fast-deep-equal: 3.1.3 @@ -26377,11 +26657,11 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.38.3(@libsql/client@0.14.0)(@types/react@18.3.18)(bun-types@1.2.9)(react@18.3.1): + drizzle-orm@0.38.3(@libsql/client@0.14.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@types/react@18.3.18)(bun-types@1.2.10)(react@18.3.1): optionalDependencies: - '@libsql/client': 0.14.0 + '@libsql/client': 0.14.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@types/react': 18.3.18 - bun-types: 1.2.9 + bun-types: 1.2.10 react: 18.3.1 dset@3.1.4: {} @@ -26595,8 +26875,26 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + es6-promise@3.3.1: {} + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + esbuild-android-64@0.15.18: optional: true @@ -26966,7 +27264,7 @@ snapshots: is-bun-module: 1.3.0 rspack-resolver: 1.2.2 stable-hash: 0.0.5 - tinyglobby: 0.2.12 + tinyglobby: 0.2.13 optionalDependencies: eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.28.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-typescript@3.9.1)(eslint@8.57.1) transitivePeerDependencies: @@ -27285,6 +27583,13 @@ snapshots: transitivePeerDependencies: - supports-color + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + espree@10.3.0: dependencies: acorn: 8.14.1 @@ -27323,7 +27628,7 @@ snapshots: etag@1.8.1: {} - ethers@5.7.2: + ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -27343,7 +27648,7 @@ snapshots: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -27359,6 +27664,11 @@ snapshots: - bufferutil - utf-8-validate + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-target-shim@5.0.1: {} eventemitter3@4.0.7: {} @@ -27419,6 +27729,8 @@ snapshots: expect-type@1.1.0: {} + expect-type@1.2.1: {} + exponential-backoff@3.1.1: {} expr-eval@2.0.2: {} @@ -27459,6 +27771,10 @@ snapshots: transitivePeerDependencies: - supports-color + ext@1.7.0: + dependencies: + type: 2.7.3 + extend@3.0.2: {} extendable-error@0.1.7: {} @@ -27546,6 +27862,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + fetch-blob@3.2.0: dependencies: node-domexception: 1.0.0 @@ -27988,13 +28308,13 @@ snapshots: graphemer@1.4.0: {} - graphql-config@5.1.3(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0)(typescript@5.7.2): + graphql-config@5.1.3(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(typescript@5.7.2)(utf-8-validate@5.0.10): dependencies: '@graphql-tools/graphql-file-loader': 8.0.9(graphql@16.10.0) '@graphql-tools/json-file-loader': 8.0.9(graphql@16.10.0) '@graphql-tools/load': 8.0.10(graphql@16.10.0) '@graphql-tools/merge': 9.0.15(graphql@16.10.0) - '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(encoding@0.1.13)(graphql@16.10.0) + '@graphql-tools/url-loader': 8.0.21(@types/node@20.17.10)(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.10.0)(utf-8-validate@5.0.10) '@graphql-tools/utils': 10.7.0(graphql@16.10.0) cosmiconfig: 8.3.6(typescript@5.7.2) graphql: 16.10.0 @@ -28500,6 +28820,8 @@ snapshots: dependencies: which-typed-array: 1.1.18 + is-typedarray@1.0.0: {} + is-unc-path@1.0.0: dependencies: unc-path-regex: 0.1.2 @@ -28544,21 +28866,21 @@ snapshots: transitivePeerDependencies: - encoding - isomorphic-ws@5.0.0(ws@8.18.0): + isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - 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.6(ws@8.18.0): + isows@1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - isows@1.0.6(ws@8.18.1): + isows@1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) istanbul-lib-coverage@3.2.2: {} @@ -28736,7 +29058,7 @@ snapshots: transitivePeerDependencies: - supports-color - jsdom@24.1.3: + jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: cssstyle: 4.1.0 data-urls: 5.0.0 @@ -28757,7 +29079,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.1.0 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -28836,7 +29158,7 @@ snapshots: kleur@4.1.5: {} - langchain@0.0.200(@pinecone-database/pinecone@1.1.3)(axios@1.8.4)(cheerio@1.0.0)(encoding@0.1.13)(ignore@5.3.2)(jsdom@24.1.3)(lodash@4.17.21)(ws@8.18.0): + langchain@0.0.200(@pinecone-database/pinecone@1.1.3)(axios@1.8.4)(cheerio@1.0.0)(encoding@0.1.13)(ignore@5.3.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lodash@4.17.21)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@anthropic-ai/sdk': 0.9.1(encoding@0.1.13) '@langchain/core': 0.0.11 @@ -28861,9 +29183,9 @@ snapshots: axios: 1.8.4(debug@4.4.0) cheerio: 1.0.0 ignore: 5.3.2 - jsdom: 24.1.3 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) lodash: 4.17.21 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - encoding @@ -29190,6 +29512,8 @@ snapshots: loupe@3.1.2: {} + loupe@3.1.3: {} + lower-case-first@2.0.2: dependencies: tslib: 2.8.1 @@ -29596,11 +29920,17 @@ snapshots: neo-async@2.6.2: {} + neverthrow@8.2.0: + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.37.0 + next-themes@0.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + next-tick@1.1.0: {} + next@14.2.12(@babel/core@7.26.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 14.2.12 @@ -29672,6 +30002,8 @@ snapshots: detect-libc: 2.0.3 optional: true + node-gyp-build@4.8.4: {} + node-gyp@10.3.1: dependencies: env-paths: 2.2.1 @@ -30544,7 +30876,7 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@2.1.1: + puppeteer-core@2.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: '@types/mime-types': 2.1.4 debug: 4.4.0 @@ -30555,7 +30887,7 @@ snapshots: progress: 2.0.3 proxy-from-env: 1.1.0 rimraf: 2.7.1 - ws: 6.2.3 + ws: 6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - supports-color @@ -31562,6 +31894,8 @@ snapshots: std-env@3.8.1: {} + std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -31569,9 +31903,9 @@ snapshots: store2@2.14.4: {} - storybook@7.6.20(encoding@0.1.13): + storybook@7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - '@storybook/cli': 7.6.20(encoding@0.1.13) + '@storybook/cli': 7.6.20(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -32018,12 +32352,19 @@ snapshots: fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@0.8.4: {} tinypool@1.0.2: {} tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} + tinyspy@2.2.1: {} tinyspy@3.0.2: {} @@ -32313,6 +32654,8 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 + type@2.7.3: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -32348,6 +32691,10 @@ snapshots: typed-function@4.2.1: {} + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typedarray@0.0.6: {} typedoc-plugin-coverage@3.4.1(typedoc@0.26.11(typescript@5.8.2)): @@ -32587,6 +32934,10 @@ snapshots: dependencies: react: 19.0.0 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + util-deprecate@1.0.2: {} util@0.10.4: @@ -32641,17 +32992,17 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - viem@2.21.19(typescript@5.7.2)(zod@3.24.2): + viem@2.21.19(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.6.0 '@noble/hashes': 1.5.0 '@scure/bip32': 1.5.0 '@scure/bip39': 1.4.0 - abitype: 1.0.6(typescript@5.7.2)(zod@3.24.2) - isows: 1.0.6(ws@8.18.0) + abitype: 1.0.6(typescript@5.7.2)(zod@3.24.3) + isows: 1.0.6(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) webauthn-p256: 0.0.10 - ws: 8.18.0 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -32659,16 +33010,16 @@ snapshots: - utf-8-validate - zod - viem@2.23.15(typescript@5.7.2)(zod@3.24.2): + viem@2.23.15(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.2): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 abitype: 1.0.8(typescript@5.7.2)(zod@3.24.2) - isows: 1.0.6(ws@8.18.1) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.6.9(typescript@5.7.2)(zod@3.24.2) - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -32676,16 +33027,16 @@ snapshots: - utf-8-validate - zod - viem@2.23.15(typescript@5.7.3)(zod@3.24.2): + viem@2.23.15(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10)(zod@3.24.2): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 abitype: 1.0.8(typescript@5.7.3)(zod@3.24.2) - isows: 1.0.6(ws@8.18.1) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.6.9(typescript@5.7.3)(zod@3.24.2) - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -32693,16 +33044,16 @@ snapshots: - utf-8-validate - zod - viem@2.23.15(typescript@5.8.2)(zod@3.24.2): + viem@2.23.15(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2): dependencies: '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@scure/bip32': 1.6.2 '@scure/bip39': 1.5.4 abitype: 1.0.8(typescript@5.8.2)(zod@3.24.2) - isows: 1.0.6(ws@8.18.1) + isows: 1.0.6(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ox: 0.6.9(typescript@5.8.2)(zod@3.24.2) - ws: 8.18.1 + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -32710,7 +33061,7 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(typescript@5.7.2)(zod@3.24.1): + viem@2.9.20(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.1): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -32718,8 +33069,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.7.2)(zod@3.24.1) - 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.7.2 transitivePeerDependencies: @@ -32727,16 +33078,16 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(typescript@5.7.2)(zod@3.24.2): + viem@2.9.20(bufferutil@4.0.9)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.24.3): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.7.2)(zod@3.24.2) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + abitype: 1.0.0(typescript@5.7.2)(zod@3.24.3) + 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.7.2 transitivePeerDependencies: @@ -32744,16 +33095,16 @@ snapshots: - utf-8-validate - zod - viem@2.9.20(typescript@5.7.3)(zod@3.24.2): + viem@2.9.20(bufferutil@4.0.9)(typescript@5.7.3)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.7.3)(zod@3.24.2) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + abitype: 1.0.0(typescript@5.7.3) + 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.7.3 transitivePeerDependencies: @@ -32833,6 +33184,48 @@ snapshots: - supports-color - terser + vite-node@3.1.2(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-node@3.1.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite-plugin-mkcert@1.17.8(vite@6.2.3(@types/node@20.17.27)(jiti@1.21.7)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0)): dependencies: axios: 1.8.4(debug@4.4.0) @@ -33168,6 +33561,20 @@ snapshots: tsx: 4.19.2 yaml: 2.7.0 + vite@6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.37.0 + optionalDependencies: + '@types/node': 18.19.68 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.29.1 + terser: 5.39.0 + tsx: 4.19.2 + yaml: 2.7.0 + vite@6.2.3(@types/node@20.17.27)(jiti@1.21.7)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): dependencies: esbuild: 0.25.1 @@ -33200,7 +33607,7 @@ snapshots: optionalDependencies: vite: 5.4.11(@types/node@22.14.1)(lightningcss@1.29.1)(terser@5.39.0) - vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0): + vitest@1.6.0(@types/node@18.19.68)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -33224,7 +33631,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.68 - jsdom: 24.1.3 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -33235,7 +33642,7 @@ snapshots: - supports-color - terser - vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0): + vitest@1.6.0(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0): dependencies: '@vitest/expect': 1.6.0 '@vitest/runner': 1.6.0 @@ -33259,7 +33666,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.14.1 - jsdom: 24.1.3 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -33270,7 +33677,7 @@ snapshots: - supports-color - terser - vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0): + vitest@1.6.1(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -33294,7 +33701,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.14.1 - jsdom: 24.1.3 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss @@ -33305,7 +33712,7 @@ snapshots: - supports-color - terser - vitest@2.1.8(@types/node@22.14.1)(jsdom@24.1.3)(lightningcss@1.29.1)(terser@5.39.0): + vitest@2.1.8(@types/node@22.14.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0): dependencies: '@vitest/expect': 2.1.8 '@vitest/mocker': 2.1.8(vite@5.4.15(@types/node@22.14.1)(lightningcss@1.29.1)(terser@5.39.0)) @@ -33329,8 +33736,86 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.14.1 - jsdom: 24.1.3 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vitest@3.1.2(@types/node@18.19.68)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.1.2 + '@vitest/mocker': 3.1.2(vite@6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.1.2 + '@vitest/runner': 3.1.2 + '@vitest/snapshot': 3.1.2 + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.3(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + vite-node: 3.1.2(@types/node@18.19.68)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 18.19.68 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.1.2(@types/node@22.14.1)(jiti@2.4.2)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.1.2 + '@vitest/mocker': 3.1.2(vite@6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0)) + '@vitest/pretty-format': 3.1.2 + '@vitest/runner': 3.1.2 + '@vitest/snapshot': 3.1.2 + '@vitest/spy': 3.1.2 + '@vitest/utils': 3.1.2 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.1 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.3(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + vite-node: 3.1.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.1)(terser@5.39.0)(tsx@4.19.2)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.14.1 + jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -33340,6 +33825,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vscode-uri@3.0.8: {} @@ -33411,6 +33898,17 @@ snapshots: webpack-virtual-modules@0.6.2: {} + websocket@1.0.35: + dependencies: + bufferutil: 4.0.9 + debug: 2.6.9 + es5-ext: 0.10.64 + typedarray-to-buffer: 3.1.5 + utf-8-validate: 5.0.10 + yaeti: 0.0.6 + transitivePeerDependencies: + - supports-color + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -33672,17 +34170,32 @@ snapshots: type-fest: 0.4.1 write-json-file: 3.2.0 - ws@6.2.3: + ws@6.2.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@7.4.6: {} + ws@7.4.6(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.18.0: {} + ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 - ws@8.18.1: {} + ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 xml-name-validator@5.0.0: {} @@ -33694,6 +34207,8 @@ snapshots: y18n@5.0.8: {} + yaeti@0.0.6: {} + yallist@3.1.1: {} yallist@4.0.0: {} @@ -33764,6 +34279,8 @@ snapshots: zod@3.24.2: {} + zod@3.24.3: {} + zustand@3.7.2(react@18.3.1): optionalDependencies: react: 18.3.1 diff --git a/turbo.json b/turbo.json index e03e2dbe..87354595 100644 --- a/turbo.json +++ b/turbo.json @@ -36,6 +36,10 @@ "docs": { "dependsOn": ["^build:deps", "^docs"], "outputs": ["docs/**"] + }, + "test": {}, + "test:watch": { + "persistent": true } } } diff --git a/worlds/dojo-starter b/worlds/dojo-starter index c75023fb..d617aabd 160000 --- a/worlds/dojo-starter +++ b/worlds/dojo-starter @@ -1 +1 @@ -Subproject commit c75023fb15f13da7209d05ef74f210ed1dfcc78b +Subproject commit d617aabdeb1cbebc4b77e58059040aa37a36411e diff --git a/worlds/onchain-dash b/worlds/onchain-dash index 3e964c85..e50d9495 160000 --- a/worlds/onchain-dash +++ b/worlds/onchain-dash @@ -1 +1 @@ -Subproject commit 3e964c852cccf1f5001792daf0736aee8189017e +Subproject commit e50d949527ef1351522cf05d2769a1da64c2da38