diff --git a/packages/recs/CHANGELOG.md b/packages/recs/CHANGELOG.md index b0d49274a6..087a86db2e 100644 --- a/packages/recs/CHANGELOG.md +++ b/packages/recs/CHANGELOG.md @@ -1,5 +1,83 @@ # Change Log +## 2.1.0 (`@dojoengine/recs`) + +Republished as `@dojoengine/recs` from this repository. Backwards-compatible +with `@dojoengine/recs@2.0.13` at the runtime API level; the Schema type +widening is additive (every old flat schema still satisfies `Type | Schema`). + +### Nested schema support (ported from the previous fork) + +- `Schema` is now `{ [key: string]: Type | Schema }` so sub-struct fields + like Eternum's `WorldConfig.season_addresses_config` type-check without + casts. `ComponentValue` and `Component.values` handle the recursion. + +### Query correctness + +- `HasValue` / `NotValue` read only the keys present in the partial value, + avoiding a full `getComponentValue` materialization. On a 216-field + `Resource` component this drops per-check cost from 216 `Map.get` to 1. +- `valueEquals` recurses into plain objects and arrays. Fixes silent + `HasValue(WorldConfig, { season_addresses_config: { … } })` failures on + fresh object/array references with identical contents — previously + compared by reference and always returned `false`. + +### Performance + +- `removeOverride` is now O(K_entity) via a per-entity override list + (was O(N log N) over all overrides in the world). +- `hasComponent` and `Component.entities()` cache the first values-Map per + component — no more `Object.values(component.values)[0]` allocation per + query iteration. +- `runQuery` no longer defensively spread-copies the entity set per + fragment; mutations are collected into `toDelete` / `toAdd` arrays. + `getChildEntities` is memoized per `runQuery` call so shared proxy + ancestors aren't re-walked. +- `defineQuery` deduplicates component subscriptions (a fragment list with + the same component twice used to double-process every emission) and + pre-buckets fragments by component id. +- `setComponent` skips the previous-value read when + `skipUpdateStream: true` (used by bulk-hydration syncs). +- `createLocalCache` flushes are coalesced via `throttleTime` — a burst + of 200 updates does 2 storage writes instead of 200. + +### Indexer + +- `getValueKey` uses a schema-ordered, delimiter-separated + `JSON.stringify(value[k], bigIntReplacer)` key. Fixes collisions like + `{x:"1/2",y:"3"}` vs `{x:"1",y:"2/3"}`, and fixes the + `TypeError: Do not know how to serialize a BigInt` crash on any indexed + component with `Type.BigInt` / `Type.BigIntArray` fields. +- Empty value-buckets are GC'd on remove so components with many unique + values (positions, balances) no longer leak a bucket entry per distinct + value forever. +- No-op re-indexes are skipped when the value didn't actually change + between emissions. + +### Bug fixes + +- `setComponent(OverridableComponent, …)` no longer throws + `TypeError: Method Map.prototype.set called on incompatible receiver`; + `Map.prototype` methods are bound to the target on the per-key proxy. +- The per-key `valueProxyHandler.get` honors `null` overrides correctly by + checking `key in override` instead of `override[key] != null`. + +### New APIs + +- `getDiagnostics(world)` — returns `{ entityCount, componentCount, +components: [{ id, entitiesWithValue, indexerBuckets? }] }`. For + long-running-session health metrics. +- `getIndexerStats(component)` — returns `{ bucketCount }` for indexed + components (undefined otherwise). + +### Tooling + +- 29 benchmarks (`pnpm test:bench`) with committed `baseline.json`. + B1–B18 cover generic hot paths, B19–B24 cover Eternum-shape workloads + (216-field Resource, 48-array ResourceArrival, BigInt-indexed Guild), + B25 is a soak test that asserts no linear-growth leaks across 10 churn + cycles, B26 covers nested-schema `HasValue`. + ## 2.2.23 ### Patch Changes diff --git a/packages/recs/benchmarks/README.md b/packages/recs/benchmarks/README.md new file mode 100644 index 0000000000..446b71992a --- /dev/null +++ b/packages/recs/benchmarks/README.md @@ -0,0 +1,115 @@ +# `recs` benchmarks + +Phase 0 baseline benchmarks for the optimization work tracked in +`~/.claude/plans/build-a-detailed-plan-prancy-wave.md`. + +## Run + +```bash +pnpm --filter @latticexyz/recs test:bench +``` + +Each case prints a `[BENCH] {...json...}` line with `id`, `name`, `iterations`, +`totalMs`, `avgMs`, `opsPerSec`, `heapDeltaBytes`. The full set is persisted to +`baseline.json` in this directory. + +## Files + +- `baseline.json` — last captured run. **Update with every Phase PR** that + improves any benchmark, so reviewers can `git diff` the perf change. +- `../src/Benchmark.spec.ts` — the suite (one `describe` per group). +- `../src/test-utils/bench.ts` — `bench(id, name, fn, opts)` helper. + +## Benchmarks + +| ID | Hot path | Plan issue | +| -------------------- | ------------------------------------------------------------------------- | -------------------------------- | +| B1 | `hasComponent` × 100k | #8 `Object.values()[0]` per call | +| B2 | `Component.entities()` iteration over 100k | #8 same | +| B3 | Indexer add+remove of 10k unique values | #11 empty-bucket leak | +| B4 | `Indexer.getEntitiesWithValue` × 10k, 100 matches each | #10 fresh-Set per call | +| B5 | Indexer no-op `setComponent` × 10k | #12 wasted re-index | +| B6 | Indexer key-collision regression (`{x:"1/2",y:"3"}` vs `{x:"1",y:"2/3"}`) | #12 correctness | +| B7-100, B7-1k, B7-5k | `removeOverride` × K, single entity | #1 O(N log N) sort | +| B8 | Overridable `entities()` × 1k calls | #2 fresh-Set alloc | +| B9 | Overridable `values[x].keys()` × 1k calls | #3 fresh-Set + correctness | +| B10-10k, B10-100k | `runQuery` 4 `Has` fragments | #9 defensive copies | +| B11 | `runQuery` `Has` + `HasValue` (non-indexed) | #6 O(N·K) scan | +| B12 | `getChildEntities` depth=4 branch=10 (non-indexed) | #5 no memoization | +| B13 | `getChildEntities` depth=4 branch=10 (indexed) | reference: indexer path | +| B14 | `defineQuery` proxy, 100 updates on 10k matched set | #4 full re-eval | +| B15 | `defineQuery` same component in 2 fragments, 1k updates | #13 double-subscribe | +| B16 | `setComponent` × 100k with `skipUpdateStream: true` | #15 wasted prevValue read | +| B17 | `componentValueEquals` × 1M | #18 cleanup | +| B18 | `createLocalCache` 200 updates on 1k-entity component | #7 O(N) serialize per write | + +## Conventions + +- Warmup runs equal to `iterations / 10` (or 1) before each measured loop. +- Heap delta is measured with `process.memoryUsage().heapUsed` before/after; if + `--expose-gc` is available, `global.gc()` runs first. Treat as coarse signal. +- Use `--runInBand` (set in `test:bench` script) so concurrent test workers + don't poison timings. +- B6 also logs `[BENCH-NOTE] B6 indexer key-collisions ...` — expect 0 after + Phase 1. +- B14/B15 log emitted-event counts as `[BENCH-NOTE]` so we can verify the + algorithmic improvements (Phase 3 should drop B14 emitted events + drastically; Phase 1 dedupe should halve B15). + +## Updating the baseline + +When a phase PR improves a benchmark: + +1. Re-run `pnpm --filter @latticexyz/recs test:bench`. +2. Commit the updated `baseline.json`. +3. Paste a before/after table in the PR description quoting the affected `id`s. +4. Tighten the (loose) regression assertions in `Benchmark.spec.ts` for the + metrics you improved. + +## Phase 1+2 deltas vs Phase 0 baseline + +`darwin / node v20.9.0`. Negative deltas = faster. + +| ID | Hot path | P0 avgMs | P1+P2 avgMs | Δ | +| -------- | ---------------------------------------- | -------: | ----------: | -----------: | +| B1 | `hasComponent` x 100k | 0.37 | 0.13 | **−64%** | +| B2 | `Component.entities()` iter 100k | 17.18 | 11.29 | **−34%** | +| B3 | Indexer add+remove 10k unique | 51.95 | 70.70 | **+36%** ¹ | +| B4 | Indexer `getEntitiesWithValue` x 10k | 160.27 | 142.34 | −11% | +| B5 | Indexer no-op setComponent x 10k | 24.28 | 23.39 | −4% | +| B7-1k | `removeOverride` x 1000 | 20.37 | 5.72 | **−72%** | +| B7-5k | `removeOverride` x 5000 | 259.91 | 59.47 | **−77%** | +| B8 | Overridable `entities()` x 1k | 2017.95 | 1718.54 | −15% | +| B9 | Overridable `keys()` x 1k | 537.19 | 474.05 | −12% | +| B10-10k | `runQuery` 4 Has on 10k | 13.06 | 6.94 | **−47%** | +| B10-100k | `runQuery` 4 Has on 100k | 156.44 | 88.11 | **−44%** | +| B11 | `runQuery` Has + HasValue (non-indexed) | 8.12 | 7.30 | −10% | +| B12 | `getChildEntities` d=4 b=10 (non-idx) | 8663.57 | 7422.31 | −14% | +| B13 | `getChildEntities` d=4 b=10 (indexed) | 7.86 | 3.67 | **−53%** | +| B14 | `defineQuery` proxy, 100 updates / 10k | 1416.28 | 917.53 | **−35%** | +| B15 | `defineQuery` same-component 2 fragments | 7.31 | 4.45 | **−39%** | +| B16 | `setComponent` skip-stream x 100k | 133.93 | 63.26 | **−53%** | +| B17 | `componentValueEquals` x 1M | 180.91 | 134.18 | −26% | +| B18 | `createLocalCache` 200 updates / 1k | 116.30 | 0.32 | **−99.7%** ² | + +¹ B3 regressed because Phase 1 now (a) GCs empty buckets via an extra +`Map.delete` per remove and (b) uses a JSON-stringified key (more allocation +per write than the old `Object.values().join('/')`). The trade-off is +correctness — the old key collided across values like `{x:"1/2",y:"3"}` vs +`{x:"1",y:"2/3"}` and leaked an empty `Set` per distinct value forever. + +² B18 is a `throttleTime(leading+trailing)` win: the leading write fires +synchronously (so the bench's `localStorage` check still passes), and the +remaining 199 writes in the burst collapse to a single trailing emission +that fires after the bench window. Real-world: 200 rapid updates → 2 +storage writes instead of 200. + +Phase 3 (localized `defineQuery` proxy re-evaluation) is deferred — see plan. + +## Notes from Phase 0 baseline run + +A Map-proxy bug also surfaced while writing the suite: calling +`setComponent(Overridable, ...)` directly threw `TypeError: Method +Map.prototype.set called on incompatible receiver #`. Existing call sites +worked around this by setting on the underlying component. Fixed in Phase 1 by +binding `Map.prototype` methods to the underlying target. diff --git a/packages/recs/benchmarks/baseline.json b/packages/recs/benchmarks/baseline.json new file mode 100644 index 0000000000..219d4f4d09 --- /dev/null +++ b/packages/recs/benchmarks/baseline.json @@ -0,0 +1,268 @@ +{ + "capturedAt": "2026-04-22T07:11:05.492Z", + "nodeVersion": "v20.9.0", + "platform": "darwin", + "results": [ + { + "id": "B1", + "name": "hasComponent x 100k", + "iterations": 100, + "totalMs": 14.906, + "avgMs": 0.14906, + "opsPerSec": 6708.69, + "heapDeltaBytes": 4344 + }, + { + "id": "B2", + "name": "Component.entities() iter 100k", + "iterations": 10, + "totalMs": 133.984, + "avgMs": 13.398404, + "opsPerSec": 74.64, + "heapDeltaBytes": 1192752 + }, + { + "id": "B3", + "name": "Indexer add+remove 10k unique values", + "iterations": 3, + "totalMs": 325.0461, + "avgMs": 108.348708, + "opsPerSec": 9.23, + "heapDeltaBytes": 4490696 + }, + { + "id": "B4", + "name": "Indexer.getEntitiesWithValue x 10k", + "iterations": 5, + "totalMs": 863.7314, + "avgMs": 172.746283, + "opsPerSec": 5.79, + "heapDeltaBytes": 763720 + }, + { + "id": "B5", + "name": "Indexer no-op setComponent x 10k", + "iterations": 5, + "totalMs": 133.2433, + "avgMs": 26.648658, + "opsPerSec": 37.53, + "heapDeltaBytes": 449648 + }, + { + "id": "B6", + "name": "Indexer key-collision regression", + "iterations": 1000, + "totalMs": 1.0425, + "avgMs": 0.001043, + "opsPerSec": 959194.89, + "heapDeltaBytes": 472408 + }, + { + "id": "B7-100", + "name": "removeOverride x 100", + "iterations": 3, + "totalMs": 1.6578, + "avgMs": 0.552583, + "opsPerSec": 1809.68, + "heapDeltaBytes": 807184 + }, + { + "id": "B7-1k", + "name": "removeOverride x 1000", + "iterations": 3, + "totalMs": 20.2441, + "avgMs": 6.748028, + "opsPerSec": 148.19, + "heapDeltaBytes": -10413864 + }, + { + "id": "B7-5k", + "name": "removeOverride x 5000", + "iterations": 3, + "totalMs": 199.6026, + "avgMs": 66.534194, + "opsPerSec": 15.03, + "heapDeltaBytes": -5999832 + }, + { + "id": "B8", + "name": "Overridable.entities() x 1k", + "iterations": 3, + "totalMs": 5676.866, + "avgMs": 1892.288681, + "opsPerSec": 0.53, + "heapDeltaBytes": 5922960 + }, + { + "id": "B9", + "name": "Overridable values[x].keys() x 1k", + "iterations": 3, + "totalMs": 1611.7993, + "avgMs": 537.266445, + "opsPerSec": 1.86, + "heapDeltaBytes": 5994624 + }, + { + "id": "B10-10k", + "name": "runQuery 4 Has on 10000 entities", + "iterations": 5, + "totalMs": 37.373, + "avgMs": 7.474592, + "opsPerSec": 133.79, + "heapDeltaBytes": 6879808 + }, + { + "id": "B10-100k", + "name": "runQuery 4 Has on 100000 entities", + "iterations": 5, + "totalMs": 462.1503, + "avgMs": 92.430058, + "opsPerSec": 10.82, + "heapDeltaBytes": 15120744 + }, + { + "id": "B11", + "name": "runQuery Has + HasValue (non-indexed)", + "iterations": 50, + "totalMs": 400.2439, + "avgMs": 8.004878, + "opsPerSec": 124.92, + "heapDeltaBytes": 5811904 + }, + { + "id": "B12", + "name": "getChildEntities d=4 b=10 (non-indexed)", + "iterations": 1, + "totalMs": 10876.2097, + "avgMs": 10876.209666, + "opsPerSec": 0.09, + "heapDeltaBytes": 2822656 + }, + { + "id": "B13", + "name": "getChildEntities d=4 b=10 (indexed)", + "iterations": 5, + "totalMs": 19.7355, + "avgMs": 3.9471, + "opsPerSec": 253.35, + "heapDeltaBytes": -1180608 + }, + { + "id": "B14", + "name": "defineQuery proxy, 100 updates on 10k matched", + "iterations": 3, + "totalMs": 2841.0332, + "avgMs": 947.011069, + "opsPerSec": 1.06, + "heapDeltaBytes": 15752224 + }, + { + "id": "B15", + "name": "defineQuery same-component 2 fragments, 1k updates", + "iterations": 3, + "totalMs": 8.9887, + "avgMs": 2.996222, + "opsPerSec": 333.75, + "heapDeltaBytes": 4362096 + }, + { + "id": "B16", + "name": "setComponent skipUpdateStream x 100k", + "iterations": 3, + "totalMs": 141.3933, + "avgMs": 47.131111, + "opsPerSec": 21.22, + "heapDeltaBytes": -3242440 + }, + { + "id": "B17", + "name": "componentValueEquals x 1M", + "iterations": 3, + "totalMs": 461.4195, + "avgMs": 153.806514, + "opsPerSec": 6.5, + "heapDeltaBytes": 10607160 + }, + { + "id": "B18", + "name": "createLocalCache 200 updates / 1k entities", + "iterations": 1, + "totalMs": 0.3134, + "avgMs": 0.313375, + "opsPerSec": 3191.07, + "heapDeltaBytes": 155344 + }, + { + "id": "B19", + "name": "Resource hydrate 200 entities (skipUpdateStream)", + "iterations": 5, + "totalMs": 38.6028, + "avgMs": 7.720558, + "opsPerSec": 129.52, + "heapDeltaBytes": 7443736 + }, + { + "id": "B20", + "name": "50 Resource updates with HasValue(entity_id) defineQuery", + "iterations": 3, + "totalMs": 36.1458, + "avgMs": 12.048611, + "opsPerSec": 83, + "heapDeltaBytes": 379136 + }, + { + "id": "B21", + "name": "runQuery Has(Resource) + HasValue(entity_id) over 200", + "iterations": 100, + "totalMs": 15.033, + "avgMs": 0.15033, + "opsPerSec": 6652.01, + "heapDeltaBytes": 4009568 + }, + { + "id": "B22", + "name": "ResourceArrival phantom updates (100 entities, fresh array refs)", + "iterations": 3, + "totalMs": 12.9913, + "avgMs": 4.330445, + "opsPerSec": 230.92, + "heapDeltaBytes": -7731960 + }, + { + "id": "B23", + "name": "Building 200 entities, 20 mixed HasValue lookups", + "iterations": 50, + "totalMs": 156.2686, + "avgMs": 3.125372, + "opsPerSec": 319.96, + "heapDeltaBytes": 4656256 + }, + { + "id": "B24", + "name": "Indexed Guild (3 BigInt/Number fields) x 1k HasValue lookups", + "iterations": 5, + "totalMs": 2065.0783, + "avgMs": 413.015658, + "opsPerSec": 2.42, + "heapDeltaBytes": 6489128 + }, + { + "id": "B26", + "name": "HasValue nested sub-struct x 10k (WorldConfig shape)", + "iterations": 5, + "totalMs": 155.3997, + "avgMs": 31.079942, + "opsPerSec": 32.18, + "heapDeltaBytes": -3495936 + }, + { + "id": "B25", + "name": "soak 10 cycles x 1000 entities (churn)", + "iterations": 1, + "totalMs": 0.0057, + "avgMs": 0.005667, + "opsPerSec": 176460.21, + "heapDeltaBytes": 304 + } + ] +} diff --git a/packages/recs/jest.config.js b/packages/recs/jest.config.js index a341a67a52..ced7698d49 100644 --- a/packages/recs/jest.config.js +++ b/packages/recs/jest.config.js @@ -4,6 +4,7 @@ export default { preset: "ts-jest", testEnvironment: "node", roots: ["src"], + testTimeout: 300000, moduleNameMapper: { // jest can't handle esm imports, so we import the typescript source instead "^@latticexyz/common$": "/../common/src/index.ts", diff --git a/packages/recs/package.json b/packages/recs/package.json index 6fbd1fb5e7..8a38821175 100644 --- a/packages/recs/package.json +++ b/packages/recs/package.json @@ -32,7 +32,8 @@ "clean:js": "shx rm -rf dist", "dev": "tsup --watch", "lint": "eslint . --ext .ts", - "test": "tsc --noEmit && jest", + "test": "tsc --noEmit && jest --testPathIgnorePatterns=Benchmark.spec", + "test:bench": "jest --testPathPattern=Benchmark.spec --runInBand", "test:ci": "pnpm run test" }, "dependencies": { diff --git a/packages/recs/scripts/publish-dojoengine.mjs b/packages/recs/scripts/publish-dojoengine.mjs new file mode 100644 index 0000000000..4b8b22bf81 --- /dev/null +++ b/packages/recs/scripts/publish-dojoengine.mjs @@ -0,0 +1,123 @@ +#!/usr/bin/env node +/** + * Publish this package to npm as `@dojoengine/recs`. + * + * The in-tree `package.json` stays named `@latticexyz/recs` so the monorepo + * keeps working unchanged. This script builds, stages a copy with a rewritten + * manifest, and runs `npm publish` from the staging directory. + * + * Defaults to `--dry-run`. Pass `--yolo` to actually publish. + * + * node scripts/publish-dojoengine.mjs # dry-run + * node scripts/publish-dojoengine.mjs --yolo # real publish (uses ambient npm auth) + * node scripts/publish-dojoengine.mjs --yolo --otp 123456 + * NPM_TOKEN=npm_xxx node scripts/publish-dojoengine.mjs --yolo + * + * When NPM_TOKEN is set, a staging-local `.npmrc` is written so the token + * is used only for this publish and never lands in ~/.npmrc. + */ +import { execFileSync } from "node:child_process"; +import { copyFileSync, cpSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { tmpdir } from "node:os"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const PKG_ROOT = resolve(__dirname, ".."); + +const TARGET_NAME = "@dojoengine/recs"; +const TARGET_VERSION = "2.1.0"; +const TARGET_REPOSITORY = { + type: "git", + url: "git+https://github.com/dojoengine/mud.git", + directory: "packages/recs", +}; +const TARGET_HOMEPAGE = "https://github.com/dojoengine/mud/tree/main/packages/recs#readme"; +const TARGET_BUGS = "https://github.com/dojoengine/mud/issues"; +const PINNED_DEPS = { + "@latticexyz/schema-type": "^2.2.23", + "@latticexyz/utils": "^2.2.23", +}; + +const yolo = process.argv.includes("--yolo"); +const otpIdx = process.argv.indexOf("--otp"); +const otp = otpIdx !== -1 ? process.argv[otpIdx + 1] : undefined; + +function run(cmd, args, cwd = PKG_ROOT) { + console.log(`$ ${cmd} ${args.join(" ")}`); + execFileSync(cmd, args, { cwd, stdio: "inherit" }); +} + +function readPkg() { + return JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")); +} + +function buildStagingManifest(src) { + const deps = { ...src.dependencies }; + for (const [name, pinned] of Object.entries(PINNED_DEPS)) { + if (deps[name]) deps[name] = pinned; + } + const files = Array.from(new Set([...(src.files ?? []), "CHANGELOG.md", "README.md"])); + const out = { + ...src, + name: TARGET_NAME, + version: TARGET_VERSION, + repository: TARGET_REPOSITORY, + homepage: TARGET_HOMEPAGE, + bugs: TARGET_BUGS, + files, + dependencies: deps, + }; + // Publish artifact shouldn't advertise test/build scripts to consumers. + delete out.scripts; + delete out.devDependencies; + return out; +} + +function main() { + console.log("--- building @latticexyz/recs (tsup) ---"); + run("pnpm", ["run", "build"]); + + const stagingRoot = mkdtempSync(join(tmpdir(), "dojoengine-recs-")); + console.log(`--- staging to ${stagingRoot} ---`); + cpSync(join(PKG_ROOT, "dist"), join(stagingRoot, "dist"), { recursive: true }); + copyFileSync(join(PKG_ROOT, "README.md"), join(stagingRoot, "README.md")); + copyFileSync(join(PKG_ROOT, "CHANGELOG.md"), join(stagingRoot, "CHANGELOG.md")); + + const staged = buildStagingManifest(readPkg()); + writeFileSync(join(stagingRoot, "package.json"), JSON.stringify(staged, null, 2) + "\n"); + + // If NPM_TOKEN is provided, write a staging-local .npmrc so it's used only + // for this publish. Never logged. Leaves ~/.npmrc untouched. + if (process.env.NPM_TOKEN) { + writeFileSync( + join(stagingRoot, ".npmrc"), + `//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n` + + `registry=https://registry.npmjs.org/\n` + + `always-auth=true\n`, + { mode: 0o600 }, + ); + console.log("(using NPM_TOKEN from env via staging-local .npmrc)"); + } + + console.log("--- staged package.json ---"); + console.log(JSON.stringify(staged, null, 2)); + + const publishArgs = ["publish", "--access", "public"]; + if (!yolo) publishArgs.push("--dry-run"); + if (otp) publishArgs.push("--otp", otp); + + console.log(yolo ? "--- PUBLISHING FOR REAL ---" : "--- npm publish --dry-run ---"); + run("npm", publishArgs, stagingRoot); + + if (yolo) { + rmSync(stagingRoot, { recursive: true, force: true }); + console.log(`\nPublished ${TARGET_NAME}@${TARGET_VERSION}.`); + } else { + console.log(`\nDry-run OK. Tarball contents shown above. Staging dir kept at:\n ${stagingRoot}\n`); + console.log("Re-run with --yolo to publish for real."); + } +} + +main(); diff --git a/packages/recs/src/Benchmark.spec.ts b/packages/recs/src/Benchmark.spec.ts new file mode 100644 index 0000000000..5a1f169fb8 --- /dev/null +++ b/packages/recs/src/Benchmark.spec.ts @@ -0,0 +1,1106 @@ +/** + * Phase 0 baseline benchmarks for `packages/recs`. + * + * Each benchmark is keyed by an ID (B1..B18) referenced in the optimization plan + * at `~/.claude/plans/build-a-detailed-plan-prancy-wave.md`. Bench output is + * a structured `[BENCH] {...json...}` line per case, and the full set is + * persisted to `packages/recs/benchmarks/baseline.json` in `afterAll`. + * + * Run with: `pnpm --filter @latticexyz/recs test:bench` + */ +import { resolve } from "path"; +import { + componentValueEquals, + createLocalCache, + defineComponent, + getComponentEntities, + hasComponent, + overridableComponent, + setComponent, +} from "./Component"; +import { createIndexer } from "./Indexer"; +import { createWorld, getDiagnostics } from "./World"; +import { createEntity } from "./Entity"; +import { Type } from "./constants"; +import { defineQuery, getChildEntities, Has, HasValue, NotValue, ProxyExpand, runQuery } from "./Query"; +import { Component, Entity } from "./types"; +import { bench, clearCollectedResults, writeBaseline } from "./test-utils/bench"; + +const BASELINE_PATH = resolve(__dirname, "../benchmarks/baseline.json"); + +beforeAll(() => { + clearCollectedResults(); +}); + +afterAll(() => { + writeBaseline(BASELINE_PATH); +}); + +// --------------------------------------------------------------------------- +// B1, B2: Component primitives +// --------------------------------------------------------------------------- + +describe("B1/B2 Component primitives", () => { + test("B1: hasComponent x 100k calls", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const entities: Entity[] = []; + for (let i = 0; i < 1000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + entities.push(e); + } + bench( + "B1", + "hasComponent x 100k", + () => { + for (let i = 0; i < 1000; i++) hasComponent(Position, entities[i % entities.length]); + }, + { iterations: 100 }, + ); + }); + + test("B2: Component.entities() iteration over 100k entities", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + for (let i = 0; i < 100_000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + } + bench( + "B2", + "Component.entities() iter 100k", + () => { + let count = 0; + for (const _ of getComponentEntities(Position)) count++; + if (count !== 100_000) throw new Error(`unexpected count ${count}`); + }, + { iterations: 10 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B3, B4, B5, B6: Indexer +// --------------------------------------------------------------------------- + +describe("B3-B6 Indexer", () => { + test("B3: Indexer add then remove of 10k unique values (empty-bucket leak)", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Indexed = createIndexer(Position); + + const entities: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Indexed, e, { x: i, y: i }); + entities.push(e); + } + + let leakedAfter = 0; + bench( + "B3", + "Indexer add+remove 10k unique values", + () => { + for (const e of entities) setComponent(Indexed, e, { x: -1, y: -1 }); + // After re-pointing all entities at the same value, the 10k unique + // buckets should be empty. Today they leak; track for regression. + leakedAfter = countEmptyBuckets(Indexed); + // Reset for next iteration + for (let i = 0; i < entities.length; i++) setComponent(Indexed, entities[i], { x: i, y: i }); + }, + { iterations: 3, warmup: 1 }, + ); + console.log(`[BENCH-NOTE] B3 empty-bucket leak count after re-point: ${leakedAfter}`); + }); + + test("B4: Indexer getEntitiesWithValue 10k calls, 100 matches each", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Indexed = createIndexer(Position); + + // 100 entities share the lookup value; 9900 others spread out. + for (let i = 0; i < 100; i++) { + const e = createEntity(world); + setComponent(Indexed, e, { x: 1, y: 1 }); + } + for (let i = 0; i < 9_900; i++) { + const e = createEntity(world); + setComponent(Indexed, e, { x: i + 100, y: i + 100 }); + } + + bench( + "B4", + "Indexer.getEntitiesWithValue x 10k", + () => { + for (let i = 0; i < 10_000; i++) Indexed.getEntitiesWithValue({ x: 1, y: 1 }); + }, + { iterations: 5 }, + ); + }); + + test("B5: setComponent on indexed component with same value twice (no-op re-index)", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Indexed = createIndexer(Position); + + const entities: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Indexed, e, { x: i, y: i }); + entities.push(e); + } + + bench( + "B5", + "Indexer no-op setComponent x 10k", + () => { + for (let i = 0; i < entities.length; i++) { + setComponent(Indexed, entities[i], { x: i, y: i }); + } + }, + { iterations: 5 }, + ); + }); + + test("B6: Indexer key-collision regression (functional, not a perf benchmark)", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.String, y: Type.String }); + const Indexed = createIndexer(Position); + + const eA = createEntity(world); + setComponent(Indexed, eA, { x: "1/2", y: "3" }); + + const eB = createEntity(world); + setComponent(Indexed, eB, { x: "1", y: "2/3" }); + + const matchA = Indexed.getEntitiesWithValue({ x: "1/2", y: "3" }); + const matchB = Indexed.getEntitiesWithValue({ x: "1", y: "2/3" }); + + // Today: Object.values(value).join("/") collides → both matches contain both entities. + // Record the collision count for regression baseline. After Phase 1, this should be 0. + const collisions = (matchA.has(eB) ? 1 : 0) + (matchB.has(eA) ? 1 : 0); + console.log(`[BENCH-NOTE] B6 indexer key-collisions (expected 0 after fix, currently 2): ${collisions}`); + bench( + "B6", + "Indexer key-collision regression", + () => { + Indexed.getEntitiesWithValue({ x: "1/2", y: "3" }); + }, + { iterations: 1000 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B7, B8, B9: Overridable component +// --------------------------------------------------------------------------- + +describe("B7-B9 Overridable component", () => { + test.each([ + ["B7-100", 100], + ["B7-1k", 1_000], + ["B7-5k", 5_000], + ])("B7: removeOverride x %s on a single entity", (id, k) => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Overridable = overridableComponent(Position); + const e = createEntity(world); + setComponent(Position, e, { x: 0, y: 0 }); + + bench( + id, + `removeOverride x ${k}`, + () => { + const ids: string[] = []; + for (let i = 0; i < (k as number); i++) { + const oid = `o-${i}`; + Overridable.addOverride(oid, { entity: e, value: { x: i, y: i } }); + ids.push(oid); + } + for (const oid of ids) Overridable.removeOverride(oid); + }, + { iterations: 3, warmup: 1 }, + ); + }); + + test("B8: Overridable component.entities() x 1k calls (10k entities, 1k overrides)", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Overridable = overridableComponent(Position); + + const entities: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + entities.push(e); + } + for (let i = 0; i < 1_000; i++) { + Overridable.addOverride(`o-${i}`, { entity: entities[i], value: { x: -i, y: -i } }); + } + + bench( + "B8", + "Overridable.entities() x 1k", + () => { + for (let i = 0; i < 1_000; i++) { + let n = 0; + for (const _ of Overridable.entities()) n++; + if (n !== 10_000) throw new Error(`unexpected count ${n}`); + } + }, + { iterations: 3, warmup: 1 }, + ); + }); + + test("B9: Overridable proxy values[key].keys() x 1k calls", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Overridable = overridableComponent(Position); + + const entities: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + entities.push(e); + } + for (let i = 0; i < 1_000; i++) { + Overridable.addOverride(`o-${i}`, { entity: entities[i], value: { x: -i, y: -i } }); + } + + bench( + "B9", + "Overridable values[x].keys() x 1k", + () => { + for (let i = 0; i < 1_000; i++) { + let n = 0; + for (const _ of Overridable.values.x.keys()) n++; + if (n < 10_000) throw new Error(`unexpected count ${n}`); + } + }, + { iterations: 3, warmup: 1 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B10, B11: runQuery +// --------------------------------------------------------------------------- + +describe("B10-B11 runQuery", () => { + test.each([ + ["B10-10k", 10_000], + ["B10-100k", 100_000], + ])("B10: runQuery 4 Has fragments on %s entities", (id, n) => { + const world = createWorld(); + const A = defineComponent(world, { v: Type.Number }); + const B = defineComponent(world, { v: Type.Number }); + const C = defineComponent(world, { v: Type.Number }); + const D = defineComponent(world, { v: Type.Number }); + + for (let i = 0; i < (n as number); i++) { + const e = createEntity(world); + setComponent(A, e, { v: i }); + setComponent(B, e, { v: i }); + setComponent(C, e, { v: i }); + setComponent(D, e, { v: i }); + } + + bench( + id, + `runQuery 4 Has on ${n} entities`, + () => { + runQuery([Has(A), Has(B), Has(C), Has(D)]); + }, + { iterations: 5 }, + ); + }); + + test("B11: runQuery Has + HasValue (non-indexed) on 10k entities", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + } + + bench( + "B11", + "runQuery Has + HasValue (non-indexed)", + () => { + runQuery([Has(Position), HasValue(Position, { x: 5000, y: 5000 })]); + }, + { iterations: 50 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B12, B13: getChildEntities +// --------------------------------------------------------------------------- + +describe("B12-B13 getChildEntities", () => { + function buildTree(world: ReturnType, OwnedBy: Component<{ value: Type.Entity }>) { + // Build tree: root → 10 → 100 → 1000 → 10000 (~11,111 entities). + const root = createEntity(world); + const lvl1: Entity[] = []; + for (let i = 0; i < 10; i++) { + const e = createEntity(world); + setComponent(OwnedBy, e, { value: root }); + lvl1.push(e); + } + const lvl2: Entity[] = []; + for (const p of lvl1) { + for (let i = 0; i < 10; i++) { + const e = createEntity(world); + setComponent(OwnedBy, e, { value: p }); + lvl2.push(e); + } + } + const lvl3: Entity[] = []; + for (const p of lvl2) { + for (let i = 0; i < 10; i++) { + const e = createEntity(world); + setComponent(OwnedBy, e, { value: p }); + lvl3.push(e); + } + } + for (const p of lvl3) { + for (let i = 0; i < 10; i++) { + const e = createEntity(world); + setComponent(OwnedBy, e, { value: p }); + } + } + return root; + } + + test("B12: getChildEntities depth=4 branching=10 (NON-INDEXED)", () => { + const world = createWorld(); + const OwnedBy = defineComponent(world, { value: Type.Entity }); + const root = buildTree(world, OwnedBy); + + bench( + "B12", + "getChildEntities d=4 b=10 (non-indexed)", + () => { + getChildEntities(root, OwnedBy, 4); + }, + { iterations: 1, warmup: 0 }, + ); + }); + + test("B13: getChildEntities depth=4 branching=10 (INDEXED)", () => { + const world = createWorld(); + const OwnedBy = defineComponent(world, { value: Type.Entity }, { indexed: true }); + const root = buildTree(world, OwnedBy); + + bench( + "B13", + "getChildEntities d=4 b=10 (indexed)", + () => { + getChildEntities(root, OwnedBy, 4); + }, + { iterations: 5 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B14, B15: defineQuery +// --------------------------------------------------------------------------- + +describe("B14-B15 defineQuery", () => { + test("B14: defineQuery with proxy, 100 single-entity updates", () => { + const world = createWorld(); + const OwnedBy = defineComponent(world, { value: Type.Entity }, { indexed: true }); + const Marker = defineComponent(world, { v: Type.Number }); + + const root = createEntity(world); + setComponent(Marker, root, { v: 1 }); + + // 10k descendants reachable via ProxyExpand. + const children: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(OwnedBy, e, { value: root }); + children.push(e); + } + + const q = defineQuery([ProxyExpand(OwnedBy, 1), Has(Marker)], { runOnInit: true }); + let emitted = 0; + const sub = q.update$.subscribe(() => emitted++); + + bench( + "B14", + "defineQuery proxy, 100 updates on 10k matched", + () => { + emitted = 0; + for (let i = 0; i < 100; i++) setComponent(Marker, root, { v: i }); + }, + { iterations: 3, warmup: 1 }, + ); + console.log(`[BENCH-NOTE] B14 emitted events per 100 updates: ${emitted}`); + sub.unsubscribe(); + }); + + test("B15: defineQuery with same component in 2 fragments (double-subscribe)", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + + const entities: Entity[] = []; + for (let i = 0; i < 10_000; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: i, y: i }); + entities.push(e); + } + + const q = defineQuery([Has(Position), NotValue(Position, { x: 0, y: 0 })], { runOnInit: false }); + let emitted = 0; + const sub = q.update$.subscribe(() => emitted++); + + bench( + "B15", + "defineQuery same-component 2 fragments, 1k updates", + () => { + emitted = 0; + for (let i = 0; i < 1_000; i++) { + setComponent(Position, entities[i], { x: i + 1, y: i + 1 }); + } + }, + { iterations: 3, warmup: 1 }, + ); + console.log(`[BENCH-NOTE] B15 emitted events per 1k updates (expect 1k after dedup): ${emitted}`); + sub.unsubscribe(); + }); +}); + +// --------------------------------------------------------------------------- +// B16, B17: setComponent + componentValueEquals micro +// --------------------------------------------------------------------------- + +describe("B16-B17 micro", () => { + test("B16: setComponent x 100k with skipUpdateStream=true", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const entities: Entity[] = []; + for (let i = 0; i < 100_000; i++) entities.push(createEntity(world)); + + bench( + "B16", + "setComponent skipUpdateStream x 100k", + () => { + for (let i = 0; i < entities.length; i++) { + setComponent(Position, entities[i], { x: i, y: i }, { skipUpdateStream: true }); + } + }, + { iterations: 3, warmup: 1 }, + ); + }); + + test("B17: componentValueEquals x 1M comparisons", () => { + const a = { x: 1, y: 2 }; + const b = { x: 1, y: 2 }; + bench( + "B17", + "componentValueEquals x 1M", + () => { + for (let i = 0; i < 1_000_000; i++) componentValueEquals(a, b); + }, + { iterations: 3, warmup: 1 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B18: createLocalCache (requires localStorage shim) +// --------------------------------------------------------------------------- + +describe("B18 createLocalCache", () => { + // Minimal in-memory localStorage polyfill for node env. + const memStore = new Map(); + const polyfill = { + getItem(k: string) { + return memStore.has(k) ? memStore.get(k)! : null; + }, + setItem(k: string, v: string) { + memStore.set(k, v); + }, + removeItem(k: string) { + memStore.delete(k); + }, + clear() { + memStore.clear(); + }, + key() { + return null; + }, + length: 0, + }; + + test("B18: createLocalCache 200 updates on 1k-entity component", () => { + if (typeof globalThis.localStorage === "undefined") { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (globalThis as any).localStorage = polyfill; + } + memStore.clear(); + + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Cached = createLocalCache(Position, "bench"); + + const entities: Entity[] = []; + for (let i = 0; i < 1_000; i++) { + const e = createEntity(world); + setComponent(Cached, e, { x: i, y: i }); + entities.push(e); + } + + // Suppress noisy >200 warning by redirecting stderr-equivalent for this bench. + const origWarn = console.warn; + console.warn = () => undefined; + try { + bench( + "B18", + "createLocalCache 200 updates / 1k entities", + () => { + for (let i = 0; i < 200; i++) { + setComponent(Cached, entities[i % entities.length], { x: i, y: i }); + } + }, + { iterations: 1, warmup: 0 }, + ); + } finally { + console.warn = origWarn; + } + // Sanity: ensure it serialized at least once. + if (memStore.size === 0) throw new Error("expected localStorage to be populated"); + }); +}); + +// --------------------------------------------------------------------------- +// B19-B23: Eternum-shape benchmarks (Resource 216 BigInt, ResourceArrival +// 48 arrays, Building indexed positional). Models a 200-player Dojo client. +// --------------------------------------------------------------------------- + +// Mirror of the real `s1_eternum::Resource` schema (216 fields, 137 BigInt) — +// generated to be representative of resource-balance god-components without +// pulling in the actual codegen file. +function buildResourceSchema() { + const schema: Record = { entity_id: Type.Number }; + // 137 BigInt balance fields + 78 production-tracking Numbers ≈ 216 keys + const balances = [ + "STONE", + "COAL", + "WOOD", + "COPPER", + "IRONWOOD", + "OBSIDIAN", + "GOLD", + "SILVER", + "MITHRAL", + "ALCHEMICAL_SILVER", + "COLD_IRON", + "DEEP_CRYSTAL", + "RUBY", + "DIAMONDS", + "HARTWOOD", + "IGNIUM", + "TWILIGHT_QUARTZ", + "TRUE_ICE", + "ADAMANTINE", + "SAPPHIRE", + "ETHEREAL_SILICA", + "DRAGONHIDE", + "LABOR", + "WHEAT", + "FISH", + "DONKEY", + "KNIGHT_T1", + "KNIGHT_T2", + "KNIGHT_T3", + "CROSSBOWMAN_T1", + ]; + for (const r of balances) schema[`${r}_BALANCE`] = Type.BigInt; + for (const r of balances) schema[`${r}_PRODUCTION`] = Type.BigInt; + for (const r of balances) schema[`${r}_PRODUCTION_RATE`] = Type.BigInt; + for (const r of balances) schema[`${r}_LAST_UPDATED`] = Type.Number; + for (const r of balances) schema[`${r}_BUILDING_COUNT`] = Type.Number; + for (const r of balances) schema[`${r}_BUILDING_TYPE`] = Type.Number; + for (const r of balances) schema[`${r}_BOOST`] = Type.Number; + return schema; +} + +function makeResourceValue(seed: number) { + const v: Record = { entity_id: seed }; + const balances = [ + "STONE", + "COAL", + "WOOD", + "COPPER", + "IRONWOOD", + "OBSIDIAN", + "GOLD", + "SILVER", + "MITHRAL", + "ALCHEMICAL_SILVER", + "COLD_IRON", + "DEEP_CRYSTAL", + "RUBY", + "DIAMONDS", + "HARTWOOD", + "IGNIUM", + "TWILIGHT_QUARTZ", + "TRUE_ICE", + "ADAMANTINE", + "SAPPHIRE", + "ETHEREAL_SILICA", + "DRAGONHIDE", + "LABOR", + "WHEAT", + "FISH", + "DONKEY", + "KNIGHT_T1", + "KNIGHT_T2", + "KNIGHT_T3", + "CROSSBOWMAN_T1", + ]; + for (const r of balances) v[`${r}_BALANCE`] = BigInt(seed * 100); + for (const r of balances) v[`${r}_PRODUCTION`] = BigInt(seed * 10); + for (const r of balances) v[`${r}_PRODUCTION_RATE`] = BigInt(seed); + for (const r of balances) v[`${r}_LAST_UPDATED`] = seed; + for (const r of balances) v[`${r}_BUILDING_COUNT`] = seed % 10; + for (const r of balances) v[`${r}_BUILDING_TYPE`] = seed % 5; + for (const r of balances) v[`${r}_BOOST`] = seed % 3; + return v; +} + +describe("B19-B23 Eternum-shape", () => { + test("B19: Hydrate 200 Resource (216-field) components, skipUpdateStream", () => { + const world = createWorld(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const Resource = defineComponent(world, buildResourceSchema() as any); + const entities: Entity[] = []; + for (let i = 0; i < 200; i++) entities.push(createEntity(world)); + const values = entities.map((_, i) => makeResourceValue(i + 1)); + + bench( + "B19", + "Resource hydrate 200 entities (skipUpdateStream)", + () => { + for (let i = 0; i < entities.length; i++) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(Resource, entities[i], values[i] as any, { skipUpdateStream: true }); + } + }, + { iterations: 5 }, + ); + }); + + test("B20: 50 Resource live updates with subscribed defineQuery (HasValue entity_id)", () => { + const world = createWorld(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const Resource = defineComponent(world, buildResourceSchema() as any); + const entities: Entity[] = []; + for (let i = 0; i < 200; i++) { + const e = createEntity(world); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(Resource, e, makeResourceValue(i + 1) as any); + entities.push(e); + } + // UI-style query: "all Resource records for player 42" + const q = defineQuery( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [Has(Resource as any), HasValue(Resource as any, { entity_id: 42 })], + { runOnInit: false }, + ); + let emitted = 0; + const sub = q.update$.subscribe(() => emitted++); + + bench( + "B20", + "50 Resource updates with HasValue(entity_id) defineQuery", + () => { + emitted = 0; + for (let i = 0; i < 50; i++) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(Resource, entities[i], makeResourceValue(i + 1) as any); + } + }, + { iterations: 3, warmup: 1 }, + ); + console.log(`[BENCH-NOTE] B20 emitted events per 50 updates: ${emitted}`); + sub.unsubscribe(); + }); + + test("B21: runQuery Has + HasValue on 200 Resource entities (non-indexed)", () => { + const world = createWorld(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const Resource = defineComponent(world, buildResourceSchema() as any); + for (let i = 0; i < 200; i++) { + const e = createEntity(world); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(Resource, e, makeResourceValue(i + 1) as any); + } + bench( + "B21", + "runQuery Has(Resource) + HasValue(entity_id) over 200", + () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + runQuery([Has(Resource as any), HasValue(Resource as any, { entity_id: 100 })]); + }, + { iterations: 100 }, + ); + }); + + test("B22: ResourceArrival phantom updates (48 arrays, fresh refs every tick)", () => { + const world = createWorld(); + const arrivalSchema: Record = { + entity_id: Type.Number, + day: Type.Number, + slot_1: Type.NumberArray, + slot_2: Type.NumberArray, + slot_3: Type.NumberArray, + slot_4: Type.NumberArray, + slot_5: Type.NumberArray, + slot_6: Type.NumberArray, + slot_7: Type.NumberArray, + slot_8: Type.NumberArray, + }; + for (let i = 0; i < 40; i++) arrivalSchema[`extra_${i}`] = Type.NumberArray; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const ResourceArrival = defineComponent(world, arrivalSchema as any); + const entities: Entity[] = []; + for (let i = 0; i < 100; i++) entities.push(createEntity(world)); + + // Build a stable "logical" payload — same numbers every tick, but the sync + // layer creates fresh array refs, which today triggers phantom updates. + function makePayload(seed: number) { + const v: Record = { entity_id: seed, day: 1 }; + for (let s = 1; s <= 8; s++) v[`slot_${s}`] = [1, 2, 3, 4, 5]; + for (let i = 0; i < 40; i++) v[`extra_${i}`] = [seed, seed + 1]; + return v; + } + + // Initial set + for (let i = 0; i < entities.length; i++) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(ResourceArrival, entities[i], makePayload(i) as any); + } + + // Subscribe a query that will fire once per "real" change. + const q = defineQuery( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [Has(ResourceArrival as any), HasValue(ResourceArrival as any, { entity_id: 42 })], + { runOnInit: false }, + ); + let emitted = 0; + const sub = q.update$.subscribe(() => emitted++); + + bench( + "B22", + "ResourceArrival phantom updates (100 entities, fresh array refs)", + () => { + emitted = 0; + // Re-set every entity with semantically-identical payload (fresh refs). + for (let i = 0; i < entities.length; i++) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + setComponent(ResourceArrival, entities[i], makePayload(i) as any); + } + }, + { iterations: 3, warmup: 1 }, + ); + console.log(`[BENCH-NOTE] B22 emitted events (ideal=0, current=N): ${emitted}`); + sub.unsubscribe(); + }); + + test("B23: 200 indexed Building entities, mixed HasValue queries from UI", () => { + const world = createWorld(); + const Building = defineComponent( + world, + { + outer_col: Type.Number, + outer_row: Type.Number, + inner_col: Type.Number, + inner_row: Type.Number, + category: Type.Number, + bonus_percent: Type.Number, + entity_id: Type.Number, + outer_entity_id: Type.Number, + paused: Type.Boolean, + }, + { indexed: true }, + ); + for (let i = 0; i < 200; i++) { + const e = createEntity(world); + setComponent(Building, e, { + outer_col: i % 20, + outer_row: i / 20, + inner_col: i % 5, + inner_row: (i / 5) % 5, + category: i % 8, + bonus_percent: i % 100, + entity_id: i + 1, + outer_entity_id: 1, + paused: false, + }); + } + + bench( + "B23", + "Building 200 entities, 20 mixed HasValue lookups", + () => { + // Typical "what's at this tile" UI loop, 20 lookups per frame. + for (let i = 0; i < 20; i++) { + runQuery([ + Has(Building), + HasValue(Building, { + outer_col: i, + outer_row: i, + inner_col: 0, + inner_row: 0, + category: i % 8, + bonus_percent: 0, + entity_id: i + 1, + outer_entity_id: 1, + paused: false, + }), + ]); + } + }, + { iterations: 50 }, + ); + }); + + test("B24: 500 BigInt-indexed Guild entities, 1k HasValue(guild_id) lookups", () => { + const world = createWorld(); + // Eternum pattern: Guild is indexed on BigInt fields (felt252 ids). + const Guild = defineComponent( + world, + { guild_id: Type.BigInt, member_count: Type.Number, name: Type.BigInt }, + { indexed: true }, + ); + const guildIds: bigint[] = []; + for (let i = 0; i < 500; i++) { + const e = createEntity(world); + const gid = BigInt("0x" + (0xdeadbeefcafebabe0000n + BigInt(i)).toString(16)); + setComponent(Guild, e, { guild_id: gid, member_count: i % 100, name: BigInt(i * 13) }); + guildIds.push(gid); + } + bench( + "B24", + "Indexed Guild (3 BigInt/Number fields) x 1k HasValue lookups", + () => { + for (let i = 0; i < 1000; i++) { + const g = guildIds[i % guildIds.length]; + runQuery([ + Has(Guild), + HasValue(Guild, { guild_id: g, member_count: i % 100, name: BigInt((i % guildIds.length) * 13) }), + ]); + } + }, + { iterations: 5 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B26: nested-schema HasValue (Eternum WorldConfig-shape). +// Dojo's recs fork allows schemas with nested sub-struct object literals +// (e.g. `season_addresses_config: { season_pass_address: BigInt, ... }`). +// At runtime each nested field is stored as a single opaque object under one +// schema key, so HasValue checks need to deep-compare the nested value. +// --------------------------------------------------------------------------- + +describe("B26 nested-schema HasValue", () => { + test("B26: HasValue with nested sub-struct value on WorldConfig-shape", () => { + const world = createWorld(); + // Real Dojo/Eternum-style nested schema — Schema now accepts sub-schemas + // natively, no `Type.T as any` casts needed. + const WorldConfig = defineComponent(world, { + config_id: Type.Number, + admin_address: Type.BigInt, + season_addresses_config: { + season_pass_address: Type.BigInt, + realms_address: Type.BigInt, + lords_address: Type.BigInt, + }, + bank_config: { + lp_fee_num: Type.Number, + lp_fee_denom: Type.Number, + owner_fee_num: Type.Number, + owner_fee_denom: Type.Number, + }, + map_config: { + reward_resource_amount: Type.Number, + shards_mines_win_probability: Type.Number, + agent_discovery_prob: Type.Number, + }, + }); + + // A single "world config" entity — the real Eternum WorldConfig has only + // one entity ever. HasValue is typically called from UI hooks reacting to + // a config update. + const cfgEntity = createEntity(world); + setComponent(WorldConfig, cfgEntity, { + config_id: 1, + admin_address: 0xdeadbeefn, + season_addresses_config: { season_pass_address: 0xaaaan, realms_address: 0xbbbbn, lords_address: 0xccccn }, + bank_config: { lp_fee_num: 3, lp_fee_denom: 1000, owner_fee_num: 2, owner_fee_denom: 1000 }, + map_config: { reward_resource_amount: 100, shards_mines_win_probability: 5, agent_discovery_prob: 10 }, + }); + + bench( + "B26", + "HasValue nested sub-struct x 10k (WorldConfig shape)", + () => { + for (let i = 0; i < 10_000; i++) { + // Fresh object literal every call — forces the deep-compare path. + runQuery([ + Has(WorldConfig), + HasValue(WorldConfig, { + season_addresses_config: { + season_pass_address: 0xaaaan, + realms_address: 0xbbbbn, + lords_address: 0xccccn, + }, + }), + ]); + } + }, + { iterations: 5 }, + ); + }); +}); + +// --------------------------------------------------------------------------- +// B25: soak test — catches linear-growth leaks over many churn cycles. +// Models a long-running game (e.g. 2-month session) where entities are +// continuously created and deleted. Asserts per-cycle time stays flat and +// diagnostics return to near-zero after all entities are deleted. +// --------------------------------------------------------------------------- + +describe("B25 soak", () => { + test("B25: 10 churn cycles x 1000 entities — per-cycle time stays flat", () => { + const world = createWorld(); + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }, { indexed: true }); + const Guild = defineComponent(world, { guild_id: Type.BigInt, member_count: Type.Number }, { indexed: true }); + const Resource = defineComponent(world, { + entity_id: Type.Number, + balance: Type.BigInt, + }); + const Movable = defineComponent(world, { speed: Type.Number }); + + const ENTITIES_PER_CYCLE = 1000; + const CYCLES = 10; + const cycleMs: number[] = []; + + const initial = getDiagnostics(world); + + for (let cycle = 0; cycle < CYCLES; cycle++) { + const start = process.hrtime.bigint(); + + const entities: Entity[] = []; + for (let i = 0; i < ENTITIES_PER_CYCLE; i++) { + const e = createEntity(world); + setComponent(Position, e, { x: cycle * 10_000 + i, y: cycle }); + setComponent(Guild, e, { guild_id: BigInt(i + cycle * 1000), member_count: i % 100 }); + setComponent(Resource, e, { entity_id: i, balance: BigInt(i * 100) }); + if (i % 2 === 0) setComponent(Movable, e, { speed: i }); + entities.push(e); + } + + // Exercise the read paths a couple of times per cycle so stale data + // actually participates in queries. + runQuery([Has(Position), Has(Movable)]); + runQuery([Has(Guild), HasValue(Guild, { member_count: 50 })]); + runQuery([Has(Resource)]); + + for (const e of entities) world.deleteEntity(e); + + cycleMs.push(Number(process.hrtime.bigint() - start) / 1_000_000); + } + + const final = getDiagnostics(world); + const firstCycle = cycleMs[0]; + const lastCycle = cycleMs[cycleMs.length - 1]; + const slowdown = lastCycle / firstCycle; + const avgFirstHalf = avg(cycleMs.slice(0, CYCLES / 2)); + const avgSecondHalf = avg(cycleMs.slice(CYCLES / 2)); + const halfSlowdown = avgSecondHalf / avgFirstHalf; + + // Emit as a regular bench line so it lands in baseline.json. + bench( + "B25", + "soak 10 cycles x 1000 entities (churn)", + () => { + /* measurement already collected above; no-op for consistent output */ + }, + { iterations: 1, warmup: 0 }, + ); + console.log(`[BENCH-NOTE] B25 cycle ms: [${cycleMs.map((n) => n.toFixed(1)).join(", ")}]`); + console.log( + `[BENCH-NOTE] B25 first=${firstCycle.toFixed(1)}ms last=${lastCycle.toFixed(1)}ms ` + + `slowdown=${slowdown.toFixed(2)}x halfAvgSlowdown=${halfSlowdown.toFixed(2)}x`, + ); + console.log( + `[BENCH-NOTE] B25 entities initial=${initial.entityCount} final=${final.entityCount} ` + + `(leaked=${final.entityCount - initial.entityCount})`, + ); + for (const c of final.components) { + if (c.entitiesWithValue > 0 || (c.indexerBuckets && c.indexerBuckets > 0)) { + console.log( + `[BENCH-NOTE] B25 leak: component=${c.id} values=${c.entitiesWithValue} buckets=${c.indexerBuckets ?? "-"}`, + ); + } + } + + // Linear-growth guard: last cycle should not be >3x the first cycle. This + // allows for warmup + GC jitter but catches real linear leaks where per- + // cycle cost scales with total work so far. + expect(slowdown).toBeLessThan(3); + // Stronger signal: avg of second-half cycles shouldn't be >2x first half. + expect(halfSlowdown).toBeLessThan(2); + // Entity cleanup: deleting every entity should empty the world. + expect(final.entityCount).toBe(initial.entityCount); + // Per-component cleanup: no component should retain values for deleted entities. + for (const c of final.components) { + expect(c.entitiesWithValue).toBe(0); + } + // Per-indexer cleanup: no indexer should retain buckets for deleted values. + for (const c of final.components) { + if (c.indexerBuckets !== undefined) expect(c.indexerBuckets).toBe(0); + } + }); +}); + +function avg(xs: number[]): number { + return xs.reduce((a, b) => a + b, 0) / xs.length; +} + +// --------------------------------------------------------------------------- +// helpers +// --------------------------------------------------------------------------- + +/** + * Inspect indexer internals to count empty buckets. The Indexer module does + * not expose its `valueToEntities` Map, but we can detect leakage by counting + * keys whose `getEntitiesWithValue` returns an empty Set after `add+remove`. + * + * Today this requires us to ask the indexer about every value that was ever + * indexed; instead, we use a heuristic: probe the original keys we added. For + * a deterministic post-Phase-1 assertion, the indexer impl will be updated + * to expose bucket count via a debug helper if needed. + */ +function countEmptyBuckets(indexer: { + getEntitiesWithValue: (value: { x: number; y: number }) => Set; +}): number { + // The Indexer captures its Map in a closure; we approximate the leak by + // probing the values we know were added in B3 (x = i, y = i for i in 0..10k). + let empties = 0; + for (let i = 0; i < 10_000; i++) { + const s = indexer.getEntitiesWithValue({ x: i, y: i }); + if (s.size === 0) empties++; + } + return empties; +} diff --git a/packages/recs/src/Component.spec.ts b/packages/recs/src/Component.spec.ts index 75550dca0a..b9a0be12c4 100644 --- a/packages/recs/src/Component.spec.ts +++ b/packages/recs/src/Component.spec.ts @@ -271,5 +271,177 @@ describe("Component", () => { }); expect(spy).toHaveBeenCalledTimes(3); }); + + it("removeOverride: stays correct with many overrides on a single entity (per-entity index)", () => { + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const entity = createEntity(world); + setComponent(Position, entity, { x: 0, y: 0 }); + + const Overridable = overridableComponent(Position); + + const N = 1000; + for (let i = 0; i < N; i++) { + Overridable.addOverride(`o-${i}`, { entity, value: { x: i, y: i } }); + } + expect(getComponentValue(Overridable, entity)).toEqual({ x: N - 1, y: N - 1 }); + + // Remove non-top override; the highest remaining nonce still wins. + Overridable.removeOverride(`o-${N - 1}`); + expect(getComponentValue(Overridable, entity)).toEqual({ x: N - 2, y: N - 2 }); + + // Remove a middle override; the top override is still the active one. + Overridable.removeOverride(`o-${500}`); + expect(getComponentValue(Overridable, entity)).toEqual({ x: N - 2, y: N - 2 }); + + // Remove all remaining; falls back to the source value. + for (let i = 0; i < N - 1; i++) { + if (i === 500) continue; + Overridable.removeOverride(`o-${i}`); + } + expect(getComponentValue(Overridable, entity)).toEqual({ x: 0, y: 0 }); + + // Removing an unknown override id is a no-op. + expect(() => Overridable.removeOverride("nope")).not.toThrow(); + }); + + it("setComponent works directly on an overridable component (Map-proxy fix)", () => { + // Regression: the per-key Map proxy returned unbound Map.prototype.set, + // so any direct write threw `Method Map.prototype.set called on + // incompatible receiver #`. + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const Overridable = overridableComponent(Position); + const entity = createEntity(world); + + expect(() => setComponent(Overridable, entity, { x: 7, y: 8 })).not.toThrow(); + expect(getComponentValue(Overridable, entity)).toEqual({ x: 7, y: 8 }); + // The write went through to the source map, so reads on the source agree. + expect(getComponentValue(Position, entity)).toEqual({ x: 7, y: 8 }); + }); + + it("defineComponent accepts nested schemas and round-trips typed nested values (Dojo compat)", () => { + // The fork we merged from allows sub-struct schemas like + // `season_addresses_config: { season_pass_address: Type.BigInt, ... }`. + // Verify this compiles without casts AND round-trips at runtime. + const WorldConfig = defineComponent(world, { + config_id: Type.Number, + admin_address: Type.BigInt, + season_addresses_config: { + season_pass_address: Type.BigInt, + realms_address: Type.BigInt, + }, + }); + const entity = createEntity(world); + setComponent(WorldConfig, entity, { + config_id: 1, + admin_address: 0xdeadbeefn, + season_addresses_config: { + season_pass_address: 42n, + realms_address: 100n, + }, + }); + + const readback = getComponentValue(WorldConfig, entity); + expect(readback).toEqual({ + config_id: 1, + admin_address: 0xdeadbeefn, + season_addresses_config: { season_pass_address: 42n, realms_address: 100n }, + }); + // Nested partial HasValue uses deep-compare — a fresh nested-object + // literal with identical content must match. + expect( + getEntitiesWithValue(WorldConfig, { + season_addresses_config: { season_pass_address: 42n, realms_address: 100n }, + }), + ).toEqual(new Set([entity])); + }); + + it("componentValueEquals deep-compares nested objects (Dojo/Eternum WorldConfig shape)", () => { + // Regression: before the nested-object branch in valueEquals, HasValue + // checks against components that store nested sub-structs (e.g. Eternum + // WorldConfig.season_addresses_config) silently returned false because + // the stored value was a fresh object reference. + const a = { + config_id: 1, + season_addresses_config: { season_pass_address: 42n, realms_address: 100n }, + }; + const b = { + config_id: 1, + season_addresses_config: { season_pass_address: 42n, realms_address: 100n }, + }; + const c = { + config_id: 1, + season_addresses_config: { season_pass_address: 42n, realms_address: 999n }, + }; + expect(componentValueEquals(a, b)).toBe(true); + expect(componentValueEquals(a, c)).toBe(false); + // Nested arrays inside objects are also deep-compared. + expect(componentValueEquals({ ids: [1n, 2n] }, { ids: [1n, 2n] })).toBe(true); + expect(componentValueEquals({ ids: [1n, 2n] }, { ids: [1n, 3n] })).toBe(false); + }); + + it("preserves a null override on a key (proxy.get respects 'in' over '!= null')", () => { + // Regression: the per-key proxy used `!= null`, which silently fell back + // to the source value when a partial override explicitly set null. + const Position = defineComponent(world, { x: Type.Number, y: Type.OptionalNumber }); + const entity = createEntity(world); + setComponent(Position, entity, { x: 1, y: 2 }); + + const Overridable = overridableComponent(Position); + Overridable.addOverride("clearY", { + entity, + // null override on `y`; x should fall through to source. + value: { y: null as unknown as undefined }, + }); + + // y in proxy reflects the override (null), not the source value (2). + expect(Overridable.values.y.get(getEntitySymbol(entity))).toBeNull(); + // x falls through to source. + expect(Overridable.values.x.get(getEntitySymbol(entity))).toEqual(1); + }); + + it("entities() yields each entity exactly once even when override and target overlap", () => { + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const e1 = createEntity(world); + const e2 = createEntity(world); + setComponent(Position, e1, { x: 1, y: 1 }); + setComponent(Position, e2, { x: 2, y: 2 }); + + const Overridable = overridableComponent(Position); + // Add an override for an entity that already exists in the source map. + Overridable.addOverride("dup", { entity: e1, value: { x: 9, y: 9 } }); + // And one for an override-only entity. + Overridable.addOverride("only", { entity: "999" as Entity, value: { x: 0, y: 0 } }); + + const seen = new Map(); + for (const e of Overridable.entities()) { + seen.set(e, (seen.get(e) ?? 0) + 1); + } + + expect(seen.get(e1)).toBe(1); + expect(seen.get(e2)).toBe(1); + expect(seen.get("999" as Entity)).toBe(1); + expect(seen.size).toBe(3); + }); + + it("values[key].keys() excludes overrides that don't define that schema key", () => { + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }); + const e1 = createEntity(world); + setComponent(Position, e1, { x: 1, y: 1 }); + + const Overridable = overridableComponent(Position); + // Partial override — sets x but not y, on an entity not yet in the source. + Overridable.addOverride("xOnly", { entity: "111" as Entity, value: { x: 7 } }); + + const xKeys = new Set(Overridable.values.x.keys()); + const yKeys = new Set(Overridable.values.y.keys()); + + // x partial override surfaces in the x key set. + expect(xKeys.has(getEntitySymbol("111" as Entity))).toBe(true); + // y was not set in the override, so the override entity is NOT in y's keys. + expect(yKeys.has(getEntitySymbol("111" as Entity))).toBe(false); + // Source entity in both. + expect(xKeys.has(getEntitySymbol(e1))).toBe(true); + expect(yKeys.has(getEntitySymbol(e1))).toBe(true); + }); }); }); diff --git a/packages/recs/src/Component.ts b/packages/recs/src/Component.ts index 352e11cd2c..b34f575463 100644 --- a/packages/recs/src/Component.ts +++ b/packages/recs/src/Component.ts @@ -1,6 +1,6 @@ import { transformIterator, uuid } from "@latticexyz/utils"; import { mapObject } from "@latticexyz/utils"; -import { filter, map, Subject } from "rxjs"; +import { asyncScheduler, filter, map, Subject, throttleTime } from "rxjs"; import { OptionalTypes } from "./constants"; import { createIndexer } from "./Indexer"; import { @@ -23,6 +23,23 @@ export type ComponentMutationOptions = { skipUpdateStream?: boolean; }; +// Cache of `component.values[firstSchemaKey]` per component, set at definition +// time by `defineComponent`. Used by `hasComponent`/`getComponentEntities` to +// avoid an `Object.values()[0]` allocation on every call (every query loop hits +// these, so the cumulative cost was significant). +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const primaryValuesMapCache = new WeakMap, Map>(); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function getPrimaryValuesMap(component: Component): Map { + let map = primaryValuesMapCache.get(component); + if (!map) { + map = Object.values(component.values)[0] as Map; + primaryValuesMapCache.set(component, map); + } + return map; +} + // eslint-disable-next-line @typescript-eslint/no-explicit-any function getComponentName(component: Component) { return ( @@ -63,9 +80,11 @@ export function defineComponent new Map()); const update$ = new Subject(); const metadata = options?.metadata; - const entities = () => - transformIterator((Object.values(values)[0] as Map).keys(), getEntityString); + const firstValuesMap = Object.values(values)[0] as Map; + const entities = () => transformIterator(firstValuesMap.keys(), getEntityString); let component = { values, schema, id, update$, metadata, entities, world } as Component; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + primaryValuesMapCache.set(component as Component, firstValuesMap); if (options?.indexed) component = createIndexer(component); world.registerComponent(component as Component); return component; @@ -90,7 +109,9 @@ export function setComponent( options: ComponentMutationOptions = {}, ) { const entitySymbol = getEntitySymbol(entity); - const prevValue = getComponentValue(component, entity); + // Only read the previous value when we are going to publish — bulk hydration + // sets `skipUpdateStream: true` per write, where the prev value is unused. + const prevValue = options.skipUpdateStream ? undefined : getComponentValue(component, entity); for (const [key, val] of Object.entries(value)) { if (component.values[key]) { component.values[key].set(entitySymbol, val); @@ -188,8 +209,7 @@ export function hasComponent( entity: Entity, ): boolean { const entitySymbol = getEntitySymbol(entity); - const map = Object.values(component.values)[0]; - return map.has(entitySymbol); + return getPrimaryValuesMap(component).has(entitySymbol); } /** @@ -211,7 +231,12 @@ export function getComponentValue( const schemaKeys = Object.keys(component.schema); for (const key of schemaKeys) { const val = component.values[key].get(entitySymbol); - if (val === undefined && !OptionalTypes.includes(component.schema[key])) return undefined; + // Nested sub-schemas (`Schema` values) are stored as a single opaque + // object under one top-level key; they are never an optional Type, so + // treating them as non-optional here is correct. + const fieldSchema = component.schema[key]; + const isOptional = typeof fieldSchema !== "object" && OptionalTypes.includes(fieldSchema); + if (val === undefined && !isOptional) return undefined; value[key] = val; } @@ -256,15 +281,86 @@ export function componentValueEquals( a?: Partial>, b?: ComponentValue, ): boolean { + if (a === b) return true; if (!a && !b) return true; if (!a || !b) return false; - let equals = true; for (const key of Object.keys(a)) { - equals = a[key] === b[key]; - if (!equals) return false; + if (!valueEquals(a[key], b[key])) return false; + } + return true; +} + +/** + * Check whether an entity has the given partial component value, **without** + * materializing the full component value first. Reads only the keys present in + * `partial` straight from the per-key value Maps. + * + * Hot path for large components: a `HasValue(Resource, { entity_id: 42 })` + * check on the 216-field Eternum `Resource` component used to do 216 `Map.get` + * calls (the full `getComponentValue`) plus a key-by-key compare. With this it + * does 1 `Map.get` and 1 compare. + */ +export function partialValueEquals( + component: Component, + entity: Entity, + partial: Partial>, +): boolean { + const sym = getEntitySymbol(entity); + for (const key of Object.keys(partial)) { + const valueMap = component.values[key]; + if (!valueMap) return false; + if (!valueEquals(valueMap.get(sym), (partial as Record)[key])) return false; + } + return true; +} + +/** + * Equality used by query fragment checks: + * - Primitives / BigInt / references: `===`. + * - Arrays: length + element-wise recursive compare. + * - Plain objects: same own-key set + value-wise recursive compare. + * - Anything else (class instances, Map, Set, …): strict reference equality. + * + * Fixes silent `HasValue` failures on fresh array/object references with + * identical contents — very common for sync layers that re-emit snapshots. + * Also required for Dojo-style nested schemas (e.g. Eternum `WorldConfig`) + * where sub-structs are stored as nested objects under a single schema key. + */ +function valueEquals(a: unknown, b: unknown): boolean { + if (a === b) return true; + if (a === null || b === null || a === undefined || b === undefined) return false; + + const aIsArray = Array.isArray(a); + const bIsArray = Array.isArray(b); + if (aIsArray !== bIsArray) return false; + if (aIsArray && bIsArray) { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (!valueEquals(a[i], b[i])) return false; + } + return true; + } + + if (typeof a !== "object" || typeof b !== "object") return false; + // Only deep-compare plain objects; bail on class instances and other + // built-ins whose identity matters (Map, Set, Date, …). + if (!isPlainObject(a) || !isPlainObject(b)) return false; + + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + if (aKeys.length !== bKeys.length) return false; + for (const k of aKeys) { + if (!Object.prototype.hasOwnProperty.call(b, k)) return false; + if (!valueEquals((a as Record)[k], (b as Record)[k])) return false; } - return equals; + return true; +} + +function isPlainObject(v: unknown): v is Record { + if (v === null || typeof v !== "object") return false; + const proto = Object.getPrototypeOf(v); + return proto === Object.prototype || proto === null; } /** @@ -343,6 +439,11 @@ export function overridableComponent; nonce: number }>(); + // Per-entity ordered list of override ids (insertion order = nonce order + // since nonces are monotonic). Lets `removeOverride` find the next active + // override in O(K_entity) instead of sorting every override in the world. + const overridesByEntity = new Map(); + // Map from EntitySymbol to current overridden component value const overriddenEntityValues = new Map> | null>(); @@ -356,25 +457,33 @@ export function overridableComponent) { overrides.set(id, { update, nonce: nonce++ }); + let list = overridesByEntity.get(update.entity); + if (!list) { + list = []; + overridesByEntity.set(update.entity, list); + } + list.push(id); setOverriddenComponentValue(update.entity, update.value); } // Remove an override from an entity function removeOverride(id: string) { - const affectedEntity = overrides.get(id)?.update.entity; + const entry = overrides.get(id); + if (!entry) return; overrides.delete(id); - if (affectedEntity == null) return; - - // If there are more overries affecting this entity, - // set the overriddenEntityValue to the last override - const relevantOverrides = [...overrides.values()] - .filter((o) => o.update.entity === affectedEntity) - .sort((a, b) => (a.nonce < b.nonce ? -1 : 1)); + const affectedEntity = entry.update.entity; + const list = overridesByEntity.get(affectedEntity); + if (list) { + const idx = list.lastIndexOf(id); + if (idx !== -1) list.splice(idx, 1); + if (list.length === 0) overridesByEntity.delete(affectedEntity); + } - if (relevantOverrides.length > 0) { - const lastOverride = relevantOverrides[relevantOverrides.length - 1]; - setOverriddenComponentValue(affectedEntity, lastOverride.update.value); + const remaining = overridesByEntity.get(affectedEntity); + if (remaining && remaining.length > 0) { + const lastOverride = overrides.get(remaining[remaining.length - 1]); + setOverriddenComponentValue(affectedEntity, lastOverride?.update.value); } else { setOverriddenComponentValue(affectedEntity, undefined); } @@ -395,9 +504,13 @@ export function overridableComponent { - const originalValue = target.get(entity); const overriddenValue = overriddenEntityValues.get(entity); - return overriddenValue && overriddenValue[key] != null ? overriddenValue[key] : originalValue; + // null override clears the entity entirely. + if (overriddenValue === null) return undefined; + // `key in overriddenValue` (rather than `!= null`) preserves explicit + // null/undefined overrides for OptionalT-typed fields. + if (overriddenValue && key in overriddenValue) return overriddenValue[key]; + return target.get(entity); }; } @@ -410,10 +523,30 @@ export function overridableComponent new Set([...target.keys(), ...overriddenEntityValues.keys()]).values(); + // Build the merged Set in place — generators are significantly slower + // than direct Set iteration in V8 for full traversals (the common + // case). Avoids the previous double-spread (`[...a, ...b]`) which + // allocated an intermediate Array. + return () => { + const merged = new Set(); + for (const k of target.keys()) merged.add(k); + for (const [k, v] of overriddenEntityValues) { + if (v === null) continue; // null override clears the entity + if (!(key in v)) continue; // override doesn't define this schema key + merged.add(k); + } + return merged.values(); + }; } - return Reflect.get(target, prop, target); + // Map.prototype methods (`set`, `delete`, `entries`, `Symbol.iterator`, + // …) require `this` to be the underlying Map instance. Without binding, + // calls like `setComponent(Overridable, …)` throw `Method + // Map.prototype.set called on incompatible receiver #`. Writes pass + // straight through to the source map; the override layer is read-only. + const value = Reflect.get(target, prop, target); + if (typeof value === "function") return value.bind(target); + return value; }, }); @@ -430,11 +563,17 @@ export function overridableComponent - new Set([ - ...transformIterator(overriddenEntityValues.keys(), getEntityString), - ...target.entities(), - ]).values(); + return () => { + // Build the merged Set in place rather than via spread; eager Set + // iteration is faster than a generator in V8 for the typical + // "consumed by `new Set(iter)` in `runQuery`" path. + const merged = new Set(); + for (const e of target.entities()) merged.add(e); + for (const symbol of overriddenEntityValues.keys()) { + merged.add(getEntityString(symbol)); + } + return merged.values(); + }; return Reflect.get(target, prop); }, @@ -504,28 +643,35 @@ export function createLocalCache { - numUpdates++; - const encoded = JSON.stringify( - Object.entries(mapObject(values, (m) => [...m.entries()].map((e) => [getEntityString(e[0]), e[1]]))), - ); - localStorage.setItem(cacheId, encoded); - if (numUpdates > 200) { - console.warn( - "Component", - getComponentName(component), - "was locally cached", - numUpdates, - "times since", - new Date(creation).toLocaleTimeString(), - "- the local cache is in an alpha state and should not be used with components that update frequently yet", + // Flush the entire component to the local cache. Each flush serializes the + // full component, so we coalesce bursts with `throttleTime`: the first event + // writes immediately (leading) and any subsequent events in the same window + // collapse to a single trailing write. Still alpha — recommend only for + // components that don't update frequently. + const updateSub = update$ + .pipe(throttleTime(LOCAL_CACHE_FLUSH_MS, asyncScheduler, { leading: true, trailing: true })) + .subscribe(() => { + numUpdates++; + const encoded = JSON.stringify( + Object.entries(mapObject(values, (m) => [...m.entries()].map((e) => [getEntityString(e[0]), e[1]]))), ); - } - }); + localStorage.setItem(cacheId, encoded); + if (numUpdates > 200) { + console.warn( + "Component", + getComponentName(component), + "was locally cached", + numUpdates, + "times since", + new Date(creation).toLocaleTimeString(), + "- the local cache is in an alpha state and should not be used with components that update frequently yet", + ); + } + }); component.world.registerDisposer(() => updateSub?.unsubscribe()); return component; } + +/** ms to coalesce `createLocalCache` flushes — one full serialization per window. */ +const LOCAL_CACHE_FLUSH_MS = 250; diff --git a/packages/recs/src/Entity.ts b/packages/recs/src/Entity.ts index 36ded16c33..0aacc89e1f 100644 --- a/packages/recs/src/Entity.ts +++ b/packages/recs/src/Entity.ts @@ -30,9 +30,18 @@ export function createEntity( return entity; } -/* +/** * Get the symbol corresponding to an entity's string ID. * Entities are represented as symbols internally for memory efficiency. + * + * @remarks + * **Memory caveat:** `Symbol.for(key)` interns the key in the global symbol + * registry, which is **never garbage-collected** — even after the entity is + * deleted from the world and every component drops it. For long-running + * applications that create and discard many ephemeral entities (e.g. a + * 24/7 client minting transient ids per frame), the registry grows + * unboundedly. Reuse stable entity ids where possible; if you must churn + * through ids, periodically restart the session to release the registry. */ export function getEntitySymbol(entityString: string): EntitySymbol { return Symbol.for(entityString) as EntitySymbol; diff --git a/packages/recs/src/Indexer.spec.ts b/packages/recs/src/Indexer.spec.ts index e7d1de6907..f1d3d8dbf7 100644 --- a/packages/recs/src/Indexer.spec.ts +++ b/packages/recs/src/Indexer.spec.ts @@ -181,6 +181,60 @@ describe("Indexer", () => { setComponent(PositionIndexer, entity1, { x: 2, y: 2 }); expect(getEntitiesWithValue(PositionIndexer, { x: 1, y: 2 })).toEqual(new Set([entity2, entity3])); }); + + it("handles BigInt fields without crashing on JSON.stringify", () => { + // Regression: Phase 1 replaced Object.values().join('/') with JSON.stringify, + // which throws on BigInt. Common for Dojo/Eternum indexed components + // (entity ids, token amounts, felt252 addresses). + const Guild = defineComponent(world, { guild_id: Type.BigInt, member: Type.BigInt }, { indexed: true }); + const gid = 0xdeadbeefcafebabeen; + const member = 0x1234567890abcdefn; + const eA = createEntity(world, [withValue(Guild, { guild_id: gid, member })]); + const eB = createEntity(world, [withValue(Guild, { guild_id: gid, member: 42n })]); + + expect(getEntitiesWithValue(Guild, { guild_id: gid, member })).toEqual(new Set([eA])); + expect(getEntitiesWithValue(Guild, { guild_id: gid, member: 42n })).toEqual(new Set([eB])); + }); + + it("handles BigIntArray fields", () => { + const Trade = defineComponent(world, { id: Type.Number, amounts: Type.BigIntArray }, { indexed: true }); + const e = createEntity(world, [withValue(Trade, { id: 1, amounts: [100n, 200n] })]); + expect(getEntitiesWithValue(Trade, { id: 1, amounts: [100n, 200n] })).toEqual(new Set([e])); + }); + + it("does not collide on values that share characters", () => { + // Regression: previous getValueKey used `Object.values(value).join('/')`, + // so {x:'1/2',y:'3'} and {x:'1',y:'2/3'} produced the same key. + const Position = defineComponent(world, { x: Type.String, y: Type.String }, { indexed: true }); + const eA = createEntity(world, [withValue(Position, { x: "1/2", y: "3" })]); + const eB = createEntity(world, [withValue(Position, { x: "1", y: "2/3" })]); + + expect(getEntitiesWithValue(Position, { x: "1/2", y: "3" })).toEqual(new Set([eA])); + expect(getEntitiesWithValue(Position, { x: "1", y: "2/3" })).toEqual(new Set([eB])); + }); + + it("returns a fresh Set on each call (callers may mutate it)", () => { + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }, { indexed: true }); + const entity1 = createEntity(world, [withValue(Position, { x: 1, y: 2 })]); + + const a = getEntitiesWithValue(Position, { x: 1, y: 2 }); + const b = getEntitiesWithValue(Position, { x: 1, y: 2 }); + expect(a).not.toBe(b); + expect(a).toEqual(new Set([entity1])); + a.clear(); + expect(b).toEqual(new Set([entity1])); + }); + + it("returns an empty Set after the matching entity moves to a different value", () => { + // Regression: previous remove() left empty buckets in the index Map, + // a memory leak for components with many unique values. + const Position = defineComponent(world, { x: Type.Number, y: Type.Number }, { indexed: true }); + const e = createEntity(world, [withValue(Position, { x: 1, y: 2 })]); + expect(getEntitiesWithValue(Position, { x: 1, y: 2 })).toEqual(new Set([e])); + setComponent(Position, e, { x: 5, y: 5 }); + expect(getEntitiesWithValue(Position, { x: 1, y: 2 })).toEqual(new Set()); + expect(getEntitiesWithValue(Position, { x: 5, y: 5 })).toEqual(new Set([e])); + }); }); describe("overridableComponent", () => { diff --git a/packages/recs/src/Indexer.ts b/packages/recs/src/Indexer.ts index 9fe1bf877e..7158c434ce 100644 --- a/packages/recs/src/Indexer.ts +++ b/packages/recs/src/Indexer.ts @@ -2,6 +2,40 @@ import { getComponentEntities, getComponentValue } from "./Component"; import { getEntityString, getEntitySymbol } from "./Entity"; import { Component, ComponentValue, Entity, EntitySymbol, Indexer, Metadata, Schema } from "./types"; +/** + * `JSON.stringify` replacer that converts BigInts to their decimal string. + * Used by the indexer's `getValueKey` so BigInt fields (very common in + * Dojo/Eternum components — entity ids, token amounts) don't crash the first + * write. Collision-safe within one schema because every field has a fixed Type. + */ +function bigIntReplacer(_key: string, value: unknown): unknown { + return typeof value === "bigint" ? value.toString() : value; +} + +export type IndexerStats = { + /** Number of distinct value buckets currently live. */ + bucketCount: number; +}; + +// Per-indexer stats accessor registered at `createIndexer` time. Lets +// `getDiagnostics` peek into bucket counts without exposing the internal Map +// or promoting the indexer's shape to the public type. +const indexerStatsByComponent = new WeakMap< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Component, + () => IndexerStats +>(); + +/** + * Read live stats from an indexed component. Returns `undefined` for + * non-indexed components. Intended for long-running-session health checks + * (e.g. alert if bucket count grows without entity count growing → leak). + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function getIndexerStats(component: Component): IndexerStats | undefined { + return indexerStatsByComponent.get(component)?.(); +} + /** * Create an indexed component from a given component. * @@ -21,14 +55,35 @@ export function createIndexer component: Component, ): Indexer { const valueToEntities = new Map>(); + // Stable, schema-ordered keys built once per indexer. + const schemaKeys = Object.keys(component.schema); function getEntitiesWithValue(value: ComponentValue) { const entities = valueToEntities.get(getValueKey(value)); - return entities ? new Set([...entities].map(getEntityString)) : new Set(); + const result = new Set(); + if (!entities) return result; + for (const e of entities) result.add(getEntityString(e)); + return result; } + // Schema-ordered + JSON-encoded segments separated by U+0001 (a control char + // that cannot appear in a valid JSON-encoded value). Eliminates collisions + // like `{x:"1/2",y:"3"}` vs `{x:"1",y:"2/3"}` and stable across object key + // insertion order. BigInt handled via a replacer because + // `JSON.stringify(1n)` throws `TypeError: Do not know how to serialize a + // BigInt` — relevant for any Dojo/Eternum BigInt-keyed component. function getValueKey(value: ComponentValue): string { - return Object.values(value).join("/"); + if (schemaKeys.length === 1) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return JSON.stringify((value as any)[schemaKeys[0]], bigIntReplacer); + } + let key = ""; + for (let i = 0; i < schemaKeys.length; i++) { + if (i > 0) key += "\u0001"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + key += JSON.stringify((value as any)[schemaKeys[i]], bigIntReplacer); + } + return key; } function add(entity: EntitySymbol, value: ComponentValue | undefined) { @@ -48,6 +103,9 @@ export function createIndexer const entitiesWithValue = valueToEntities.get(valueKey); if (!entitiesWithValue) return; entitiesWithValue.delete(entity); + // GC empty buckets — without this, components with many unique values + // (e.g. positions) leak the bucket Map entry forever. + if (entitiesWithValue.size === 0) valueToEntities.delete(valueKey); } // Initial indexing @@ -58,14 +116,21 @@ export function createIndexer // Keeping index up to date const subscription = component.update$.subscribe(({ entity, value }) => { + // Skip churn when the value didn't actually change (common during + // re-hydration). Cheaper than a re-bucket for stable values. + const [next, prev] = value; + if (next && prev && getValueKey(next) === getValueKey(prev)) return; + // Remove from previous location - remove(getEntitySymbol(entity), value[1]); + remove(getEntitySymbol(entity), prev); // Add to new location - add(getEntitySymbol(entity), value[0]); + add(getEntitySymbol(entity), next); }); component.world.registerDisposer(() => subscription?.unsubscribe()); - return { ...component, getEntitiesWithValue }; + const indexer = { ...component, getEntitiesWithValue }; + indexerStatsByComponent.set(indexer, () => ({ bucketCount: valueToEntities.size })); + return indexer; } diff --git a/packages/recs/src/Query.ts b/packages/recs/src/Query.ts index 6210c9973a..e95cae1cd6 100644 --- a/packages/recs/src/Query.ts +++ b/packages/recs/src/Query.ts @@ -2,11 +2,11 @@ import { filterNullish } from "@latticexyz/utils"; import { observable, ObservableSet } from "mobx"; import { concat, concatMap, filter, from, map, merge, Observable, of, share } from "rxjs"; import { - componentValueEquals, getComponentEntities, getComponentValue, getEntitiesWithValue, hasComponent, + partialValueEquals, } from "./Component"; import { UpdateType, Type } from "./constants"; import { @@ -174,8 +174,10 @@ function passesQueryFragment(entity: Entity, fragment: EntityQ } if (fragment.type === QueryFragmentType.HasValue) { - // Entity must have the given component value - return componentValueEquals(fragment.value, getComponentValue(fragment.component, entity)); + // Read only the keys present in `fragment.value` instead of materializing + // the full component value (a 216-field Resource lookup goes from 216 + // Map.get to N where N = keys in the partial — usually 1). + return partialValueEquals(fragment.component, entity, fragment.value); } if (fragment.type === QueryFragmentType.Not) { @@ -184,8 +186,8 @@ function passesQueryFragment(entity: Entity, fragment: EntityQ } if (fragment.type === QueryFragmentType.NotValue) { - // Entity must not have the given component value - return !componentValueEquals(fragment.value, getComponentValue(fragment.component, entity)); + // Same partial-key fast path as HasValue. + return !partialValueEquals(fragment.component, entity, fragment.value); } throw new Error("Unknown query fragment"); @@ -294,11 +296,54 @@ export function getChildEntities( const directChildEntities = getEntitiesWithValue(component, { value: entity }); if (depth === 1) return directChildEntities; - const indirectChildEntities = [...directChildEntities] - .map((childEntity) => [...getChildEntities(childEntity, component, depth - 1)]) - .flat(); + const result = new Set(directChildEntities); + for (const childEntity of directChildEntities) { + for (const grandchild of getChildEntities(childEntity, component, depth - 1)) { + result.add(grandchild); + } + } + return result; +} + +/** + * Per-call cache for child-entity lookups. Keyed by `${componentId}:${depth}` + * outer + entity inner. Lets `runQuery` short-circuit shared sub-walks during a + * single ProxyExpand evaluation. + * + * @internal + */ +export type ChildEntitiesCache = Map>>; + +function getChildEntitiesCached( + entity: Entity, + component: Component<{ value: Type.Entity }>, + depth: number, + cache: ChildEntitiesCache, +): Set { + if (depth === 0) return new Set(); + const cacheKey = `${component.id}:${depth}`; + let perEntity = cache.get(cacheKey); + if (!perEntity) { + perEntity = new Map(); + cache.set(cacheKey, perEntity); + } + const cached = perEntity.get(entity); + if (cached) return cached; + + const directChildEntities = getEntitiesWithValue(component, { value: entity }); + if (depth === 1) { + perEntity.set(entity, directChildEntities); + return directChildEntities; + } - return new Set([...directChildEntities, ...indirectChildEntities]); + const result = new Set(directChildEntities); + for (const childEntity of directChildEntities) { + for (const grandchild of getChildEntitiesCached(childEntity, component, depth - 1, cache)) { + result.add(grandchild); + } + } + perEntity.set(entity, result); + return result; } /** @@ -317,9 +362,13 @@ export function getChildEntities( * @returns Set of entities matching the query fragments. */ export function runQuery(fragments: QueryFragment[], initialSet?: Set): Set { - let entities: Set | undefined = initialSet ? new Set([...initialSet]) : undefined; // Copy to a fresh set because it will be modified in place + // Set ctor accepts iterables; the spread was an unnecessary intermediate Array. + let entities: Set | undefined = initialSet ? new Set(initialSet) : undefined; let proxyRead: ProxyReadQueryFragment | undefined = undefined; let proxyExpand: ProxyExpandQueryFragment | undefined = undefined; + // Per-call cache for getChildEntities so shared proxy ancestors aren't + // re-walked for every parent (the dominant cost in deep ProxyExpand). + const childCache: ChildEntitiesCache = new Map(); // Process fragments for (let i = 0; i < fragments.length; i++) { @@ -338,20 +387,32 @@ export function runQuery(fragments: QueryFragment[], initialSet?: Set): // Create the first interim result entities = fragment.type === QueryFragmentType.Has - ? new Set([...getComponentEntities(fragment.component)]) + ? new Set(getComponentEntities(fragment.component)) : getEntitiesWithValue(fragment.component, fragment.value); // Add entity's children up to the specified depth if proxy expand is active if (proxyExpand && proxyExpand.depth > 0) { - for (const entity of [...entities]) { - for (const childEntity of getChildEntities(entity, proxyExpand.component, proxyExpand.depth)) { + // Snapshot once, then apply additions after, so children added by one + // parent aren't re-walked as parents themselves. + const seeds = Array.from(entities); + for (const entity of seeds) { + for (const childEntity of getChildEntitiesCached( + entity, + proxyExpand.component, + proxyExpand.depth, + childCache, + )) { entities.add(childEntity); } } } } else { - // There already is an interim result, apply the current fragment - for (const entity of [...entities]) { + // There already is an interim result, apply the current fragment. + // Iterate the live Set; collect mutations and apply once the loop ends so + // we avoid copying the full set on every fragment. + const toDelete: Entity[] = []; + const toAdd: Entity[] = []; + for (const entity of entities) { // Branch 1: Simple / check if the current entity passes the query fragment let passes = passesQueryFragment(entity, fragment); @@ -360,12 +421,12 @@ export function runQuery(fragments: QueryFragment[], initialSet?: Set): passes = passesQueryFragmentProxy(entity, fragment, proxyRead) ?? passes; } - // If the entity didn't pass the query fragment, remove it from the interim set - if (!passes) entities.delete(entity); + // If the entity didn't pass the query fragment, mark it for removal. + if (!passes) toDelete.push(entity); // Branch 3: Proxy downwards / run the query fragments on child entities if proxy expand is active if (proxyExpand && proxyExpand.depth > 0) { - const childEntities = getChildEntities(entity, proxyExpand.component, proxyExpand.depth); + const childEntities = getChildEntitiesCached(entity, proxyExpand.component, proxyExpand.depth, childCache); for (const childEntity of childEntities) { // Add the child entity if it passes the direct check // or if a proxy read is active and it passes the proxy read check @@ -373,10 +434,12 @@ export function runQuery(fragments: QueryFragment[], initialSet?: Set): passesQueryFragment(childEntity, fragment) || (proxyRead && proxyRead.depth > 0 && passesQueryFragmentProxy(childEntity, fragment, proxyRead)) ) - entities.add(childEntity); + toAdd.push(childEntity); } } } + for (const e of toDelete) entities.delete(e); + for (const e of toAdd) entities.add(e); } } @@ -429,81 +492,105 @@ export function defineQuery( const containsProxy = fragments.findIndex((v) => [QueryFragmentType.ProxyExpand, QueryFragmentType.ProxyRead].includes(v.type)) !== -1; - const internal$ = merge(...fragments.map((f) => f.component.update$)) // Combine all component update streams accessed accessed in this query - .pipe( - containsProxy // Query contains proxies - ? concatMap((update) => { - // If the query contains proxy read or expand fragments, entities up or down the proxy chain might match due to this update. - // We have to run the entire query again and compare the result. - // TODO: We might be able to make this more efficient by first computing the set of entities that are potentially touched by this update - // and then only rerun the query on this set. - const newMatchingSet = runQuery(fragments, options?.initialSet); - const updates: (ComponentUpdate & { type: UpdateType })[] = []; - - for (const previouslyMatchingEntity of matching) { - // Entity matched before but doesn't match now - if (!newMatchingSet.has(previouslyMatchingEntity)) { - matching.delete(previouslyMatchingEntity); - updates.push({ - entity: previouslyMatchingEntity, - type: UpdateType.Exit, - component: update.component, - value: [undefined, undefined], - }); - } - } + // Dedupe component update streams: a query like + // `[Has(Pos), NotValue(Pos, …)]` previously merged Pos.update$ twice and + // processed each emission twice. + const uniqueComponentStreams: Observable[] = []; + const seenComponents = new Set(); + for (const f of fragments) { + if (seenComponents.has(f.component.id)) continue; + seenComponents.add(f.component.id); + uniqueComponentStreams.push(f.component.update$); + } - for (const matchingEntity of newMatchingSet) { - if (matching.has(matchingEntity)) { - // Entity matched before and still matches - updates.push({ - entity: matchingEntity, - type: UpdateType.Update, - component: update.component, - value: [getComponentValue(update.component, matchingEntity), undefined], - }); - } else { - // Entity didn't match before but matches now - matching.add(matchingEntity); - updates.push({ - entity: matchingEntity, - type: UpdateType.Enter, - component: update.component, - value: [getComponentValue(update.component, matchingEntity), undefined], - }); - } + // Pre-bucket entity-query fragments by component id so the per-update path + // can look up "fragments touching this component" in O(1) instead of + // re-filtering the full fragments array on every emission. + const fragmentsByComponentId = new Map(); + for (const f of fragments) { + if (isSettingFragment(f)) continue; + let bucket = fragmentsByComponentId.get(f.component.id); + if (!bucket) { + bucket = []; + fragmentsByComponentId.set(f.component.id, bucket); + } + bucket.push(f as EntityQueryFragment); + } + + const internal$ = merge(...uniqueComponentStreams).pipe( + containsProxy // Query contains proxies + ? concatMap((update) => { + // If the query contains proxy read or expand fragments, entities up or down the proxy chain might match due to this update. + // We have to run the entire query again and compare the result. + // TODO: We might be able to make this more efficient by first computing the set of entities that are potentially touched by this update + // and then only rerun the query on this set. + const newMatchingSet = runQuery(fragments, options?.initialSet); + const updates: (ComponentUpdate & { type: UpdateType })[] = []; + + for (const previouslyMatchingEntity of matching) { + // Entity matched before but doesn't match now + if (!newMatchingSet.has(previouslyMatchingEntity)) { + matching.delete(previouslyMatchingEntity); + updates.push({ + entity: previouslyMatchingEntity, + type: UpdateType.Exit, + component: update.component, + value: [undefined, undefined], + }); } + } - return of(...updates); - }) - : // Query does not contain proxies - map((update) => { - if (matching.has(update.entity)) { - // If this entity matched the query before, check if it still matches it - // Find fragments accessign this component (linear search is fine since the number fragments is likely small) - const relevantFragments = fragments.filter((f) => f.component.id === update.component.id); - const pass = relevantFragments.every((f) => passesQueryFragment(update.entity, f as EntityQueryFragment)); // We early return if the query contains proxies - - if (pass) { - // Entity passed before and still passes, forward update - return { ...update, type: UpdateType.Update }; - } else { - // Entity passed before but not anymore, forward update and exit - matching.delete(update.entity); - return { ...update, type: UpdateType.Exit }; - } + for (const matchingEntity of newMatchingSet) { + if (matching.has(matchingEntity)) { + // Entity matched before and still matches + updates.push({ + entity: matchingEntity, + type: UpdateType.Update, + component: update.component, + value: [getComponentValue(update.component, matchingEntity), undefined], + }); + } else { + // Entity didn't match before but matches now + matching.add(matchingEntity); + updates.push({ + entity: matchingEntity, + type: UpdateType.Enter, + component: update.component, + value: [getComponentValue(update.component, matchingEntity), undefined], + }); } + } + + return of(...updates); + }) + : // Query does not contain proxies + map((update) => { + if (matching.has(update.entity)) { + // If this entity matched the query before, check if it still matches it. + // Use the pre-bucketed list to avoid `filter` on every emission. + const relevantFragments = fragmentsByComponentId.get(update.component.id) ?? []; + const pass = relevantFragments.every((f) => passesQueryFragment(update.entity, f)); // We early return if the query contains proxies - // This entity didn't match before, check all fragments - const pass = fragments.every((f) => passesQueryFragment(update.entity, f as EntityQueryFragment)); // We early return if the query contains proxies if (pass) { - // Entity didn't pass before but passes now, forward update end enter - matching.add(update.entity); - return { ...update, type: UpdateType.Enter }; + // Entity passed before and still passes, forward update + return { ...update, type: UpdateType.Update }; + } else { + // Entity passed before but not anymore, forward update and exit + matching.delete(update.entity); + return { ...update, type: UpdateType.Exit }; } - }), - filterNullish(), - ); + } + + // This entity didn't match before, check all fragments + const pass = fragments.every((f) => passesQueryFragment(update.entity, f as EntityQueryFragment)); // We early return if the query contains proxies + if (pass) { + // Entity didn't pass before but passes now, forward update end enter + matching.add(update.entity); + return { ...update, type: UpdateType.Enter }; + } + }), + filterNullish(), + ); return { matching, diff --git a/packages/recs/src/World.ts b/packages/recs/src/World.ts index 2635aeae8e..2e09858f7d 100644 --- a/packages/recs/src/World.ts +++ b/packages/recs/src/World.ts @@ -1,6 +1,7 @@ import { transformIterator } from "@latticexyz/utils"; import { hasComponent, removeComponent } from "./Component"; import { getEntityString, getEntitySymbol } from "./Entity"; +import { getIndexerStats } from "./Indexer"; import { Component, Entity, EntitySymbol, World } from "./types"; /** @@ -36,10 +37,15 @@ export function createWorld() { } function dispose(namespace?: string) { - for (const [, disposer] of disposers.filter((d) => !namespace || d[0] === namespace)) { - disposer(); + if (namespace == null) { + for (const [, disposer] of disposers) disposer(); + disposers = []; + return; } - disposers = disposers.filter((d) => namespace && d[0] !== namespace); + for (const [ns, disposer] of disposers) { + if (ns === namespace) disposer(); + } + disposers = disposers.filter(([ns]) => ns !== namespace); } function registerDisposer(disposer: () => void, namespace = "") { @@ -100,3 +106,54 @@ export function namespaceWorld(world: ReturnType, namespace: export function getEntityComponents(world: World, entity: Entity): Component[] { return world.components.filter((component) => hasComponent(component, entity)); } + +export type ComponentDiagnostics = { + id: string; + /** Entities currently carrying a value for this component. */ + entitiesWithValue: number; + /** Live indexer buckets (undefined for non-indexed components). */ + indexerBuckets?: number; +}; + +export type WorldDiagnostics = { + /** Total entities registered on the world. */ + entityCount: number; + /** Total components registered on the world. */ + componentCount: number; + components: ComponentDiagnostics[]; +}; + +/** + * Read live health metrics for a world. Intended for long-running-session + * monitoring: poll periodically and watch for linear growth in + * `entityCount`, per-component `entitiesWithValue`, or `indexerBuckets`. + * Pure read — safe to call in production. + * + * @example + * ```ts + * setInterval(() => { + * const d = getDiagnostics(world); + * metrics.gauge("recs.entities", d.entityCount); + * for (const c of d.components) { + * metrics.gauge(`recs.component.${c.id}.size`, c.entitiesWithValue); + * if (c.indexerBuckets) metrics.gauge(`recs.indexer.${c.id}.buckets`, c.indexerBuckets); + * } + * }, 60_000); + * ``` + */ +export function getDiagnostics(world: World): WorldDiagnostics { + const components: ComponentDiagnostics[] = world.components.map((component) => { + const valuesMap = Object.values(component.values)[0] as Map | undefined; + const stats = getIndexerStats(component); + return { + id: component.id, + entitiesWithValue: valuesMap?.size ?? 0, + ...(stats ? { indexerBuckets: stats.bucketCount } : {}), + }; + }); + return { + entityCount: world.entitySymbols.size, + componentCount: world.components.length, + components, + }; +} diff --git a/packages/recs/src/test-utils/bench.ts b/packages/recs/src/test-utils/bench.ts new file mode 100644 index 0000000000..bbf85b473e --- /dev/null +++ b/packages/recs/src/test-utils/bench.ts @@ -0,0 +1,91 @@ +/// +import { writeFileSync, mkdirSync, existsSync, readFileSync } from "fs"; +import { dirname, resolve } from "path"; + +export type BenchResult = { + id: string; + name: string; + iterations: number; + totalMs: number; + avgMs: number; + opsPerSec: number; + heapDeltaBytes: number; +}; + +export type BenchOptions = { + iterations: number; + warmup?: number; + setup?: () => void; + teardown?: () => void; +}; + +const collected: BenchResult[] = []; + +export function bench(id: string, name: string, fn: () => void, opts: BenchOptions): BenchResult { + const warmup = opts.warmup ?? Math.max(1, Math.floor(opts.iterations / 10)); + + if (opts.setup) opts.setup(); + + for (let i = 0; i < warmup; i++) fn(); + + if (global.gc) global.gc(); + const heapBefore = process.memoryUsage().heapUsed; + const start = process.hrtime.bigint(); + + for (let i = 0; i < opts.iterations; i++) fn(); + + const end = process.hrtime.bigint(); + const heapAfter = process.memoryUsage().heapUsed; + + if (opts.teardown) opts.teardown(); + + const totalMs = Number(end - start) / 1_000_000; + const avgMs = totalMs / opts.iterations; + const opsPerSec = (opts.iterations / totalMs) * 1000; + + const result: BenchResult = { + id, + name, + iterations: opts.iterations, + totalMs: round(totalMs, 4), + avgMs: round(avgMs, 6), + opsPerSec: round(opsPerSec, 2), + heapDeltaBytes: heapAfter - heapBefore, + }; + + collected.push(result); + // Structured line for CI / external diff tools. + console.log(`[BENCH] ${JSON.stringify(result)}`); + return result; +} + +export function getCollectedResults(): BenchResult[] { + return collected.slice(); +} + +export function clearCollectedResults(): void { + collected.length = 0; +} + +export function writeBaseline(filePath: string): void { + const abs = resolve(filePath); + if (!existsSync(dirname(abs))) mkdirSync(dirname(abs), { recursive: true }); + const payload = { + capturedAt: new Date().toISOString(), + nodeVersion: process.version, + platform: process.platform, + results: collected, + }; + writeFileSync(abs, JSON.stringify(payload, null, 2) + "\n"); +} + +export function readBaseline(filePath: string): { results: BenchResult[] } | undefined { + const abs = resolve(filePath); + if (!existsSync(abs)) return undefined; + return JSON.parse(readFileSync(abs, "utf8")); +} + +function round(n: number, places: number): number { + const f = 10 ** places; + return Math.round(n * f) / f; +} diff --git a/packages/recs/src/types.ts b/packages/recs/src/types.ts index b25bc4333c..e00f1f90bf 100644 --- a/packages/recs/src/types.ts +++ b/packages/recs/src/types.ts @@ -13,9 +13,16 @@ export type Entity = Opaque; /** * Used to define the schema of a {@link Component}. * Uses {@link Type} enum to be able to access the component type in JavaScript as well as have TypeScript type checks. + * + * @remarks + * Schemas may be nested — a field's value can be another `Schema` object + * (e.g. a sub-struct like Dojo/Eternum's `WorldConfig.season_addresses_config`). + * Nested fields are stored as a single opaque object under their top-level key + * in the component's value Map; query fragments like `HasValue` deep-compare + * nested objects via {@link componentValueEquals}. */ export type Schema = { - [key: string]: Type; + [key: string]: Type | Schema; }; /** @@ -54,9 +61,16 @@ export type ValueType = { /** * Used to infer the TypeScript type of a component value corresponding to a given {@link Schema}. + * + * @remarks + * Recurses on nested {@link Schema} sub-objects so Dojo-style nested + * schemas (e.g. `WorldConfig.season_addresses_config`) type-check correctly. */ export type ComponentValue = { - [key in keyof S]: ValueType[S[key]]; + [key in keyof S]: S[key] extends Schema + ? ComponentValue + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + ValueType[S[key] extends keyof ValueType ? S[key] : any]; }; /** @@ -73,7 +87,15 @@ export type ComponentUpdate = { */ export interface Component { id: string; - values: { [key in keyof S]: Map[S[key]]> }; + values: { + [key in keyof S]: Map< + EntitySymbol, + S[key] extends Schema + ? ComponentValue + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + ValueType[S[key] extends keyof ValueType ? S[key] : any] + >; + }; schema: S; metadata: M; entities: () => IterableIterator; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9825e5cfe3..6244176c35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,7 +1,7 @@ lockfileVersion: '9.0' settings: - autoInstallPeers: true + autoInstallPeers: false excludeLinksFromLockfile: false importers: @@ -61,7 +61,7 @@ importers: version: 2.10.1 tsup: specifier: 8.3.0 - version: 8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.17.16))(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(typescript@5.4.2)(yaml@2.8.0) + version: 8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.17.16))(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(typescript@5.4.2)(yaml@2.5.1) tsx: specifier: 4.19.0 version: 4.19.0 @@ -76,7 +76,7 @@ importers: version: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) vitest: specifier: 2.1.2 - version: 2.1.2(@types/node@20.17.16)(jsdom@22.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.40.0) + version: 2.1.2(@types/node@20.17.16)(jsdom@22.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.30.1) with-anvil: specifier: workspace:* version: link:test/with-anvil @@ -131,7 +131,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4.1.11 - version: 4.1.11(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 4.1.11(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) '@types/react': specifier: 18.2.22 version: 18.2.22 @@ -140,7 +140,7 @@ importers: version: 18.2.7 '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 4.6.0(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) mprocs: specifier: ^0.7.3 version: 0.7.3 @@ -149,7 +149,7 @@ importers: version: 4.1.11 vite: specifier: ^5.4.1 - version: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + version: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) packages/abi-ts: dependencies: @@ -324,9 +324,6 @@ importers: packages/common: dependencies: - '@aws-sdk/client-kms': - specifier: 3.x - version: 3.556.0 '@latticexyz/schema-type': specifier: workspace:* version: link:../schema-type @@ -336,9 +333,6 @@ importers: abitype: specifier: 1.0.9 version: 1.0.9(typescript@5.4.2)(zod@3.23.8) - asn1.js: - specifier: 5.x - version: 5.4.1 debug: specifier: ^4.3.4 version: 4.3.4 @@ -513,10 +507,10 @@ importers: version: 1.7.0(debug@4.3.7)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)) '@walletconnect/ethereum-provider': specifier: 2.20.2 - version: 2.20.2(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + version: 2.20.2(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) connectkit: specifier: ^1.9.0 - version: 1.9.0(@babel/core@7.25.2)(@tanstack/react-query@5.56.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) + version: 1.9.0(@babel/core@7.28.0)(@tanstack/react-query@5.56.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) debug: specifier: ^4.3.4 version: 4.3.7 @@ -562,7 +556,7 @@ importers: version: 8.5.4 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.1(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 4.3.1(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) autoprefixer: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) @@ -592,16 +586,16 @@ importers: version: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) vite: specifier: ^5.4.1 - version: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + version: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) vite-plugin-dts: specifier: ^4.2.4 - version: 4.2.4(@types/node@24.3.0)(rollup@4.30.1)(typescript@5.4.2)(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 4.2.4(@types/node@20.17.16)(rollup@4.30.1)(typescript@5.4.2)(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) vite-plugin-externalize-deps: specifier: ^0.8.0 - version: 0.8.0(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 0.8.0(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) wagmi: specifier: 2.16.5 - version: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + version: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) packages/explorer: dependencies: @@ -773,7 +767,7 @@ importers: version: 14.2.3(eslint@8.57.0)(typescript@5.4.2) knip: specifier: ^5.30.2 - version: 5.30.2(@types/node@24.3.0)(typescript@5.4.2) + version: 5.30.2(@types/node@20.17.16)(typescript@5.4.2) postcss: specifier: ^8 version: 8.4.23 @@ -949,7 +943,7 @@ importers: version: 18.2.22 '@vitejs/plugin-react': specifier: ^4.0.0 - version: 4.3.1(vite@4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)) + version: 4.3.1(vite@4.5.5(@types/node@20.17.16)(lightningcss@1.30.1)) eslint-plugin-react: specifier: 7.31.11 version: 7.31.11(eslint@8.57.0) @@ -964,7 +958,7 @@ importers: version: 18.2.0(react@18.2.0) vite: specifier: ^4.3.6 - version: 4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + version: 4.5.5(@types/node@20.17.16)(lightningcss@1.30.1) packages/recs: dependencies: @@ -992,7 +986,7 @@ importers: version: 29.5.0(@types/node@20.17.16) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest@29.5.0(@types/node@20.17.16))(typescript@5.4.2) + version: 29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(jest@29.5.0(@types/node@20.17.16))(typescript@5.4.2) type-fest: specifier: ^2.14.0 version: 2.14.0 @@ -1044,7 +1038,7 @@ importers: devDependencies: '@testing-library/react': specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.0.0(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/react-hooks': specifier: ^8.0.1 version: 8.0.1(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1174,7 +1168,7 @@ importers: version: 16.0.3 drizzle-orm: specifier: ^0.28.5 - version: 0.28.5(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(@vercel/postgres@0.10.0(utf-8-validate@5.0.10))(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0) + version: 0.28.5(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0) koa: specifier: ^2.15.4 version: 2.15.4 @@ -1286,7 +1280,7 @@ importers: version: 4.3.4 drizzle-orm: specifier: ^0.28.5 - version: 0.28.5(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(@vercel/postgres@0.10.0(utf-8-validate@5.0.10))(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0) + version: 0.28.5(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0) fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 @@ -1320,7 +1314,7 @@ importers: version: 5.56.2(react@18.2.0) '@testing-library/react': specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.0.0(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@testing-library/react-hooks': specifier: ^8.0.1 version: 8.0.1(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1372,16 +1366,16 @@ importers: version: 27.4.1 jest: specifier: ^29.3.1 - version: 29.5.0(@types/node@24.3.0) + version: 29.5.0(@types/node@20.17.16) ts-jest: specifier: ^29.0.5 - version: 29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest@29.5.0(@types/node@24.3.0))(typescript@5.4.2) + version: 29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(jest@29.5.0(@types/node@20.17.16))(typescript@5.4.2) packages/vite-plugin-mud: devDependencies: vite: specifier: ^6.0.7 - version: 6.0.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.2)(yaml@2.8.0) + version: 6.0.7(@types/node@20.17.16)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)(yaml@2.5.1) packages/world: dependencies: @@ -1681,7 +1675,7 @@ importers: version: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) vite: specifier: ^4.2.1 - version: 4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + version: 4.5.5(@types/node@20.17.16)(lightningcss@1.30.1) test/with-anvil: {} @@ -3049,9 +3043,6 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.3': resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -3064,10 +3055,6 @@ packages: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} @@ -3076,9 +3063,6 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.4.14': resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -3088,9 +3072,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.18': resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} @@ -3100,9 +3081,6 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@koa/cors@4.0.0': resolution: {integrity: sha512-Y4RrbvGTlAaa04DBoPBWJqDR5gPj32OOz827ULXfgB1F7piD1MB/zwn8JR2LAnvdILhxUbXbkXGWuNVsFuVFCQ==} engines: {node: '>= 14.0.0'} @@ -3244,9 +3222,6 @@ packages: '@motionone/utils@10.18.0': resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - '@neondatabase/serverless@0.9.5': - resolution: {integrity: sha512-siFas6gItqv6wD/pZnvdu34wEqgG3nSE6zWZdq5j2DEsa+VvX8i/5HXJOo06qrw5axPXn+lGCxeR+NLaSPIXug==} - '@next/env@14.2.5': resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} @@ -4760,13 +4735,9 @@ packages: '@reown/appkit-utils@1.7.3': resolution: {integrity: sha512-8/MNhmfri+2uu8WzBhZ5jm5llofOIa1dyXDXRC/hfrmGmCFJdrQKPpuqOFYoimo2s2g70pK4PYefvOKgZOWzgg==} - peerDependencies: - valtio: 1.13.2 '@reown/appkit-utils@1.7.8': resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} - peerDependencies: - valtio: 1.13.2 '@reown/appkit-wallet@1.7.3': resolution: {integrity: sha512-D0pExd0QUE71ursQPp3pq/0iFrz2oz87tOyFifrPANvH5X0RQCYn/34/kXr+BFVQzNFfCBDlYP+CniNA/S0KiQ==} @@ -5299,10 +5270,6 @@ packages: resolution: {integrity: sha512-5Ly5TIRHnWH7vSDell9B/OVyV380qqIJVg7H7R7jU4fPEmOD4smqAX7VRflpYI09srWR8aj5OLD2Ccs1pI5mTg==} engines: {node: '>=12'} - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} - '@testing-library/react-hooks@8.0.1': resolution: {integrity: sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g==} engines: {node: '>=12'} @@ -5361,9 +5328,6 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -5475,18 +5439,12 @@ packages: '@types/node@20.17.16': resolution: {integrity: sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} - '@types/openurl@1.0.0': resolution: {integrity: sha512-fUHH4T8FmEl3NBtGbUYYzMo1Ev47uVCVEGVjVNjorOMzgjls6zH82yr/zqkkcEOHY2HUC5PZ8dRFwGed/NR7wQ==} '@types/pegjs@0.10.6': resolution: {integrity: sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==} - '@types/pg@8.11.6': - resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} - '@types/pg@8.15.2': resolution: {integrity: sha512-+BKxo5mM6+/A1soSHBI7ufUglqYXntChLDyTbvcAn1Lawi9J7J9Ok3jt6w7I0+T/UDJ4CyhHk66+GZbwmkYxSg==} @@ -5651,9 +5609,6 @@ packages: resolution: {integrity: sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==} engines: {node: '>=10'} - '@upstash/redis@1.34.9': - resolution: {integrity: sha512-7qzzF2FQP5VxR2YUNjemWs+hl/8VzJJ6fOkT7O7kt9Ct8olEVzb1g6/ik6B8Pb8W7ZmYv81SdlVV9F6O8bh/gw==} - '@vanilla-extract/css@1.15.5': resolution: {integrity: sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==} @@ -5668,10 +5623,6 @@ packages: peerDependencies: '@vanilla-extract/css': ^1.0.0 - '@vercel/postgres@0.10.0': - resolution: {integrity: sha512-fSD23DxGND40IzSkXjcFcxr53t3Tiym59Is0jSYIFpG4/0f0KO9SGtcp1sXiebvPaGe7N/tU05cH4yt2S6/IPg==} - engines: {node: '>=18.14'} - '@vitejs/plugin-react@4.3.1': resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5690,7 +5641,6 @@ packages: '@vitest/mocker@2.1.2': resolution: {integrity: sha512-ExElkCGMS13JAJy+812fw1aCv2QO/LBK6CyO4WOPAzLTmve50gydOlWhgdBJPx2ztbADUq3JVI0C5U+bShaeEA==} peerDependencies: - '@vitest/spy': 2.1.2 msw: ^2.3.5 vite: ^5.0.0 peerDependenciesMeta: @@ -5943,11 +5893,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -5970,19 +5915,9 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -6087,9 +6022,6 @@ packages: aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arktype@2.0.0-beta.6: resolution: {integrity: sha512-tbH5/h0z371sgrJIAhZhH2BcrErWv8uQIPVcLmknJ8ffov5/ZbMNufrQ3hG9avGKTcVnVmdQoPhl1WuKuagqXA==} @@ -6605,9 +6537,6 @@ packages: commander@2.18.0: resolution: {integrity: sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -6722,9 +6651,6 @@ packages: uWebSockets.js: optional: true - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} @@ -6917,10 +6843,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - derive-valtio@0.1.0: resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} peerDependencies: @@ -6997,9 +6919,6 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -7667,9 +7586,6 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -8869,10 +8785,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} @@ -9568,9 +9480,6 @@ packages: pg-protocol@1.10.0: resolution: {integrity: sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q==} - pg-protocol@1.10.3: - resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} - pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} @@ -9579,10 +9488,6 @@ packages: resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} engines: {node: '>=10'} - pg-types@4.1.0: - resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} - engines: {node: '>=10'} - pg@8.16.0: resolution: {integrity: sha512-7SKfdvP8CTNXjMUzfcVTaI+TDzBEeaUnVwiVGZQD1Hh33Kpev7liQba9uLd4CfN8r9mCVsD0JIpq03+Unpz+kg==} engines: {node: '>= 8.0.0'} @@ -10708,9 +10613,6 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -11038,11 +10940,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.40.0: - resolution: {integrity: sha512-cfeKl/jjwSR5ar7d0FGmave9hFGJT8obyo0z+CrQOylLDbk7X81nPU6vq9VORa5jU30SkDnT2FXjLbR8HLP+xA==} - engines: {node: '>=10'} - hasBin: true - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -11351,9 +11248,6 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - unenv@1.10.0: resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} @@ -11943,11 +11837,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - yargs-interactive@3.0.1: resolution: {integrity: sha512-Jnp88uiuz+ZRpM10Lwvs0nRetWPog+6lcgQrhwKsyEanAe3wgTlaPPzcYlZWp53aOMTzOcR5wEpEsFOMOPmLlw==} engines: {node: '>=8', npm: '>=6'} @@ -12804,9 +12693,9 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': @@ -13601,7 +13490,7 @@ snapshots: '@fastify/ajv-compiler@3.5.0': dependencies: ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv-formats: 2.1.1 fast-uri: 2.2.0 '@fastify/compress@6.5.0': @@ -13862,12 +13751,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 - optional: true - '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 @@ -13882,28 +13765,16 @@ snapshots: '@jridgewell/resolve-uri@3.1.0': {} - '@jridgewell/resolve-uri@3.1.2': - optional: true - '@jridgewell/set-array@1.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - optional: true - '@jridgewell/sourcemap-codec@1.4.14': {} '@jridgewell/sourcemap-codec@1.4.15': {} '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': - optional: true - '@jridgewell/trace-mapping@0.3.18': dependencies: '@jridgewell/resolve-uri': 3.1.0 @@ -13919,12 +13790,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - optional: true - '@koa/cors@4.0.0': dependencies: vary: 1.1.2 @@ -14146,15 +14011,6 @@ snapshots: '@rushstack/node-core-library': 5.7.0(@types/node@20.17.16) transitivePeerDependencies: - '@types/node' - optional: true - - '@microsoft/api-extractor-model@7.29.6(@types/node@24.3.0)': - dependencies: - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.0) - transitivePeerDependencies: - - '@types/node' '@microsoft/api-extractor@7.47.7(@types/node@20.17.16)': dependencies: @@ -14173,25 +14029,6 @@ snapshots: typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - optional: true - - '@microsoft/api-extractor@7.47.7(@types/node@24.3.0)': - dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@24.3.0) - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.0) - '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@24.3.0) - '@rushstack/ts-command-line': 4.22.6(@types/node@24.3.0) - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' '@microsoft/tsdoc-config@0.17.0': dependencies: @@ -14249,11 +14086,6 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - '@neondatabase/serverless@0.9.5': - dependencies: - '@types/pg': 8.11.6 - optional: true - '@next/env@14.2.5': {} '@next/eslint-plugin-next@14.2.3': @@ -15746,41 +15578,11 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-controllers@1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@reown/appkit-controllers@1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) - viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - - '@reown/appkit-controllers@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -15810,7 +15612,7 @@ snapshots: dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -15840,7 +15642,7 @@ snapshots: dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@19.1.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -15866,43 +15668,12 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-pay@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) - lit: 3.3.0 - valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - '@reown/appkit-pay@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) lit: 3.3.0 valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) transitivePeerDependencies: @@ -15933,7 +15704,7 @@ snapshots: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) lit: 3.3.0 valtio: 1.13.2(@types/react@18.2.22)(react@19.1.0) transitivePeerDependencies: @@ -15967,12 +15738,12 @@ snapshots: dependencies: buffer: 6.0.3 - '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': + '@reown/appkit-scaffold-ui@1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-ui': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-ui': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-utils': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) lit: 3.1.0 transitivePeerDependencies: @@ -15996,47 +15767,14 @@ snapshots: - typescript - uWebSockets.js - utf-8-validate - - valtio - - zod - - '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - lit: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - valtio - zod - '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -16060,15 +15798,14 @@ snapshots: - typescript - uWebSockets.js - utf-8-validate - - valtio - zod - '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8)': + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) lit: 3.3.0 transitivePeerDependencies: @@ -16092,13 +15829,12 @@ snapshots: - typescript - uWebSockets.js - utf-8-validate - - valtio - zod - '@reown/appkit-ui@1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@reown/appkit-ui@1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) lit: 3.1.0 qrcode: 1.5.3 @@ -16125,36 +15861,6 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-ui@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - lit: 3.3.0 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - '@reown/appkit-ui@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -16215,47 +15921,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': + '@reown/appkit-utils@1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.3 '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) - viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - - '@reown/appkit-utils@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -16281,14 +15954,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8)': + '@reown/appkit-utils@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -16314,14 +15987,14 @@ snapshots: - utf-8-validate - zod - '@reown/appkit-utils@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8)': + '@reown/appkit-utils@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.8 '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) '@walletconnect/logger': 2.1.2 - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) valtio: 1.13.2(@types/react@18.2.22)(react@19.1.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: @@ -16369,17 +16042,17 @@ snapshots: - typescript - utf-8-validate - '@reown/appkit@1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@reown/appkit@1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-controllers': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.3 - '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) - '@reown/appkit-ui': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-scaffold-ui': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-ui': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-utils': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.3(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.19.2(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.19.2 + '@walletconnect/universal-provider': 2.19.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -16406,18 +16079,18 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@reown/appkit@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-pay': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-pay': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) - '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -16444,20 +16117,20 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@reown/appkit@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-pay': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-pay': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) - '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0))(zod@3.23.8) + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) bs58: 6.0.0 - valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) + valtio: 1.13.2(@types/react@18.2.22)(react@19.1.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) transitivePeerDependencies: - '@azure/app-configuration' @@ -16482,45 +16155,7 @@ snapshots: - utf-8-validate - zod - '@reown/appkit@1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': - dependencies: - '@reown/appkit-common': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-controllers': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-pay': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-polyfills': 1.7.8 - '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8) - '@reown/appkit-ui': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@reown/appkit-utils': 1.7.8(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@19.1.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.2.22)(react@19.1.0))(zod@3.23.8) - '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10) - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - bs58: 6.0.0 - valtio: 1.13.2(@types/react@18.2.22)(react@19.1.0) - viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - - '@reservoir0x/relay-sdk@1.7.0(debug@4.3.7)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))': + '@reservoir0x/relay-sdk@1.7.0(debug@4.3.7)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: axios: 1.8.4(debug@4.3.7) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) @@ -16600,7 +16235,7 @@ snapshots: dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) + ajv-formats: 3.0.1 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 @@ -16608,20 +16243,6 @@ snapshots: semver: 7.5.4 optionalDependencies: '@types/node': 20.17.16 - optional: true - - '@rushstack/node-core-library@5.7.0(@types/node@24.3.0)': - dependencies: - ajv: 8.13.0 - ajv-draft-04: 1.0.0(ajv@8.13.0) - ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - optionalDependencies: - '@types/node': 24.3.0 '@rushstack/rig-package@0.5.3': dependencies: @@ -16634,14 +16255,6 @@ snapshots: supports-color: 8.1.1 optionalDependencies: '@types/node': 20.17.16 - optional: true - - '@rushstack/terminal@0.14.0(@types/node@24.3.0)': - dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@24.3.0) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 24.3.0 '@rushstack/ts-command-line@4.22.6(@types/node@20.17.16)': dependencies: @@ -16651,16 +16264,6 @@ snapshots: string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - optional: true - - '@rushstack/ts-command-line@4.22.6(@types/node@24.3.0)': - dependencies: - '@rushstack/terminal': 0.14.0(@types/node@24.3.0) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: @@ -17057,7 +16660,7 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.7.0 + tslib: 2.8.1 '@tailwindcss/node@4.1.11': dependencies: @@ -17123,12 +16726,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - '@tailwindcss/vite@4.1.11(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0))': + '@tailwindcss/vite@4.1.11(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) '@tanstack/query-core@5.52.0': {} @@ -17159,17 +16762,6 @@ snapshots: '@tanstack/table-core@8.20.1': {} - '@testing-library/dom@10.4.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.3 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - '@testing-library/react-hooks@8.0.1(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.25.7 @@ -17188,10 +16780,9 @@ snapshots: '@types/react': 18.2.22 react-test-renderer: 18.2.0(react@18.2.0) - '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.0.0(@types/react-dom@18.2.7)(@types/react@18.2.22)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@babel/runtime': 7.25.7 - '@testing-library/dom': 10.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: @@ -17224,8 +16815,6 @@ snapshots: '@types/argparse@1.0.38': {} - '@types/aria-query@5.0.4': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.0 @@ -17369,23 +16958,12 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@24.3.0': - dependencies: - undici-types: 7.10.0 - '@types/openurl@1.0.0': dependencies: '@types/node': 18.19.50 '@types/pegjs@0.10.6': {} - '@types/pg@8.11.6': - dependencies: - '@types/node': 20.17.16 - pg-protocol: 1.10.3 - pg-types: 4.1.0 - optional: true - '@types/pg@8.15.2': dependencies: '@types/node': 20.17.16 @@ -17590,11 +17168,6 @@ snapshots: '@uniswap/v3-core': 1.0.1 base64-sol: 1.0.1 - '@upstash/redis@1.34.9': - dependencies: - crypto-js: 4.2.0 - optional: true - '@vanilla-extract/css@1.15.5': dependencies: '@emotion/hash': 0.9.2 @@ -17622,38 +17195,29 @@ snapshots: dependencies: '@vanilla-extract/css': 1.15.5 - '@vercel/postgres@0.10.0(utf-8-validate@5.0.10)': - dependencies: - '@neondatabase/serverless': 0.9.5 - bufferutil: 4.0.8 - ws: 8.18.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - utf-8-validate - optional: true - - '@vitejs/plugin-react@4.3.1(vite@4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0))': + '@vitejs/plugin-react@4.3.1(vite@4.5.5(@types/node@20.17.16)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 4.5.5(@types/node@20.17.16)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0))': + '@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.25.2 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.6.0(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0))': + '@vitejs/plugin-react@4.6.0(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -17661,7 +17225,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -17672,13 +17236,13 @@ snapshots: chai: 5.1.1 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0))': + '@vitest/mocker@2.1.2(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1))': dependencies: '@vitest/spy': 2.1.2 estree-walker: 3.0.3 magic-string: 0.30.11 optionalDependencies: - vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) '@vitest/pretty-format@2.1.2': dependencies: @@ -17750,45 +17314,6 @@ snapshots: '@vue/shared@3.5.12': {} - '@wagmi/connectors@5.9.5(@types/react@18.2.22)(@upstash/redis@1.34.9)(@wagmi/core@2.20.0(@tanstack/query-core@5.83.0)(@types/react@18.2.22)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': - dependencies: - '@base-org/account': 1.1.1(@types/react@18.2.22)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(zod@3.23.8) - '@coinbase/wallet-sdk': 4.3.6(@types/react@18.2.22)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(zod@3.23.8) - '@gemini-wallet/core': 0.2.0(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)) - '@metamask/sdk': 0.32.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@wagmi/core': 2.20.0(@tanstack/query-core@5.83.0)(@types/react@18.2.22)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - optionalDependencies: - typescript: 5.4.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - immer - - ioredis - - react - - supports-color - - uWebSockets.js - - use-sync-external-store - - utf-8-validate - - zod - '@wagmi/connectors@5.9.5(@types/react@18.2.22)(@wagmi/core@2.20.0(@tanstack/query-core@5.83.0)(@types/react@18.2.22)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': dependencies: '@base-org/account': 1.1.1(@types/react@18.2.22)(bufferutil@4.0.8)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(zod@3.23.8) @@ -17897,21 +17422,21 @@ snapshots: - react - use-sync-external-store - '@walletconnect/core@2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/core@2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -17936,21 +17461,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/core@2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -17975,21 +17500,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/core@2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -18014,21 +17539,21 @@ snapshots: - utf-8-validate - zod - '@walletconnect/core@2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/core@2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.33.0 events: 3.3.0 @@ -18057,54 +17582,18 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/ethereum-provider@2.20.2(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': - dependencies: - '@reown/appkit': 1.7.3(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) - '@walletconnect/jsonrpc-provider': 1.0.14 - '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) - '@walletconnect/sign-client': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.20.2(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/utils': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - typescript - - uWebSockets.js - - utf-8-validate - - zod - - '@walletconnect/ethereum-provider@2.21.1(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/ethereum-provider@2.20.2(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@reown/appkit': 1.7.8(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@reown/appkit': 1.7.3(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) - '@walletconnect/sign-client': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.20.2 + '@walletconnect/universal-provider': 2.20.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/utils': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18136,11 +17625,11 @@ snapshots: '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) - '@walletconnect/sign-client': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18172,11 +17661,11 @@ snapshots: '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) - '@walletconnect/sign-client': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/universal-provider': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/utils': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18248,11 +17737,11 @@ snapshots: - bufferutil - utf-8-validate - '@walletconnect/keyvaluestorage@1.1.1(@upstash/redis@1.34.9)': + '@walletconnect/keyvaluestorage@1.1.1': dependencies: '@walletconnect/safe-json': 1.0.2 idb-keyval: 6.2.1 - unstorage: 1.10.2(@upstash/redis@1.34.9)(idb-keyval@6.2.1) + unstorage: 1.10.2(idb-keyval@6.2.1) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -18289,16 +17778,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/sign-client@2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@walletconnect/core': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/core': 2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18320,16 +17809,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/sign-client@2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@walletconnect/core': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/core': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18351,16 +17840,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/sign-client@2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@walletconnect/core': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/core': 2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18382,16 +17871,16 @@ snapshots: - utf-8-validate - zod - '@walletconnect/sign-client@2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/sign-client@2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: - '@walletconnect/core': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/core': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 2.1.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -18417,12 +17906,12 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.19.2(@upstash/redis@1.34.9)': + '@walletconnect/types@2.19.2': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -18441,12 +17930,12 @@ snapshots: - ioredis - uWebSockets.js - '@walletconnect/types@2.20.2(@upstash/redis@1.34.9)': + '@walletconnect/types@2.20.2': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -18465,12 +17954,12 @@ snapshots: - ioredis - uWebSockets.js - '@walletconnect/types@2.21.0(@upstash/redis@1.34.9)': + '@walletconnect/types@2.21.0': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -18489,12 +17978,12 @@ snapshots: - ioredis - uWebSockets.js - '@walletconnect/types@2.21.1(@upstash/redis@1.34.9)': + '@walletconnect/types@2.21.1': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-types': 1.0.4 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 events: 3.3.0 transitivePeerDependencies: @@ -18513,18 +18002,18 @@ snapshots: - ioredis - uWebSockets.js - '@walletconnect/universal-provider@2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/universal-provider@2.19.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.19.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/sign-client': 2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.19.2 + '@walletconnect/utils': 2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -18548,18 +18037,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/universal-provider@2.20.2(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.20.2(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/sign-client': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.20.2 + '@walletconnect/utils': 2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -18583,18 +18072,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/universal-provider@2.21.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/sign-client': 2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -18618,18 +18107,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/universal-provider@2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/universal-provider@2.21.1(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8(encoding@0.1.13) '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 2.1.2 - '@walletconnect/sign-client': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) - '@walletconnect/utils': 2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/sign-client': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) es-toolkit: 1.33.0 events: 3.3.0 transitivePeerDependencies: @@ -18653,18 +18142,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.19.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/utils@2.19.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.19.2(@upstash/redis@1.34.9) + '@walletconnect/types': 2.19.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -18692,18 +18181,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.20.2(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/utils@2.20.2(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.20.2(@upstash/redis@1.34.9) + '@walletconnect/types': 2.20.2 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -18731,18 +18220,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.0(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/utils@2.21.0(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.0(@upstash/redis@1.34.9) + '@walletconnect/types': 2.21.0 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -18770,18 +18259,18 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.21.1(@upstash/redis@1.34.9)(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': + '@walletconnect/utils@2.21.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)': dependencies: '@noble/ciphers': 1.2.1 '@noble/curves': 1.8.1 '@noble/hashes': 1.7.1 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/keyvaluestorage': 1.1.1(@upstash/redis@1.34.9) + '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.21.1(@upstash/redis@1.34.9) + '@walletconnect/types': 2.21.1 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 bs58: 6.0.0 @@ -18865,9 +18354,6 @@ snapshots: acorn@8.12.1: {} - acorn@8.15.0: - optional: true - agent-base@6.0.2: dependencies: debug: 4.4.1(supports-color@5.5.0) @@ -18887,12 +18373,12 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: + ajv-formats@2.1.1: + dependencies: ajv: 8.12.0 - ajv-formats@3.0.1(ajv@8.13.0): - optionalDependencies: + ajv-formats@3.0.1: + dependencies: ajv: 8.13.0 ajv@6.12.6: @@ -18992,10 +18478,6 @@ snapshots: dependencies: deep-equal: 2.2.3 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - arktype@2.0.0-beta.6: dependencies: '@ark/schema': 0.3.3 @@ -19003,7 +18485,7 @@ snapshots: array-buffer-byte-length@1.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-array-buffer: 3.0.4 array-includes@3.1.8: @@ -19060,11 +18542,11 @@ snapshots: arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 @@ -19171,14 +18653,14 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.18.3 - babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.11(@babel/core@7.25.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0))(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4(@babel/core@7.28.0)(styled-components@5.3.11(@babel/core@7.28.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0))(supports-color@5.5.0): dependencies: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.25.2) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.25.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.28.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -19601,9 +19083,6 @@ snapshots: commander@2.18.0: {} - commander@2.20.3: - optional: true - commander@4.1.1: {} compare-versions@6.1.1: {} @@ -19626,12 +19105,12 @@ snapshots: confbox@0.1.7: {} - connectkit@1.9.0(@babel/core@7.25.2)(@tanstack/react-query@5.56.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)): + connectkit@1.9.0(@babel/core@7.28.0)(@tanstack/react-query@5.56.2(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)): dependencies: '@tanstack/react-query': 5.56.2(react@18.2.0) buffer: 6.0.3 detect-browser: 5.3.0 - family: 0.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) + family: 0.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)) framer-motion: 6.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) qrcode: 1.5.4 react: 18.2.0 @@ -19639,9 +19118,9 @@ snapshots: react-transition-state: 1.1.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react-use-measure: 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.25.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) + styled-components: 5.3.11(@babel/core@7.28.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - wagmi: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + wagmi: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) transitivePeerDependencies: - '@babel/core' - react-is @@ -19726,9 +19205,6 @@ snapshots: crossws@0.2.4: {} - crypto-js@4.2.0: - optional: true - css-color-keywords@1.0.0: {} css-to-react-native@3.2.0: @@ -19757,19 +19233,19 @@ snapshots: data-view-buffer@1.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 data-view-byte-length@1.0.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 data-view-byte-offset@1.0.0: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.1 @@ -19826,9 +19302,9 @@ snapshots: deep-equal@2.2.3: dependencies: array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 is-arguments: 1.1.1 is-array-buffer: 3.0.4 is-date-object: 1.0.5 @@ -19842,7 +19318,7 @@ snapshots: side-channel: 1.0.6 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 deep-extend@0.6.0: {} @@ -19888,8 +19364,6 @@ snapshots: depd@2.0.0: {} - dequal@2.0.3: {} - derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.2.22)(react@18.2.0)): dependencies: valtio: 1.13.2(@types/react@18.2.22)(react@18.2.0) @@ -19942,22 +19416,18 @@ snapshots: dependencies: esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} - domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 dotenv@16.0.3: {} - drizzle-orm@0.28.5(@neondatabase/serverless@0.9.5)(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(@vercel/postgres@0.10.0(utf-8-validate@5.0.10))(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0): + drizzle-orm@0.28.5(@opentelemetry/api@1.8.0)(@types/better-sqlite3@7.6.4)(@types/pg@8.15.2)(@types/sql.js@1.4.4)(better-sqlite3@8.6.0)(kysely@0.26.3)(pg@8.16.0)(postgres@3.3.5)(sql.js@1.8.0): optionalDependencies: - '@neondatabase/serverless': 0.9.5 '@opentelemetry/api': 1.8.0 '@types/better-sqlite3': 7.6.4 '@types/pg': 8.15.2 '@types/sql.js': 1.4.4 - '@vercel/postgres': 0.10.0(utf-8-validate@5.0.10) better-sqlite3: 8.6.0 kysely: 0.26.3 pg: 8.16.0 @@ -20138,8 +19608,8 @@ snapshots: es-get-iterator@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 is-arguments: 1.1.1 is-map: 2.0.3 @@ -20150,13 +19620,13 @@ snapshots: es-iterator-helpers@1.0.19: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -20175,7 +19645,7 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -20701,12 +20171,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - family@0.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)): + family@0.1.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)): optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - wagmi: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + wagmi: 2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) fast-check@3.23.2: dependencies: @@ -20742,7 +20212,7 @@ snapshots: dependencies: '@fastify/deepmerge': 1.3.0 ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv-formats: 2.1.1 fast-deep-equal: 3.1.3 fast-uri: 2.2.0 rfdc: 1.3.0 @@ -20887,10 +20357,6 @@ snapshots: optionalDependencies: debug: 4.3.7 - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -20970,7 +20436,7 @@ snapshots: function.prototype.name@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 @@ -21045,9 +20511,9 @@ snapshots: get-symbol-description@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 get-tsconfig@4.7.5: dependencies: @@ -21389,13 +20855,13 @@ snapshots: is-arguments@1.1.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 is-array-buffer@3.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -21413,7 +20879,7 @@ snapshots: is-boolean-object@1.1.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -21428,7 +20894,7 @@ snapshots: is-data-view@1.0.1: dependencies: - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 is-date-object@1.0.5: dependencies: @@ -21442,7 +20908,7 @@ snapshots: is-finalizationregistry@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-fullwidth-code-point@2.0.0: {} @@ -21488,14 +20954,14 @@ snapshots: is-regex@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-tostringtag: 1.0.2 is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-stream@2.0.1: {} @@ -21517,7 +20983,7 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 is-typed-array@1.1.15: dependencies: @@ -21529,12 +20995,12 @@ snapshots: is-weakref@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 is-weakset@2.0.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 is-what@4.1.15: {} @@ -21600,7 +21066,7 @@ snapshots: iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 has-symbols: 1.0.3 reflect.getprototypeof: 1.0.6 set-function-name: 2.0.2 @@ -21681,25 +21147,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.5.0(@types/node@24.3.0): - dependencies: - '@jest/core': 29.5.0 - '@jest/test-result': 29.5.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.1.0 - jest-config: 29.5.0(@types/node@24.3.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - prompts: 2.4.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jest-config@29.5.0(@types/node@20.17.16): dependencies: '@babel/core': 7.28.0 @@ -21729,35 +21176,6 @@ snapshots: transitivePeerDependencies: - supports-color - jest-config@29.5.0(@types/node@24.3.0): - dependencies: - '@babel/core': 7.28.0 - '@jest/test-sequencer': 29.5.0 - '@jest/types': 29.6.3 - babel-jest: 29.5.0(@babel/core@7.28.0) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.5.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.4.3 - jest-resolve: 29.5.0 - jest-runner: 29.5.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 24.3.0 - transitivePeerDependencies: - - supports-color - jest-diff@27.5.1: dependencies: chalk: 4.1.2 @@ -22003,17 +21421,6 @@ snapshots: - supports-color - ts-node - jest@29.5.0(@types/node@24.3.0): - dependencies: - '@jest/core': 29.5.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.5.0(@types/node@24.3.0) - transitivePeerDependencies: - - '@types/node' - - supports-color - - ts-node - jiti@1.18.2: {} jiti@1.21.6: {} @@ -22124,11 +21531,11 @@ snapshots: kleur@3.0.3: {} - knip@5.30.2(@types/node@24.3.0)(typescript@5.4.2): + knip@5.30.2(@types/node@20.17.16)(typescript@5.4.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@snyk/github-codeowners': 1.1.0 - '@types/node': 24.3.0 + '@types/node': 20.17.16 easy-table: 1.2.0 enhanced-resolve: 5.17.1 fast-glob: 3.3.2 @@ -22418,8 +21825,6 @@ snapshots: dependencies: react: 18.2.0 - lz-string@1.5.0: {} - magic-string@0.30.11: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -22671,7 +22076,7 @@ snapshots: node-abi@3.45.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 node-abi@3.52.0: dependencies: @@ -22774,7 +22179,7 @@ snapshots: object-is@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 object-keys@1.1.1: {} @@ -23108,9 +22513,6 @@ snapshots: pg-protocol@1.10.0: {} - pg-protocol@1.10.3: - optional: true - pg-types@2.2.0: dependencies: pg-int8: 1.0.1 @@ -23129,17 +22531,6 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.4 - pg-types@4.1.0: - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.4 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - optional: true - pg@8.16.0: dependencies: pg-connection-string: 2.9.0 @@ -23311,14 +22702,14 @@ snapshots: optionalDependencies: postcss: 8.4.47 - postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(yaml@2.8.0): + postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(yaml@2.5.1): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 2.5.1 postcss: 8.5.1 tsx: 4.19.0 - yaml: 2.8.0 + yaml: 2.5.1 postcss-nested@6.0.1(postcss@8.4.31): dependencies: @@ -23815,11 +23206,11 @@ snapshots: reflect.getprototypeof@1.0.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.3.0 globalthis: 1.0.4 which-builtin-type: 1.1.4 @@ -23970,8 +23361,8 @@ snapshots: safe-array-concat@1.1.2: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + get-intrinsic: 1.3.0 has-symbols: 1.0.3 isarray: 2.0.5 @@ -23981,7 +23372,7 @@ snapshots: safe-regex-test@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 is-regex: 1.1.4 @@ -24250,12 +23641,6 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - optional: true - source-map@0.5.7: {} source-map@0.6.1: {} @@ -24385,20 +23770,20 @@ snapshots: string.prototype.trim@1.2.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 string.prototype.trimend@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -24449,14 +23834,14 @@ snapshots: hey-listen: 1.0.8 tslib: 2.8.1 - styled-components@5.3.11(@babel/core@7.25.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0): + styled-components@5.3.11(@babel/core@7.28.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0): dependencies: '@babel/helper-module-imports': 7.27.1(supports-color@5.5.0) '@babel/traverse': 7.27.3(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.1 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.11(@babel/core@7.25.2)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.28.0)(styled-components@5.3.11(@babel/core@7.28.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.2.0)(react@18.2.0))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 @@ -24675,14 +24060,6 @@ snapshots: term-size@2.2.1: {} - terser@5.40.0: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -24793,7 +24170,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest@29.5.0(@types/node@20.17.16))(typescript@5.4.2): + ts-jest@29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(jest@29.5.0(@types/node@20.17.16))(typescript@5.4.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -24809,25 +24186,6 @@ snapshots: '@babel/core': 7.28.0 '@jest/types': 29.6.3 babel-jest: 29.5.0(@babel/core@7.28.0) - esbuild: 0.23.1 - - ts-jest@29.0.5(@babel/core@7.28.0)(@jest/types@29.6.3)(babel-jest@29.5.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest@29.5.0(@types/node@24.3.0))(typescript@5.4.2): - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@24.3.0) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.4.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.28.0 - '@jest/types': 29.6.3 - babel-jest: 29.5.0(@babel/core@7.28.0) - esbuild: 0.23.1 tsconfig-paths@3.15.0: dependencies: @@ -24848,7 +24206,7 @@ snapshots: tsscmp@1.0.6: {} - tsup@8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.17.16))(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(typescript@5.4.2)(yaml@2.8.0): + tsup@8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.17.16))(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(typescript@5.4.2)(yaml@2.5.1): dependencies: bundle-require: 5.1.0(esbuild@0.23.1) cac: 6.7.14 @@ -24859,7 +24217,7 @@ snapshots: execa: 5.1.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(yaml@2.8.0) + postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.1)(tsx@4.19.0)(yaml@2.5.1) resolve-from: 5.0.0 rollup: 4.30.1 source-map: 0.8.0-beta.0 @@ -24944,9 +24302,9 @@ snapshots: typed-array-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 typed-array-buffer@1.0.3: dependencies: @@ -24956,28 +24314,28 @@ snapshots: typed-array-byte-length@1.0.1: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 + call-bind: 1.0.8 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 + call-bind: 1.0.8 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 typed-array-length@1.0.6: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 + call-bind: 1.0.8 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.0.3 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 typescript@5.4.2: {} @@ -24992,7 +24350,7 @@ snapshots: unbox-primitive@1.0.2: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -25003,8 +24361,6 @@ snapshots: undici-types@6.19.8: {} - undici-types@7.10.0: {} - unenv@1.10.0: dependencies: consola: 3.2.3 @@ -25029,7 +24385,7 @@ snapshots: unpipe@1.0.0: {} - unstorage@1.10.2(@upstash/redis@1.34.9)(idb-keyval@6.2.1): + unstorage@1.10.2(idb-keyval@6.2.1): dependencies: anymatch: 3.1.3 chokidar: 3.6.0 @@ -25042,7 +24398,6 @@ snapshots: ofetch: 1.3.4 ufo: 1.5.4 optionalDependencies: - '@upstash/redis': 1.34.9 idb-keyval: 6.2.1 transitivePeerDependencies: - uWebSockets.js @@ -25233,12 +24588,12 @@ snapshots: - utf-8-validate - zod - vite-node@2.1.2(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0): + vite-node@2.1.2(@types/node@20.17.16)(lightningcss@1.30.1): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@5.5.0) pathe: 1.1.2 - vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - less @@ -25250,9 +24605,9 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.2.4(@types/node@24.3.0)(rollup@4.30.1)(typescript@5.4.2)(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)): + vite-plugin-dts@4.2.4(@types/node@20.17.16)(rollup@4.30.1)(typescript@5.4.2)(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@24.3.0) + '@microsoft/api-extractor': 7.47.7(@types/node@20.17.16) '@rollup/pluginutils': 5.1.2(rollup@4.30.1) '@volar/typescript': 2.4.6 '@vue/language-core': 2.1.6(typescript@5.4.2) @@ -25263,67 +24618,53 @@ snapshots: magic-string: 0.30.11 typescript: 5.4.2 optionalDependencies: - vite: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.8.0(vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0)): + vite-plugin-externalize-deps@0.8.0(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)): dependencies: - vite: 5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) - vite@4.5.5(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0): + vite@4.5.5(@types/node@20.17.16)(lightningcss@1.30.1): dependencies: esbuild: 0.18.20 postcss: 8.4.47 rollup: 3.29.4 - optionalDependencies: - '@types/node': 24.3.0 - fsevents: 2.3.3 - lightningcss: 1.30.1 - terser: 5.40.0 - - vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.5.1 - rollup: 4.30.1 optionalDependencies: '@types/node': 20.17.16 fsevents: 2.3.3 lightningcss: 1.30.1 - terser: 5.40.0 - vite@5.4.8(@types/node@24.3.0)(lightningcss@1.30.1)(terser@5.40.0): + vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1): dependencies: esbuild: 0.21.5 postcss: 8.5.1 rollup: 4.30.1 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.16 fsevents: 2.3.3 lightningcss: 1.30.1 - terser: 5.40.0 - vite@6.0.7(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.40.0)(tsx@4.19.2)(yaml@2.8.0): + vite@6.0.7(@types/node@20.17.16)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.19.2)(yaml@2.5.1): dependencies: esbuild: 0.24.2 postcss: 8.5.1 rollup: 4.30.1 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 20.17.16 fsevents: 2.3.3 jiti: 2.5.1 lightningcss: 1.30.1 - terser: 5.40.0 tsx: 4.19.2 - yaml: 2.8.0 + yaml: 2.5.1 - vitest@2.1.2(@types/node@20.17.16)(jsdom@22.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.40.0): + vitest@2.1.2(@types/node@20.17.16)(jsdom@22.1.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(lightningcss@1.30.1): dependencies: '@vitest/expect': 2.1.2 - '@vitest/mocker': 2.1.2(@vitest/spy@2.1.2)(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0)) + '@vitest/mocker': 2.1.2(vite@5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)) '@vitest/pretty-format': 2.1.2 '@vitest/runner': 2.1.2 '@vitest/snapshot': 2.1.2 @@ -25338,8 +24679,8 @@ snapshots: tinyexec: 0.3.0 tinypool: 1.0.1 tinyrainbow: 1.2.0 - vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0) - vite-node: 2.1.2(@types/node@20.17.16)(lightningcss@1.30.1)(terser@5.40.0) + vite: 5.4.8(@types/node@20.17.16)(lightningcss@1.30.1) + vite-node: 2.1.2(@types/node@20.17.16)(lightningcss@1.30.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.17.16 @@ -25395,40 +24736,6 @@ snapshots: - utf-8-validate - zod - wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(@upstash/redis@1.34.9)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): - dependencies: - '@tanstack/react-query': 5.56.2(react@18.2.0) - '@wagmi/connectors': 5.9.5(@types/react@18.2.22)(@upstash/redis@1.34.9)(@wagmi/core@2.20.0(@tanstack/query-core@5.83.0)(@types/react@18.2.22)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) - '@wagmi/core': 2.20.0(@tanstack/query-core@5.83.0)(@types/react@18.2.22)(react@18.2.0)(typescript@5.4.2)(use-sync-external-store@1.4.0(react@18.2.0))(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8)) - react: 18.2.0 - use-sync-external-store: 1.4.0(react@18.2.0) - viem: 2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8) - optionalDependencies: - typescript: 5.4.2 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/query-core' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - immer - - ioredis - - supports-color - - uWebSockets.js - - utf-8-validate - - zod - wagmi@2.16.5(@tanstack/query-core@5.83.0)(@tanstack/react-query@5.56.2(react@18.2.0))(@types/react@18.2.22)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.2.0)(typescript@5.4.2)(utf-8-validate@5.0.10)(viem@2.35.1(bufferutil@4.0.8)(typescript@5.4.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8): dependencies: '@tanstack/react-query': 5.56.2(react@18.2.0) @@ -25562,7 +24869,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -25581,8 +24888,8 @@ snapshots: which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 + call-bind: 1.0.8 + for-each: 0.3.5 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -25702,9 +25009,6 @@ snapshots: yaml@2.5.1: {} - yaml@2.8.0: - optional: true - yargs-interactive@3.0.1: dependencies: inquirer: 7.3.3