From 3a63f576b74689b2ed62711d52e5b27daa765a7b Mon Sep 17 00:00:00 2001 From: LingSiewWin Date: Thu, 11 Jun 2026 17:46:49 +0800 Subject: [PATCH] Restore public-console wallet connect + ship Decay Receipt (plugin v0.1.3) Console (the on-camera gas proof): - The serverless deploy's empty-state gate (LocalFirstPanel) hid the wallet entirely; the public console now renders ConnectGate + WalletUpload above the local-first explainer, so visitors can connect, sign, and pay GLM gas. - Injected-only connect: Reown/AppKit removed (wagmi createConfig + injected); the unset-projectId AppKit boot that broke no-extension visitors is gone. - Measured gas receipt: after mutateEntities, read the on-chain receipt and render gasUsed x effectiveGasPrice ("your wallet burned X GLM") - measured, not estimated. Decay Receipt (memory's life, visible + verifiable): - act() returns per-citation receipts: cortex:// id, real additive lease delta, estimate-flagged projected lease (clamped; safe with no chain cursor), tier, evolved weight, outcome applied. - cortex_act self-narrates the receipt (honest tense - "queued", "(est.)", no fabricated tx hash; outboxId is the provenance handle). - /api/decay/timeline + /decay/[entityKey]: inline-SVG lease step curve - solid = anchored on Braga, dashed = queued/projected neglect downslope. Linked from the console memory inspector. - cortex_act accepts an optional outcome [0,1] feeding the SEDM utility weight (reinforcement is utility-gated, not citation-count-gated). Plugin loop hardening (v0.1.3): - Shared src/lib/project-identity.ts so capture and recall can never disagree on project id (+ tests); sessionId passed to SessionStart recall (continuity boost); atomic pending-queue writes; collision-proof pending filenames; meaningful-summary gate (no empty husks written on-chain); narrower markup filter so JSX-leading goals aren't dropped. Honesty/docs: additive-extend wording corrected everywhere (README diagram + prose, constants, eval script, JUDGES); encryption claim scoped to the plugin path; 2.5x utility ceiling stated exactly; sovereignty boundary documented in store-file-prepare. Test-isolation fix in loop-singleton (CORTEX_CONFIG_PATH). 353+ -> 414 tests; suites green (4 pre-existing env/timing failures unrelated). --- .env.example | 4 +- README.md | 11 +- app/decay/[entityKey]/page.tsx | 3 + bun.lock | 374 ++++++-------------- cortex-plugin/.claude-plugin/plugin.json | 2 +- cortex-plugin/dist/cortex-hook-capture.js | 79 +++-- cortex-plugin/dist/cortex-hook-recall.js | 72 ++-- cortex-plugin/dist/cortex-mcp.js | 79 ++++- cortex-plugin/skills/cortex-memory/SKILL.md | 5 +- docs/Arkiv.md | 2 +- docs/WALKTHROUGH.md | 9 +- docs/submission/DEMO-READINESS.md | 80 +++++ docs/submission/JUDGES.md | 2 +- docs/submission/pitch.md | 11 +- lib/web/config.ts | 8 - lib/web/hooks/use-browser-upload.ts | 47 ++- lib/web/hooks/use-connect-wallet.ts | 29 +- lib/web/providers.tsx | 42 +-- lib/web/wagmi.ts | 33 +- package.json | 2 - scripts/cortex-hook-capture.ts | 122 ++++--- scripts/cortex-hook-recall.ts | 58 +-- scripts/eval/live-anchor-proof.ts | 2 +- src/constants.ts | 9 +- src/darwinian/citation.ts | 98 ++++- src/lib/project-identity.ts | 71 ++++ src/lib/store-file-prepare.ts | 10 + src/mcp/server.ts | 36 +- src/server/decay-timeline.ts | 216 +++++++++++ src/server/dispatch.ts | 2 + tests/darwinian-citation.test.ts | 140 +++++++- tests/decay-timeline.test.ts | 131 +++++++ tests/fixtures/rabitq-realdata-report.json | 42 +-- tests/loop-singleton.test.ts | 18 +- tests/project-identity.test.ts | 69 ++++ ui/components/DecayReceipt.tsx | 157 ++++++++ ui/components/WalletUpload.tsx | 9 +- ui/console.tsx | 26 ++ ui/decay-receipt-page.tsx | 61 ++++ 39 files changed, 1607 insertions(+), 564 deletions(-) create mode 100644 app/decay/[entityKey]/page.tsx create mode 100644 docs/submission/DEMO-READINESS.md create mode 100644 src/lib/project-identity.ts create mode 100644 src/server/decay-timeline.ts create mode 100644 tests/decay-timeline.test.ts create mode 100644 tests/project-identity.test.ts create mode 100644 ui/components/DecayReceipt.tsx create mode 100644 ui/decay-receipt-page.tsx diff --git a/.env.example b/.env.example index dae15fe..e65f685 100644 --- a/.env.example +++ b/.env.example @@ -54,8 +54,8 @@ CORTEX_MIRROR_PATH=./cortex-mirror.sqlite # --- Next.js / wallet UI --- -# Reown AppKit (WalletConnect). Omit to use injected MetaMask only. -# NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID= +# The console uses injected wallets only (MetaMask / Rabby / EIP-6963) — no +# WalletConnect/Reown projectId needed. # NEXT_PUBLIC_BRAGA_RPC=https://braga.hoodi.arkiv.network/rpc # NEXT_PUBLIC_APP_URL=http://localhost:3000 diff --git a/README.md b/README.md index b1f852f..459aa4c 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ ![Cortex landing page — Darwinian memory for AI agents on Arkiv Braga](./assets/landing-page.png) > **Darwinian memory for AI agents** — observations that earn longer expiration when -> cited; useless ones decay for free on Arkiv. Encrypted at rest with a key derived -> from your wallet. _(AI + Privacy · Arkiv × ETHNS Builder Challenge)_ +> cited; useless ones decay for free on Arkiv. Encrypted at rest with a wallet-derived +> key (client-side in the plugin). _(AI + Privacy · Arkiv × ETHNS Builder Challenge)_ | | Link | |---|------| @@ -24,7 +24,7 @@ One repo — not a monorepo. `app/` + `src/` + `cortex-plugin/` ship together. |--------|----------| | **Write** | RaBitQ-compress embeddings (1536-d → ~198 B), seal payload with wallet-derived AES-256-GCM, `createEntity` on Braga with **1 h** starting expiration | | **Recall** | Hybrid search: Arkiv attributes + local mirror + RaBitQ distance — no vector DB | -| **Reinforce** | Every `act(..., citations=[...])` fires **accumulative** `extend` (remaining lease + 24 h), so useful memories grow; stale ones evict via L1Block | +| **Reinforce** | Every `act(..., citations=[...])` fires **accumulative** `extend` (additive on Braga: +24 h baseline, scaled up to 2.5× by the memory's proven utility), so useful memories grow; stale ones evict via L1Block | | **Prove** | Merkle Mountain Range over decisions; roots **anchored on Arkiv** | Agent surface: **`recall(query, k)`** and **`act(action, citations[])`** only. @@ -171,9 +171,10 @@ sequenceDiagram Engine->>Chain: query attributes Engine-->>Agent: memory IDs Agent->>Engine: act with citations - Engine->>Chain: extendEntity remaining plus 24h + Engine->>Chain: extendEntity additive plus reinforcement Engine->>Chain: anchor MMR root Engine-->>SSE: memory.cited and arkiv.rpc + Note over Agent,Chain: act() is optimistic — enqueues; the worker anchors the extend async (no synchronous extend tx) Note over Chain: Uncited memories evict via L1Block ``` @@ -182,7 +183,7 @@ sequenceDiagram **Tiers:** working (1h) → episodic (≥2 cites, +7d) → semantic (≥5 cites · 3 sessions, 1y rule). -**Extend math:** `newBtl = remaining + reinforcement` (strict increase — naïve `+24h` reverts when remaining > 24 h). +**Extend math:** deployed Braga `extend` is **additive** — `expiresAt += expiresIn` (verified on-chain 2026-05-25). Each citation adds exactly its reinforcement (+24 h working, +7 d episodic), so useful memories accumulate lease while uncited ones decay. (The `remaining + reinforcement` REPLACE formula belongs to the future `EntityRegistry.sol`, not the live precompile — see `src/darwinian/extend.ts`.) --- diff --git a/app/decay/[entityKey]/page.tsx b/app/decay/[entityKey]/page.tsx new file mode 100644 index 0000000..42a68b3 --- /dev/null +++ b/app/decay/[entityKey]/page.tsx @@ -0,0 +1,3 @@ +"use client"; + +export { default } from "@/ui/decay-receipt-page"; diff --git a/bun.lock b/bun.lock index 792ee28..6faa8a8 100644 --- a/bun.lock +++ b/bun.lock @@ -11,8 +11,6 @@ "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.6.1", "@react-three/postprocessing": "^3.0.4", - "@reown/appkit": "^1.8.18", - "@reown/appkit-adapter-wagmi": "^1.8.18", "@tanstack/react-query": "^5", "better-sqlite3": "^12.10.0", "cbor-x": "^1.6.4", @@ -137,8 +135,6 @@ "@lit-labs/ssr-dom-shim": ["@lit-labs/ssr-dom-shim@1.6.0", "", {}, "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ=="], - "@lit/react": ["@lit/react@1.0.8", "", { "peerDependencies": { "@types/react": "17 || 18 || 19" } }, "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw=="], - "@lit/reactive-element": ["@lit/reactive-element@2.1.2", "", { "dependencies": { "@lit-labs/ssr-dom-shim": "^1.5.0" } }, "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A=="], "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="], @@ -175,8 +171,6 @@ "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.4.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg=="], - "@msgpack/msgpack": ["@msgpack/msgpack@3.1.3", "", {}, "sha512-47XIizs9XZXvuJgoaJUIE2lFoID8ugvc0jzSHP+Ptfk8nTbnR8g788wv48N03Kx0UkAv559HWRQ3yzOgzlRNUA=="], - "@next/env": ["@next/env@15.5.18", "", {}, "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g=="], "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ=="], @@ -203,8 +197,6 @@ "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], - "@phosphor-icons/webcomponents": ["@phosphor-icons/webcomponents@2.1.5", "", { "dependencies": { "lit": "^3" } }, "sha512-JcvQkZxvcX2jK+QCclm8+e8HXqtdFW9xV4/kk2aL9Y3dJA2oQVt+pzbv1orkumz3rfx4K9mn9fDoMr1He1yr7Q=="], - "@rainbow-me/rainbowkit": ["@rainbow-me/rainbowkit@2.2.11", "", { "dependencies": { "@vanilla-extract/css": "1.20.1", "@vanilla-extract/dynamic": "2.1.5", "@vanilla-extract/sprinkles": "1.6.5", "clsx": "2.1.1", "cuer": "0.0.3", "react-remove-scroll": "2.7.2", "ua-parser-js": "^2.0.9" }, "peerDependencies": { "@tanstack/react-query": ">=5.0.0", "react": ">=18", "react-dom": ">=18", "viem": "2.x", "wagmi": "^2.9.0" } }, "sha512-FHPsRHMBpuHHhuyKktAR13O9agmsUUunDnVEP4hG1dSZ2JojXLUSWyLG28VbGIJakHYylkNguiLFnqM/BM8ERA=="], "@react-three/drei": ["@react-three/drei@10.7.7", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.1.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ=="], @@ -213,25 +205,23 @@ "@react-three/postprocessing": ["@react-three/postprocessing@3.0.4", "", { "dependencies": { "maath": "^0.6.0", "n8ao": "^1.9.4", "postprocessing": "^6.36.6" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19.0", "three": ">= 0.156.0" } }, "sha512-e4+F5xtudDYvhxx3y0NtWXpZbwvQ0x1zdOXWTbXMK6fFLVDd4qucN90YaaStanZGS4Bd5siQm0lGL/5ogf8iDQ=="], - "@reown/appkit": ["@reown/appkit@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-pay": "1.8.20", "@reown/appkit-polyfills": "1.8.20", "@reown/appkit-scaffold-ui": "1.8.20", "@reown/appkit-ui": "1.8.20", "@reown/appkit-utils": "1.8.20", "@reown/appkit-wallet": "1.8.20", "@walletconnect/universal-provider": "2.23.7", "bs58": "6.0.0", "semver": "7.7.2", "valtio": "2.1.7", "viem": ">=2.45.0" }, "optionalDependencies": { "@lit/react": "1.0.8" } }, "sha512-+OI1TWg3XcMRhZ5RGVF0+AjkUvTPpODP6HFIgmxsV8HCf6bfE+jaYYE+JJcaz05TYJJ2TCXSYDyRfRvjSUzMzg=="], + "@reown/appkit": ["@reown/appkit@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-pay": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@reown/appkit-scaffold-ui": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/types": "2.21.0", "@walletconnect/universal-provider": "2.21.0", "bs58": "6.0.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA=="], - "@reown/appkit-adapter-wagmi": ["@reown/appkit-adapter-wagmi@1.8.20", "", { "dependencies": { "@reown/appkit": "1.8.20", "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-polyfills": "1.8.20", "@reown/appkit-scaffold-ui": "1.8.20", "@reown/appkit-utils": "1.8.20", "@reown/appkit-wallet": "1.8.20", "@walletconnect/universal-provider": "2.23.7", "valtio": "2.1.7" }, "optionalDependencies": { "@wagmi/connectors": ">=5.9.9" }, "peerDependencies": { "@wagmi/core": ">=2.21.2", "viem": ">=2.45.0", "wagmi": ">=2.19.5" } }, "sha512-HVCOyYrW5NYjj2BtdAaOabrC7q2GkdpsQ9KviwD+dvZhBu0rM0/SdD36WbLVTjezJLKS2/3/WfKbl5rdqvKpZw=="], + "@reown/appkit-common": ["@reown/appkit-common@1.7.8", "", { "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", "viem": ">=2.29.0" } }, "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ=="], - "@reown/appkit-common": ["@reown/appkit-common@1.8.20", "", { "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", "viem": ">=2.45.0" } }, "sha512-x6Yc8FaZZaEnsRCu6crYD/s1MA+Ffk35rJNZpug8I26iAJgi+o3rar/0lwZ70dl/QA9ytnwFUFWzhXqkT3O7Og=="], + "@reown/appkit-controllers": ["@reown/appkit-controllers@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/universal-provider": "2.21.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA=="], - "@reown/appkit-controllers": ["@reown/appkit-controllers@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-wallet": "1.8.20", "@walletconnect/universal-provider": "2.23.7", "valtio": "2.1.7", "viem": ">=2.45.0" } }, "sha512-2Gdi/ScftfBK3MwfAJcf/bGRByHgHzaAK8rCzKrYYUqLjbRFR9I/uq7gd6D+w4Xm+NRCpdiKFJY/0zPSfq+gpw=="], + "@reown/appkit-pay": ["@reown/appkit-pay@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "lit": "3.3.0", "valtio": "1.13.2" } }, "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw=="], - "@reown/appkit-pay": ["@reown/appkit-pay@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-ui": "1.8.20", "@reown/appkit-utils": "1.8.20", "lit": "3.3.0", "valtio": "2.1.7" } }, "sha512-JEoTVetCWNFJnbkYGtwvdWa7ZW7xF0uOH+jmJvnAbYSXTR+Bd8HdQOMn/AoWulSu6qmjKjNpZQmNjkIUf5yiUw=="], + "@reown/appkit-polyfills": ["@reown/appkit-polyfills@1.7.8", "", { "dependencies": { "buffer": "6.0.3" } }, "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA=="], - "@reown/appkit-polyfills": ["@reown/appkit-polyfills@1.8.20", "", { "dependencies": { "buffer": "6.0.3" } }, "sha512-88qJedSBYkhCZxeyODcQhqKt45OkS28VbZGNsay6t7FexvPcoibYMtkHaP79ojE8OuhV7k3FlrssrjPES3OFCw=="], + "@reown/appkit-scaffold-ui": ["@reown/appkit-scaffold-ui@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "@reown/appkit-wallet": "1.7.8", "lit": "3.3.0" } }, "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ=="], - "@reown/appkit-scaffold-ui": ["@reown/appkit-scaffold-ui@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-pay": "1.8.20", "@reown/appkit-ui": "1.8.20", "@reown/appkit-utils": "1.8.20", "@reown/appkit-wallet": "1.8.20", "lit": "3.3.0" } }, "sha512-Vx0qib30UUbcKT8VeNcCcZkkhtaOT28TtClQ8nKC0EdOkLA08Lxt0j32XpEat2c4Fl6xzAIIOuZO7HRBTxMfzA=="], + "@reown/appkit-ui": ["@reown/appkit-ui@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-wallet": "1.7.8", "lit": "3.3.0", "qrcode": "1.5.3" } }, "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow=="], - "@reown/appkit-ui": ["@reown/appkit-ui@1.8.20", "", { "dependencies": { "@phosphor-icons/webcomponents": "2.1.5", "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-wallet": "1.8.20", "lit": "3.3.0", "qrcode": "1.5.3" } }, "sha512-ObWhgu+4capnVhxtEG0VMRtGHwr6bso9VUcxDIfUDpjNAMi1HQBvXiBJ/R098Gvjmjz0QLwNe8YNVe50KaCTVw=="], + "@reown/appkit-utils": ["@reown/appkit-utils@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/logger": "2.1.2", "@walletconnect/universal-provider": "2.21.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw=="], - "@reown/appkit-utils": ["@reown/appkit-utils@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-controllers": "1.8.20", "@reown/appkit-polyfills": "1.8.20", "@reown/appkit-wallet": "1.8.20", "@wallet-standard/wallet": "1.1.0", "@walletconnect/logger": "3.0.2", "@walletconnect/universal-provider": "2.23.7", "valtio": "2.1.7", "viem": ">=2.45.0" }, "optionalDependencies": { "@base-org/account": "2.4.0", "@coinbase/wallet-sdk": "4.3.6", "@safe-global/safe-apps-provider": "0.18.6", "@safe-global/safe-apps-sdk": "9.1.0" } }, "sha512-ZVPUhZm/8TbR5MI1GzhazpUShrjVhZCC8Fyc7m+VXSPVZkPiW7K2AtTDAqhfYeStvBSJIvC6jbKwhlaWGR1TDQ=="], - - "@reown/appkit-wallet": ["@reown/appkit-wallet@1.8.20", "", { "dependencies": { "@reown/appkit-common": "1.8.20", "@reown/appkit-polyfills": "1.8.20", "@walletconnect/logger": "3.0.2", "zod": "3.22.4" } }, "sha512-fEYnCQTQFSi8qtGfdQp7BHAVD8yiijPgjXhel0jFLKTX5leufGKjrERtnn2vABoUHQucwQzI+Q958Bnx/lHE2w=="], + "@reown/appkit-wallet": ["@reown/appkit-wallet@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@walletconnect/logger": "2.1.2", "zod": "3.22.4" } }, "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A=="], "@safe-global/safe-apps-provider": ["@safe-global/safe-apps-provider@0.18.6", "", { "dependencies": { "@safe-global/safe-apps-sdk": "^9.1.0", "events": "^3.3.0" } }, "sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q=="], @@ -397,11 +387,7 @@ "@wagmi/core": ["@wagmi/core@2.22.1", "", { "dependencies": { "eventemitter3": "5.0.1", "mipd": "0.0.7", "zustand": "5.0.0" }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", "typescript": ">=5.0.4", "viem": "2.x" }, "optionalPeers": ["@tanstack/query-core", "typescript"] }, "sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg=="], - "@wallet-standard/base": ["@wallet-standard/base@1.1.0", "", {}, "sha512-DJDQhjKmSNVLKWItoKThJS+CsJQjR9AOBOirBVT1F9YpRyC9oYHE+ZnSf8y8bxUphtKqdQMPVQ2mHohYdRvDVQ=="], - - "@wallet-standard/wallet": ["@wallet-standard/wallet@1.1.0", "", { "dependencies": { "@wallet-standard/base": "^1.1.0" } }, "sha512-Gt8TnSlDZpAl+RWOOAB/kuvC7RpcdWAlFbHNoi4gsXsfaWa1QCT6LBcfIYTPdOZC9OVZUDwqGuGAcqZejDmHjg=="], - - "@walletconnect/core": ["@walletconnect/core@2.23.7", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "3.0.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.23.7", "@walletconnect/utils": "2.23.7", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.44.0", "events": "3.3.0", "uint8arrays": "3.1.1" } }, "sha512-yTyymn9mFaDZkUfLfZ3E9VyaSDPeHAXlrPxQRmNx2zFsEt/25GmTU2A848aomimLxZnAG2jNLhxbJ8I0gyNV+w=="], + "@walletconnect/core": ["@walletconnect/core@2.21.1", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.1", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ=="], "@walletconnect/environment": ["@walletconnect/environment@1.0.1", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg=="], @@ -423,7 +409,7 @@ "@walletconnect/keyvaluestorage": ["@walletconnect/keyvaluestorage@1.1.1", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.1", "idb-keyval": "^6.2.1", "unstorage": "^1.9.0" }, "peerDependencies": { "@react-native-async-storage/async-storage": "1.x" }, "optionalPeers": ["@react-native-async-storage/async-storage"] }, "sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA=="], - "@walletconnect/logger": ["@walletconnect/logger@3.0.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "10.0.0" } }, "sha512-7wR3wAwJTOmX4gbcUZcFMov8fjftY05+5cO/d4cpDD8wDzJ+cIlKdYOXaXfxHLSYeDazMXIsxMYjHYVDfkx+nA=="], + "@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], "@walletconnect/relay-api": ["@walletconnect/relay-api@1.0.11", "", { "dependencies": { "@walletconnect/jsonrpc-types": "^1.0.2" } }, "sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q=="], @@ -431,15 +417,15 @@ "@walletconnect/safe-json": ["@walletconnect/safe-json@1.0.2", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA=="], - "@walletconnect/sign-client": ["@walletconnect/sign-client@2.23.7", "", { "dependencies": { "@walletconnect/core": "2.23.7", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "3.0.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.23.7", "@walletconnect/utils": "2.23.7", "events": "3.3.0" } }, "sha512-SX61lzb1bTl/LijlcHQttnoHPBzzoY5mW9ArR6qhFtDNDTS7yr2rcH7rCngxHlYeb4rAYcWLHgbiGSrdKxl/mg=="], + "@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.1", "", { "dependencies": { "@walletconnect/core": "2.21.1", "@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", "@walletconnect/utils": "2.21.1", "events": "3.3.0" } }, "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg=="], "@walletconnect/time": ["@walletconnect/time@1.0.2", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g=="], - "@walletconnect/types": ["@walletconnect/types@2.23.7", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "3.0.2", "events": "3.3.0" } }, "sha512-6PAKK+iR2IntmlkCFLMAHjYeIaerCJJYRDmdRimhon0u+aNmQT+HyGM6zxDAth0rdpBD7qEvKP5IXZTE7KFUhw=="], + "@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ=="], - "@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.23.7", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "3.0.2", "@walletconnect/sign-client": "2.23.7", "@walletconnect/types": "2.23.7", "@walletconnect/utils": "2.23.7", "es-toolkit": "1.44.0", "events": "3.3.0" } }, "sha512-6UicU/Mhr/1bh7MNoajypz7BhigORbHpP1LFTf8FYLQGDqzmqHMqmMH2GDAImtaY2sFTi2jBvc22tLl8VMze/A=="], + "@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.1", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.1", "@walletconnect/types": "2.21.1", "@walletconnect/utils": "2.21.1", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg=="], - "@walletconnect/utils": ["@walletconnect/utils@2.23.7", "", { "dependencies": { "@msgpack/msgpack": "3.1.3", "@noble/ciphers": "1.3.0", "@noble/curves": "1.9.7", "@noble/hashes": "1.8.0", "@scure/base": "1.2.6", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "3.0.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.23.7", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "blakejs": "1.2.1", "detect-browser": "5.3.0", "ox": "0.9.3", "uint8arrays": "3.1.1" } }, "sha512-3p38gNrkVcIiQixVrlsWSa66Gjs5PqHOug2TxDgYUVBW5NcKjwQA08GkC6CKBQUfr5iaCtbfy6uZJW1LKSIvWQ=="], + "@walletconnect/utils": ["@walletconnect/utils@2.21.1", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA=="], "@walletconnect/window-getters": ["@walletconnect/window-getters@1.0.1", "", { "dependencies": { "tslib": "1.14.1" } }, "sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q=="], @@ -489,8 +475,6 @@ "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], - "blakejs": ["blakejs@1.2.1", "", {}, "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ=="], - "bn.js": ["bn.js@5.2.3", "", {}, "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w=="], "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], @@ -569,7 +553,7 @@ "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], - "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], @@ -659,7 +643,7 @@ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], - "es-toolkit": ["es-toolkit@1.44.0", "", {}, "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="], + "es-toolkit": ["es-toolkit@1.33.0", "", {}, "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], @@ -933,7 +917,7 @@ "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + "on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -965,11 +949,11 @@ "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], - "pino": ["pino@10.0.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "slow-redact": "^0.3.0", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA=="], + "pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], - "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + "pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], - "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], + "pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], @@ -993,13 +977,13 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], - "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + "process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "proxy-compare": ["proxy-compare@3.0.1", "", {}, "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q=="], + "proxy-compare": ["proxy-compare@2.6.0", "", {}, "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw=="], "proxy-from-env": ["proxy-from-env@2.1.0", "", {}, "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA=="], @@ -1041,7 +1025,7 @@ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], + "real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], @@ -1063,7 +1047,7 @@ "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="], - "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + "semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], @@ -1095,13 +1079,11 @@ "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], - "slow-redact": ["slow-redact@0.3.2", "", {}, "sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw=="], - "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], "socket.io-parser": ["socket.io-parser@4.2.6", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg=="], - "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="], + "sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], @@ -1141,7 +1123,7 @@ "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], - "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + "thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="], @@ -1185,7 +1167,7 @@ "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], - "uint8arrays": ["uint8arrays@3.1.1", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg=="], + "uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], @@ -1211,7 +1193,7 @@ "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - "valtio": ["valtio@2.1.7", "", { "dependencies": { "proxy-compare": "^3.0.1" }, "peerDependencies": { "@types/react": ">=18.0.0", "react": ">=18.0.0" }, "optionalPeers": ["@types/react", "react"] }, "sha512-DwJhCDpujuQuKdJ2H84VbTjEJJteaSmqsuUltsfbfdbotVfNeTE4K/qc/Wi57I9x8/2ed4JNdjEna7O6PfavRg=="], + "valtio": ["valtio@1.13.2", "", { "dependencies": { "derive-valtio": "0.1.0", "proxy-compare": "2.6.0", "use-sync-external-store": "1.2.0" }, "peerDependencies": { "@types/react": ">=16.8", "react": ">=16.8" }, "optionalPeers": ["@types/react", "react"] }, "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], @@ -1293,20 +1275,22 @@ "@metamask/providers/@metamask/utils": ["@metamask/utils@8.5.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ=="], - "@metamask/sdk/cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], - "@metamask/sdk/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - "@metamask/sdk-communication-layer/cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], - "@metamask/sdk-communication-layer/debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], - "@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@react-three/postprocessing/maath": ["maath@0.6.0", "", { "peerDependencies": { "@types/three": ">=0.144.0", "three": ">=0.144.0" } }, "sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw=="], + "@reown/appkit/@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw=="], + + "@reown/appkit/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.0", "@walletconnect/types": "2.21.0", "@walletconnect/utils": "2.21.0", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg=="], + + "@reown/appkit-controllers/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.0", "@walletconnect/types": "2.21.0", "@walletconnect/utils": "2.21.0", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg=="], + + "@reown/appkit-utils/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.0", "@walletconnect/types": "2.21.0", "@walletconnect/utils": "2.21.0", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg=="], + "@reown/appkit-wallet/zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], "@solana/rpc-subscriptions-channel-websocket/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], @@ -1317,18 +1301,10 @@ "@walletconnect/environment/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "@walletconnect/ethereum-provider/@reown/appkit": ["@reown/appkit@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-pay": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@reown/appkit-scaffold-ui": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/types": "2.21.0", "@walletconnect/universal-provider": "2.21.0", "bs58": "6.0.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.1", "", { "dependencies": { "@walletconnect/core": "2.21.1", "@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", "@walletconnect/utils": "2.21.1", "events": "3.3.0" } }, "sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg=="], - - "@walletconnect/ethereum-provider/@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.1", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.1", "@walletconnect/types": "2.21.1", "@walletconnect/utils": "2.21.1", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils": ["@walletconnect/utils@2.21.1", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA=="], - "@walletconnect/events/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + "@walletconnect/jsonrpc-http-connection/cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + "@walletconnect/jsonrpc-utils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "@walletconnect/jsonrpc-ws-connection/ws": ["ws@7.5.11", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA=="], @@ -1339,15 +1315,17 @@ "@walletconnect/relay-auth/@noble/hashes": ["@noble/hashes@1.7.0", "", {}, "sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w=="], - "@walletconnect/relay-auth/uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], - "@walletconnect/safe-json/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "@walletconnect/time/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "@walletconnect/utils/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - "@walletconnect/utils/ox": ["ox@0.9.3", "", { "dependencies": { "@adraffy/ens-normalize": "^1.11.0", "@noble/ciphers": "^1.3.0", "@noble/curves": "1.9.1", "@noble/hashes": "^1.8.0", "@scure/bip32": "^1.7.0", "@scure/bip39": "^1.6.0", "abitype": "^1.0.9", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-KzyJP+fPV4uhuuqrTZyok4DC7vFzi7HLUFiUNEmpbyh59htKWkOC98IONC1zgXJPbHAhQgqs6B0Z6StCGhmQvg=="], + "@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], "@walletconnect/window-getters/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], @@ -1381,8 +1359,6 @@ "markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "node-abi/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "obj-multiplex/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "porto/idb-keyval": ["idb-keyval@6.2.4", "", {}, "sha512-D/NzHWUmYJGXi++z67aMSrnisb9A3621CyRK5G89JyTlN13C8xf0g04DLxUKMufPem3e3L2JAXR6Z00OWy183Q=="], @@ -1391,8 +1367,6 @@ "promise-worker-transferable/is-promise": ["is-promise@2.2.2", "", {}, "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="], - "sharp/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="], "to-buffer/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -1403,6 +1377,8 @@ "unstorage/lru-cache": ["lru-cache@11.5.0", "", {}, "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA=="], + "valtio/use-sync-external-store": ["use-sync-external-store@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA=="], + "wagmi/use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], "@base-org/account/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -1413,73 +1389,47 @@ "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/utils": ["@metamask/utils@8.5.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.0.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ=="], - "@metamask/eth-json-rpc-provider/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], - "@metamask/json-rpc-engine/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/json-rpc-engine/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@metamask/json-rpc-middleware-stream/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/json-rpc-middleware-stream/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@metamask/providers/@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], - "@metamask/providers/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/providers/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@metamask/sdk-communication-layer/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], "@metamask/sdk/debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-common": ["@reown/appkit-common@1.7.8", "", { "dependencies": { "big.js": "6.2.2", "dayjs": "1.11.13", "viem": ">=2.29.0" } }, "sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-controllers": ["@reown/appkit-controllers@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/universal-provider": "2.21.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-pay": ["@reown/appkit-pay@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "lit": "3.3.0", "valtio": "1.13.2" } }, "sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.0", "", { "dependencies": { "@walletconnect/core": "2.21.0", "@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", "@walletconnect/utils": "2.21.0", "events": "3.3.0" } }, "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-polyfills": ["@reown/appkit-polyfills@1.7.8", "", { "dependencies": { "buffer": "6.0.3" } }, "sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-scaffold-ui": ["@reown/appkit-scaffold-ui@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-ui": "1.7.8", "@reown/appkit-utils": "1.7.8", "@reown/appkit-wallet": "1.7.8", "lit": "3.3.0" } }, "sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.21.0", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-ui": ["@reown/appkit-ui@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-wallet": "1.7.8", "lit": "3.3.0", "qrcode": "1.5.3" } }, "sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.0", "", { "dependencies": { "@walletconnect/core": "2.21.0", "@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", "@walletconnect/utils": "2.21.0", "events": "3.3.0" } }, "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils": ["@reown/appkit-utils@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-controllers": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@reown/appkit-wallet": "1.7.8", "@walletconnect/logger": "2.1.2", "@walletconnect/universal-provider": "2.21.0", "valtio": "1.13.2", "viem": ">=2.29.0" } }, "sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet": ["@reown/appkit-wallet@1.7.8", "", { "dependencies": { "@reown/appkit-common": "1.7.8", "@reown/appkit-polyfills": "1.7.8", "@walletconnect/logger": "2.1.2", "zod": "3.22.4" } }, "sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.21.0", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types": ["@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", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.0", "", { "dependencies": { "@walletconnect/core": "2.21.0", "@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", "@walletconnect/utils": "2.21.0", "events": "3.3.0" } }, "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.21.0", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.21.0", "@walletconnect/types": "2.21.0", "@walletconnect/utils": "2.21.0", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.21.0", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig=="], - "@walletconnect/ethereum-provider/@reown/appkit/valtio": ["valtio@1.13.2", "", { "dependencies": { "derive-valtio": "0.1.0", "proxy-compare": "2.6.0", "use-sync-external-store": "1.2.0" }, "peerDependencies": { "@types/react": ">=16.8", "react": ">=16.8" }, "optionalPeers": ["@types/react", "react"] }, "sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A=="], + "@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/core": ["@walletconnect/core@2.21.1", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.1", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ=="], + "@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/es-toolkit": ["es-toolkit@1.33.0", "", {}, "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], - - "@walletconnect/utils/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - - "eth-block-tracker/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + "@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], "ethereum-cryptography/@scure/bip32/@scure/base": ["@scure/base@1.1.9", "", {}, "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg=="], @@ -1493,214 +1443,118 @@ "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils": ["@metamask/utils@9.3.0", "", { "dependencies": { "@ethereumjs/tx": "^4.2.0", "@metamask/superstruct": "^3.1.0", "@noble/hashes": "^1.3.1", "@scure/base": "^1.1.3", "@types/debug": "^4.1.7", "debug": "^4.3.4", "pony-cause": "^2.1.10", "semver": "^7.5.4", "uuid": "^9.0.1" } }, "sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g=="], - "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@metamask/providers/@metamask/rpc-errors/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], - "@metamask/providers/@metamask/rpc-errors/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/sign-client/@walletconnect/core": ["@walletconnect/core@2.21.0", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.0", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/zod": ["zod@3.22.4", "", {}, "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger": ["@walletconnect/logger@2.1.2", "", { "dependencies": { "@walletconnect/safe-json": "^1.0.2", "pino": "7.11.0" } }, "sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.21.0", "", { "dependencies": { "@walletconnect/core": "2.21.0", "@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", "@walletconnect/utils": "2.21.0", "events": "3.3.0" } }, "sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils": ["@walletconnect/utils@2.21.0", "", { "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", "@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", "@walletconnect/window-getters": "1.0.1", "@walletconnect/window-metadata": "1.0.1", "bs58": "6.0.0", "detect-browser": "5.3.0", "query-string": "7.1.3", "uint8arrays": "3.1.0", "viem": "2.23.2" } }, "sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/sign-client/@walletconnect/core": ["@walletconnect/core@2.21.0", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.0", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/es-toolkit": ["es-toolkit@1.33.0", "", {}, "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - "@walletconnect/ethereum-provider/@reown/appkit/valtio/proxy-compare": ["proxy-compare@2.6.0", "", {}, "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - "@walletconnect/ethereum-provider/@reown/appkit/valtio/use-sync-external-store": ["use-sync-external-store@1.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/core/es-toolkit": ["es-toolkit@1.33.0", "", {}, "sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/core/uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client/@walletconnect/core": ["@walletconnect/core@2.21.0", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.0", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw=="], - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + "@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], + "@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + "@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - - "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils/semver": ["semver@7.8.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg=="], + "@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], "@metamask/eth-json-rpc-provider/@metamask/json-rpc-engine/@metamask/rpc-errors/@metamask/utils/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino": ["pino@7.11.0", "", { "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.0.0", "on-exit-leak-free": "^0.2.0", "pino-abstract-transport": "v0.5.0", "pino-std-serializers": "^4.0.0", "process-warning": "^1.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.1.0", "safe-stable-stringify": "^2.1.0", "sonic-boom": "^2.2.1", "thread-stream": "^0.15.1" }, "bin": { "pino": "bin.js" } }, "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client/@walletconnect/core": ["@walletconnect/core@2.21.0", "", { "dependencies": { "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/jsonrpc-ws-connection": "1.0.16", "@walletconnect/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", "@walletconnect/utils": "2.21.0", "@walletconnect/window-getters": "1.0.1", "es-toolkit": "1.33.0", "events": "3.3.0", "uint8arrays": "3.1.0" } }, "sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/ciphers": ["@noble/ciphers@1.2.1", "", {}, "sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], - - "@walletconnect/ethereum-provider/@walletconnect/sign-client/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], - - "@walletconnect/ethereum-provider/@walletconnect/types/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], - - "@walletconnect/ethereum-provider/@walletconnect/universal-provider/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - - "@walletconnect/ethereum-provider/@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-utils/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], - - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@reown/appkit-wallet/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/types/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/pino-abstract-transport": ["pino-abstract-transport@0.5.0", "", { "dependencies": { "duplexify": "^4.1.2", "split2": "^4.0.0" } }, "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/pino-std-serializers": ["pino-std-serializers@4.0.0", "", {}, "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/process-warning": ["process-warning@1.0.0", "", {}, "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/real-require": ["real-require@0.1.0", "", {}, "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/sonic-boom": ["sonic-boom@2.8.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/logger/pino/thread-stream": ["thread-stream@0.15.2", "", { "dependencies": { "real-require": "^0.1.0" } }, "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/sign-client/@walletconnect/core/uint8arrays": ["uint8arrays@3.1.0", "", { "dependencies": { "multiformats": "^9.4.2" } }, "sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip32": ["@scure/bip32@1.6.2", "", { "dependencies": { "@noble/curves": "~1.8.1", "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.2" } }, "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/@scure/bip39": ["@scure/bip39@1.5.4", "", { "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" } }, "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/isows": ["isows@1.0.6", "", { "peerDependencies": { "ws": "*" } }, "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox": ["ox@0.6.7", "", { "dependencies": { "@adraffy/ens-normalize": "^1.10.1", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0", "@scure/bip32": "^1.5.0", "@scure/bip39": "^1.4.0", "abitype": "^1.0.6", "eventemitter3": "5.0.1" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@reown/appkit-utils/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/curves": ["@noble/curves@1.9.1", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip32": ["@scure/bip32@1.7.0", "", { "dependencies": { "@noble/curves": "~1.9.0", "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@walletconnect/ethereum-provider/@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], + "@reown/appkit/@walletconnect/universal-provider/@walletconnect/utils/viem/ox/abitype": ["abitype@1.2.3", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3.22.0 || ^4.0.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg=="], } } diff --git a/cortex-plugin/.claude-plugin/plugin.json b/cortex-plugin/.claude-plugin/plugin.json index e860303..9e8bb59 100644 --- a/cortex-plugin/.claude-plugin/plugin.json +++ b/cortex-plugin/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "cortex-memory", - "version": "0.1.2", + "version": "0.1.3", "description": "Every Claude Code session becomes a sovereign memory node: auto-captured before compaction and saved to Arkiv, recalled at session start, owned by your wallet. Reuses the Cortex decay-aware memory engine.", "author": { "name": "Cortex" diff --git a/cortex-plugin/dist/cortex-hook-capture.js b/cortex-plugin/dist/cortex-hook-capture.js index 9ce23f9..7de9262 100755 --- a/cortex-plugin/dist/cortex-hook-capture.js +++ b/cortex-plugin/dist/cortex-hook-capture.js @@ -5355,18 +5355,30 @@ var init_embeddings = __esm(() => { }); // scripts/cortex-hook-capture.ts -import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, readFileSync as readFileSync2, existsSync as existsSync2 } from "fs"; -import { join as join2, basename } from "path"; +import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync2, renameSync as renameSync2, readFileSync as readFileSync2, existsSync as existsSync2 } from "fs"; +import { join as join2 } from "path"; import { homedir as homedir2 } from "os"; -import { execFileSync, spawn } from "child_process"; -var MAX_TRANSCRIPT_BYTES = 8 * 1024 * 1024; -var MAX_SUMMARY_CHARS = 6000; -async function readStdin() { - const chunks = []; - for await (const chunk of process.stdin) { - chunks.push(chunk); - } - return Buffer.concat(chunks).toString("utf-8"); +import { spawn } from "child_process"; +import { createHash } from "crypto"; + +// src/lib/project-identity.ts +import { execFileSync } from "child_process"; +import { basename } from "path"; +function normalizeRemote(url) { + if (!url) + return null; + let s = url.trim().replace(/\.git\/?$/, ""); + const scp = !s.includes("://") ? s.match(/^[^@]+@([^:]+):(.+)$/) : null; + if (scp) + return `${scp[1]}/${scp[2]}`.replace(/\/+$/, ""); + try { + const u = new URL(s); + const path = u.pathname.replace(/^\/+/, "").replace(/\/+$/, ""); + if (u.hostname && path) + return `${u.hostname}/${path}`; + } catch {} + const trimmed = s.replace(/\/+$/, ""); + return trimmed || null; } function resolveProject(cwd) { try { @@ -5385,21 +5397,16 @@ function resolveProject(cwd) { return "unknown-project"; } } -function normalizeRemote(url) { - if (!url) - return null; - let s = url.trim(); - s = s.replace(/\.git$/, ""); - const scp = s.match(/^[^@]+@([^:]+):(.+)$/); - if (scp) - return `${scp[1]}/${scp[2]}`; - try { - const u = new URL(s); - const path = u.pathname.replace(/^\/+/, ""); - if (u.hostname && path) - return `${u.hostname}/${path}`; - } catch {} - return s || null; + +// scripts/cortex-hook-capture.ts +var MAX_TRANSCRIPT_BYTES = 8 * 1024 * 1024; +var MAX_SUMMARY_CHARS = 6000; +async function readStdin() { + const chunks = []; + for await (const chunk of process.stdin) { + chunks.push(chunk); + } + return Buffer.concat(chunks).toString("utf-8"); } function parseTranscript(raw) { const out = []; @@ -5488,13 +5495,13 @@ function buildSummary(msgs, project, sessionId) { summary = summary.slice(0, MAX_SUMMARY_CHARS) + ` \u2026(truncated)`; } - return summary; + return { text: summary, meaningful: goals.length > 0 || decisions.length > 0 }; } function firstMeaningfulLine(text) { for (const raw of text.split(` `)) { const s = raw.trim().replace(/\s+/g, " "); - if (!s || s.startsWith("/") || s.startsWith("```") || s.startsWith("<")) + if (!s || s.startsWith("/") || s.startsWith("```") || s.startsWith(" MAX_TRANSCRIPT_BYTES) raw = raw.slice(-MAX_TRANSCRIPT_BYTES); const msgs = parseTranscript(raw); - summary = buildSummary(msgs, project, sessionId); + const built = buildSummary(msgs, project, sessionId); + summary = built.text; + meaningful = built.meaningful; } else { log(`transcript_path missing or not found: ${path}`); } } catch (err) { log("transcript parse failed:", err); } - if (!summary.trim()) { - log(`no summary produced for project=${project} session=${sessionId}; nothing to capture.`); + if (!summary.trim() || !meaningful) { + log(`no meaningful summary for project=${project} session=${sessionId}; nothing to capture.`); return; } const file = queuePending({ diff --git a/cortex-plugin/dist/cortex-hook-recall.js b/cortex-plugin/dist/cortex-hook-recall.js index 58ed946..aa66a1d 100755 --- a/cortex-plugin/dist/cortex-hook-recall.js +++ b/cortex-plugin/dist/cortex-hook-recall.js @@ -25302,22 +25302,28 @@ var init_recall = __esm(() => { // scripts/cortex-hook-recall.ts import { readdirSync, existsSync as existsSync2, statSync } from "fs"; -import { join as join2, basename } from "path"; +import { join as join2 } from "path"; import { homedir as homedir2 } from "os"; -import { execFileSync, spawn } from "child_process"; -var HOOK_BUDGET_MS = 8000; -var RECALL_K = 5; -async function readStdin() { - const chunks = []; - for await (const chunk of process.stdin) - chunks.push(chunk); - return Buffer.concat(chunks).toString("utf-8"); -} -function withTimeout2(p, ms) { - return Promise.race([ - p, - new Promise((_, rej) => setTimeout(() => rej(new Error("cortex-recall timeout")), ms)) - ]); +import { spawn } from "child_process"; + +// src/lib/project-identity.ts +import { execFileSync } from "child_process"; +import { basename } from "path"; +function normalizeRemote(url) { + if (!url) + return null; + let s = url.trim().replace(/\.git\/?$/, ""); + const scp = !s.includes("://") ? s.match(/^[^@]+@([^:]+):(.+)$/) : null; + if (scp) + return `${scp[1]}/${scp[2]}`.replace(/\/+$/, ""); + try { + const u = new URL(s); + const path = u.pathname.replace(/^\/+/, "").replace(/\/+$/, ""); + if (u.hostname && path) + return `${u.hostname}/${path}`; + } catch {} + const trimmed = s.replace(/\/+$/, ""); + return trimmed || null; } function resolveProject(cwd) { try { @@ -25336,20 +25342,21 @@ function resolveProject(cwd) { return "unknown-project"; } } -function normalizeRemote(url) { - if (!url) - return null; - let s = url.trim().replace(/\.git$/, ""); - const scp = s.match(/^[^@]+@([^:]+):(.+)$/); - if (scp) - return `${scp[1]}/${scp[2]}`; - try { - const u = new URL(s); - const path = u.pathname.replace(/^\/+/, ""); - if (u.hostname && path) - return `${u.hostname}/${path}`; - } catch {} - return s || null; + +// scripts/cortex-hook-recall.ts +var HOOK_BUDGET_MS = 8000; +var RECALL_K = 5; +async function readStdin() { + const chunks = []; + for await (const chunk of process.stdin) + chunks.push(chunk); + return Buffer.concat(chunks).toString("utf-8"); +} +function withTimeout2(p, ms) { + return Promise.race([ + p, + new Promise((_, rej) => setTimeout(() => rej(new Error("cortex-recall timeout")), ms)) + ]); } function deriveQuery(cwd, project) { const recent = recentFiles(cwd, 8); @@ -25451,7 +25458,12 @@ async function main() { try { const { recall: recall2 } = await Promise.resolve().then(() => (init_recall(), exports_recall)); const query2 = deriveQuery(cwd, project); - const hits = await withTimeout2(recall2({ query: query2, k: RECALL_K, project }), HOOK_BUDGET_MS); + const hits = await withTimeout2(recall2({ + query: query2, + k: RECALL_K, + project, + ...event.session_id ? { sessionId: event.session_id } : {} + }), HOOK_BUDGET_MS); if (!hits || hits.length === 0) { if (queued > 0) { process.stdout.write(`Cortex: syncing ${queued} queued memory write(s) for ${project} in the background. No prior memories surfaced yet. diff --git a/cortex-plugin/dist/cortex-mcp.js b/cortex-plugin/dist/cortex-mcp.js index 785832e..12b85db 100644 --- a/cortex-plugin/dist/cortex-mcp.js +++ b/cortex-plugin/dist/cortex-mcp.js @@ -54010,10 +54010,28 @@ function migrateAddOutbox(db) { db.exec("ALTER TABLE citation_counts ADD COLUMN anchored_root TEXT;"); } } +function rowToOutbox(r) { + return { + id: r.id, + kind: r.kind, + bundle: JSON.parse(r.payload_json), + status: r.status, + attempts: r.attempts, + lastError: r.last_error, + createdAtMs: r.created_at_ms, + sentTxHashes: r.sent_tx_hashes ? JSON.parse(r.sent_tx_hashes) : null, + citationEntityKey: r.citation_entity_key, + reconciledAtMs: r.reconciled_at_ms + }; +} function enqueueOutbox(db, kind, bundle) { const res = db.prepare("INSERT INTO outbox (kind, payload_json, status, created_at_ms) VALUES (?, ?, 'pending', ?)").run(kind, JSON.stringify(bundle), Date.now()); return Number(res.lastInsertRowid); } +function listPendingOutbox(db, limit = 50) { + const rows = db.prepare("SELECT * FROM outbox WHERE status = 'pending' ORDER BY id ASC LIMIT ?").all(limit); + return rows.map(rowToOutbox); +} function migrateAddUtilityWeights(db) { const cols = db.prepare("PRAGMA table_info(citation_counts)").all(); const have = new Set(cols.map((c) => c.name)); @@ -54099,6 +54117,10 @@ function decodeAttributes(json2) { return []; return JSON.parse(json2); } +function getDaemonState(db, key) { + const row = db.prepare("SELECT value FROM daemon_state WHERE key = ?").get(key); + return row?.value ?? null; +} // src/mirror/replay.ts function rowToEntity(row) { @@ -54711,6 +54733,7 @@ async function act(opts) { action: opts.action, citations: [], extendedKeys: [], + receipts: [], promotedKeys: [], status: "noop", outboxId: null, @@ -54723,6 +54746,15 @@ async function act(opts) { const recallRanks = getLastRecallRanks(); const recallK = getLastRecallK(); const citationCount = validCitations.length; + const headBlock = Number(getDaemonState(db, "last_processed_block") ?? "0"); + const blockTime = BRAGA.blockTimeSeconds; + const pendingByKey = new Map; + for (const ob of listPendingOutbox(db, 500)) { + for (const it of ob.bundle.reinforceItems) { + const k = it.entityKey; + pendingByKey.set(k, (pendingByKey.get(k) ?? 0) + it.reinforcementSeconds); + } + } for (const entityKey of validCitations) { const cachedType = entityTypeOf(entityKey); const priorWeight = getMemoryWeight(db, entityKey, UTILITY.wInit); @@ -54776,6 +54808,37 @@ async function act(opts) { const tier = r?.promotedTo === "rule" || baseType === "rule" ? "rule" : r?.promotedTo === "episode" || baseType === "episode" ? "episode" : "observation"; return { key, tier, weight: r?.weight ?? UTILITY.wInit, citationCount: r?.count ?? 0 }; }); + const reinforceByKey = new Map(reinforceItems.map((i) => [i.entityKey, i.reinforcementSeconds])); + const baselineStmt = db.prepare("SELECT expires_at_block FROM entities WHERE entity_key = ?"); + const SANE_MAX_LEASE_SECONDS = REINFORCEMENT.semanticInitialSeconds; + const receipts = scores.map((s) => { + const delta = reinforceByKey.get(s.key) ?? 0; + const baseRow = baselineStmt.get(s.key); + const pendingSeconds = pendingByKey.get(s.key) ?? 0; + let remainingSeconds; + let estimated; + if (baseRow && baseRow.expires_at_block > 0 && headBlock > 0) { + const raw = Math.max(0, baseRow.expires_at_block - headBlock) * blockTime; + remainingSeconds = Math.min(raw, SANE_MAX_LEASE_SECONDS); + estimated = raw > SANE_MAX_LEASE_SECONDS; + } else { + remainingSeconds = REINFORCEMENT.initialWorkingSeconds; + estimated = true; + } + const projectedLeaseSeconds = remainingSeconds + pendingSeconds + delta; + return { + id: `cortex://${s.key}`, + key: s.key, + deltaSecondsThisCite: delta, + projectedLeaseSeconds, + projectedExpiresAtBlock: headBlock + Math.round(projectedLeaseSeconds / blockTime), + tier: s.tier, + weightAfter: s.weight, + citationCountAfter: s.citationCount, + outcomeApplied: opts.outcome ?? UTILITY.defaultOutcome, + estimated + }; + }); const built = buildCitationPayload(opts.action, validCitations, scores); const bundle = { action: opts.action, @@ -54793,6 +54856,7 @@ async function act(opts) { action: opts.action, citations: validCitations, extendedKeys: reinforceItems.map((i) => i.entityKey), + receipts, promotedKeys, status: "queued", outboxId, @@ -54907,12 +54971,13 @@ server.registerTool("cortex_recall", { }); server.registerTool("cortex_act", { title: "Cortex act", - description: "Record a decision and cite the memories that informed it. Each valid " + "citation fires an accumulative lease extension (+24h per citation) " + "so useful memories survive and the rest decay for free. Citations are " + "validated against the most recent cortex_recall in this session.", + description: "Record a decision and cite the memories that informed it. Each valid " + "citation fires an accumulative lease extension (+24h baseline, scaled up " + "by the memory's proven utility) so useful memories survive and the rest " + "decay for free. Pass `outcome` when you know whether the cited memories " + "actually helped \u2014 that makes reinforcement utility-gated, not just " + "citation-gated. Citations are validated against the most recent " + "cortex_recall in this session.", inputSchema: { action: exports_external.string().min(1).describe("The decision/action being taken."), - citations: exports_external.array(exports_external.string()).describe("Entity ids from the latest cortex_recall that you used.") + citations: exports_external.array(exports_external.string()).describe("Entity ids from the latest cortex_recall that you used."), + outcome: exports_external.number().min(0).max(1).optional().describe("How useful the cited memories were for this action, in [0,1]: " + "1 = led to a correct/successful result, 0 = wrong or unhelpful, " + "omit if unknown (defaults to neutral). Feeds the SEDM utility weight.") } -}, async ({ action, citations }) => { +}, async ({ action, citations, outcome }) => { const userPrimaryEOA = resolveCredentials().ownerEOA ?? undefined; if (!userPrimaryEOA) { return { @@ -54928,7 +54993,8 @@ server.registerTool("cortex_act", { const res = await act({ action, citations, - userPrimaryEOA + userPrimaryEOA, + ...outcome !== undefined ? { outcome } : {} }); if (res.status === "noop") { return { @@ -54940,11 +55006,12 @@ server.registerTool("cortex_act", { ] }; } + const fmtLease = (s) => s >= 86400 ? `~${(s / 86400).toFixed(1)}d` : `~${Math.max(1, Math.round(s / 3600))}h`; const lines = [ `Recorded decision: "${action}"`, - `Reinforced ${res.extendedKeys.length} memory(ies) \u2014 leases extended (accumulative).`, + ...res.receipts.map((r) => `${r.id} \u2192 +${(r.deltaSecondsThisCite / 3600).toFixed(1)}h queued this cite; ` + `projected lease ${fmtLease(r.projectedLeaseSeconds)}${r.estimated ? " (est.)" : ""}; ` + `tier ${r.tier} (w=${r.weightAfter.toFixed(2)}, cites=${r.citationCountAfter}, outcome=${r.outcomeApplied})`), res.promotedKeys.length > 0 ? `Promoted ${res.promotedKeys.length} to a higher tier.` : null, - `On-chain citation bundle queued (outbox #${res.outboxId}); anchors when a Cortex worker drains it.`, + `On-chain citation bundle queued (outbox #${res.outboxId}); anchors on Braga when a Cortex worker drains it.`, res.citationPayloadHashHex ? `MMR leaf (citation hash): ${res.citationPayloadHashHex}` : null ].filter(Boolean); return { content: [{ type: "text", text: lines.join(` diff --git a/cortex-plugin/skills/cortex-memory/SKILL.md b/cortex-plugin/skills/cortex-memory/SKILL.md index aae437d..feec609 100644 --- a/cortex-plugin/skills/cortex-memory/SKILL.md +++ b/cortex-plugin/skills/cortex-memory/SKILL.md @@ -27,7 +27,10 @@ more with `cortex_recall` when you need it. *most recent* `cortex_recall`. Each valid citation fires an accumulative lease extension — this is how useful memory survives. Do NOT cite ids you did not use; hallucinated/unused citations are dropped and waste nothing, but - they also teach the engine nothing. + they also teach the engine nothing. When you can tell whether the recalled + memory actually helped, pass `outcome` (0–1: 1 = it led to a correct result, + 0 = it was wrong/unhelpful) — that makes reinforcement *utility-gated*, so + genuinely useful memories earn longer leases than merely-often-cited ones. 3. **Store salient decisions.** When you settle an architectural decision, resolve a non-obvious bug, or establish a convention, capture it: diff --git a/docs/Arkiv.md b/docs/Arkiv.md index 0066c90..e8b8754 100644 --- a/docs/Arkiv.md +++ b/docs/Arkiv.md @@ -18,7 +18,7 @@ 5. **Effective max `btl` ≈ 272 years** (u32 cap on `btl` and `expiresAt`, 2-second blocks). No `MAX_BTL` guard anywhere — only Solidity 0.8 checked-arithmetic overflow on `currentBlock + btl`. No SDK validates upper bound. -6. **Extend is REPLACE not ADD, owner-only.** `newExpiresAt = currentBlock + btl`, must be strictly greater than `existingExpiresAt`. Cannot stack leases. Cannot delegate. +6. **Extend is REPLACE not ADD, owner-only** *in the Solidity `EntityRegistry` source*. ⚠️ **SUPERSEDED for the live chain:** the deployed Braga precompile was verified ADDITIVE (`expiresAt += expiresIn`) on-chain 2026-05-25 — see `docs/arkiv-network/2026-05-25-extend-semantics-VERIFIED.md`. The REPLACE semantics below describe the unshipped contract, which still cannot stack leases and cannot delegate. 7. **Agent memory is officially endorsed** as a flagship Arkiv use case (ETHNS Theme 1: "Agents Whose Memory You Actually Own"). Team framing is "memory you own, with expiration" — explicitly NOT permanent. They concede Arweave wins for permanence. diff --git a/docs/WALKTHROUGH.md b/docs/WALKTHROUGH.md index b394d3d..3b4ae36 100644 --- a/docs/WALKTHROUGH.md +++ b/docs/WALKTHROUGH.md @@ -11,9 +11,10 @@ bun run seed # seed 8 memories the agent will cite bun run dashboard # then open http://localhost:3000/console ``` -**On camera — open `/console` and say nothing for 20 seconds.** An autonomous -agent runs inside the server and cites a memory every ~20s. Within one tick the -judge watches, live and unprompted: +**On camera — open `/console` (local `bun run dashboard`) and say nothing for 20 +seconds.** An autonomous agent runs inside your **local** dev server and cites a +memory every ~20s. (This loop runs locally only — it does **not** run on the public +Vercel deploy.) Within one tick the judge watches, live and unprompted: 1. The **hero widget** lights its phase track: Recalling → Deciding → Reinforcing → Anchored, with the current query ("How does MMR proof verification work in Cortex?"). 2. The **Arkiv RPC ticker** streams real calls — `mutateEntities 178B 6.8s`, `extendEntity 32B`, `getEntity` — each with a clickable Braga tx link. *This is the chain working in real time, not a mirror read.* @@ -75,7 +76,7 @@ Show: the two `act tx` hashes appearing with explorer links. `[01:18]` — **Cut back to the dashboard.** Show: the two cited memories' decay bars have grown — visibly longer than they were 60 seconds ago, while the uncited third memory's bar continued to drain. -Voice: "That's accumulative extend in action. The new expiration is `remaining + 24 hours`, not a reset to 24 hours. Naïve extend reverts the moment remaining exceeds the reinforcement window — Arkiv's extend is REPLACE-not-ADD. The fix is in `src/darwinian/extend.ts`." +Voice: "That's accumulative extend in action. Each citation adds exactly 24 hours on top of whatever was remaining — Arkiv's deployed extend is additive, `expiresAt += expiresIn`, which we verified on-chain instead of trusting the Solidity source, which says REPLACE. The logic is in `src/darwinian/extend.ts`." `[01:35]` — **Open the Synaptic Market panel.** Show: a `listing` row with `ruleTag: anti-rug`, `confidence: 92`, price displayed in GLM, encrypted payload size. diff --git a/docs/submission/DEMO-READINESS.md b/docs/submission/DEMO-READINESS.md new file mode 100644 index 0000000..99139bd --- /dev/null +++ b/docs/submission/DEMO-READINESS.md @@ -0,0 +1,80 @@ +# Cortex — Demo-Readiness Brief (Arkiv PM + Marketing pitch) + +> Synthesized from a 4-expert adversarial audit that read the actual code +> (2026-06-11). Verdict: **GO / demo-safe.** Every claim below is code-backed. +> Do not say "permanent", "forever", "trustless", "fully decentralised", or +> "synchronous extend tx". + +## Verified credibility assets (lead with these) + +- **Measured gas receipt** — `lib/web/hooks/use-browser-upload.ts` reads the + on-chain receipt (`gasUsed × effectiveGasPrice` via `waitForTransactionReceipt`); + `ui/components/WalletUpload.tsx` renders "⛽ your wallet burned X GLM · N gas @ Y gwei". + Independently verifiable against the block explorer with **zero Cortex code in + the number**. This is the single most compelling 30 seconds. +- **Self-narrating decay receipt** — `cortex_act` returns a per-memory receipt and + the MCP tool prints "+24h queued this cite; projected lease ~Nd (est.); tier + observation (w=1.00→1.32, cites=2, outcome=…)". Tense-honest: "queued" not + "extended", "(est.)" on the projection, **never a fabricated txHash** (the + extend is optimistic — `outboxId` + later MMR anchor are the real handles). +- **Sovereignty (plugin path)** — payloads sealed client-side with a wallet-derived + key; same wallet replays the local SQLite mirror. `scripts/sovereignty-proof.ts`. +- **Real Braga E2E this session** — create+read tx + `0x2fc9c84d162a1a6a6aacb3b93beec98b66553067baddc5d77fee6f30525d401d`. + +## The 90-second pitch script + +1. **(0:00–0:20) The verifiable gas moment.** Console upload → MetaMask confirm → + "⛽ your wallet burned 0.000000XX GLM" + explorer link. *"That gas is read + straight from the on-chain receipt — no estimate, no Cortex code in that number."* +2. **(0:20–0:40) Memory should decay.** Show the `/decay` curve (Step 3). *"This + memory starts with a 1-hour lease and decays; uncited memories evict for free + via Arkiv's L1Block sync. I don't pay to forget."* +3. **(0:40–1:05) The Darwinian primitive.** `cortex_recall` → `cortex_act(citations)` + in Claude Code → the receipt → the curve steps up. *"Citing a memory adds 24h — + additive on Braga, verified on-chain. Committed locally, anchored asynchronously + by a worker; the handle is the outbox id + MMR root, not a synchronous tx. + Useful memories accumulate; useless ones decay."* +4. **(1:05–1:20) Sovereignty.** *"In the plugin every payload is sealed client-side + with a wallet-derived key — a fresh machine re-derives it and replays the mirror. + You own your memory even if my backend disappears. No key escrow."* +5. **(1:20–1:30) The ask — distribution, NOT blockspace.** *"Feature cortex-memory + in the Arkiv marketplace/docs as the reference example of decay-aware sovereign + memory, and co-write one 'why memory should decay' post. Arkiv gets the canonical + developer-facing demo of additive extend + L1Block eviction."* + +## Founder manual checklist (code can't do these) + +1. **Fund the demo wallet** ([faucet](https://braga.hoodi.arkiv.network/faucet/)) — + confirm non-zero GLM or Beat 1 dies on "insufficient funds". (Currently ~0.002 GLM.) +2. **Embedding key set** on the demo surface (OpenRouter/Cohere) — a 401 mid-upload kills Beat 1. +3. **Add `CORTEX_USER_SIGNATURE`** (`bun run derive-user-signature`) to demo the full sealed sovereignty loop. +4. **Don't narrate absolute block numbers** — the sync daemon doesn't run in the + plugin-first product, so the chain cursor is 0/stale. The receipt curve's climb + comes from committed-local state (citation_counts + outbox), which is honest. +5. **Rehearse "show me the extend tx"** → "act() is optimistic — the handle is the + outbox id + the later MMR anchor; here's a real anchored extend from a prior run" + (bookmark a real anchored tx and confirm it resolves before camera). + +## Step 3 (the visual `/decay` timeline) — corrected build plan + +Status: **not yet built** (`app/decay/`, `ui/components/DecayReceipt.tsx` absent). +Prerequisite (the latent baseline bug) is **already fixed** in `citation.ts` +(headBlock=0 → flagged estimate; clamped to a 1y sanity ceiling). + +Drifts to honor: +- Routing is exact-string (`src/server/dispatch.ts` `ROUTES[path]`) — use a **query + param**: `/api/decay/timeline?entityKey=…`. A `/api/decay` route already exists, + so the timeline must be a **distinct** path. +- Deployed surface is **Next** (`app/api/[[...path]]/route.ts` → `dispatch.ts`); + page at `app/decay/[entityKey]/page.tsx`. Mirror into `src/ui-server.ts` only for Bun demos. +- The on-chain upslope is **flat** for a freshly-cited memory (`extended` rows are + written only by the daemon after anchoring). **Overlay committed-local state** + (`citation_counts` + `listPendingOutbox`) for the climb and label it "queued / + not yet anchored". Draw a **mandatory dashed synthetic downslope** ("projected + neglect → eviction"). Render **durations** (`leaseSeconds`), not `projectedExpiresAtBlock`. + +Files: `src/server/decay-timeline.ts` (handler) · register in `src/server/dispatch.ts` +· `ui/components/DecayReceipt.tsx` (inline-SVG, solid=on-chain / dashed=projected) +· `app/decay/[entityKey]/page.tsx`. Reuse `citation.ts` projection math + `utility.ts` +`leaseSeconds` — never recompute a parallel lease formula. diff --git a/docs/submission/JUDGES.md b/docs/submission/JUDGES.md index 94df95c..33fadea 100644 --- a/docs/submission/JUDGES.md +++ b/docs/submission/JUDGES.md @@ -12,7 +12,7 @@ One repo, one product. This is **not** a monorepo release train — it is a sing |-------|------|-------------------------| | 1 | `src/constants.ts` | `PROJECT_ATTRIBUTE`, tier thresholds, Braga RPC | | 2 | `src/lib/arkiv-client.ts` | create / query / extend against Braga | -| 3 | `src/darwinian/extend.ts` | Accumulative extend (`remaining + reinforcement`) | +| 3 | `src/darwinian/extend.ts` | Accumulative extend (additive precompile: `expiresAt += reinforcement`, verified on-chain) | | 4 | `src/darwinian/recall.ts` + `src/compression/rabitq.ts` | Hybrid recall, RaBitQ — no vector DB | | 5 | `src/lib/crypto.ts` + `src/lib/payload-key.ts` | Wallet-derived AES-GCM (Privacy theme) | | 6 | `src/mirror/db.ts` + `src/mirror/schema.sql` | SQLite mirror, replay, user-owned copy | diff --git a/docs/submission/pitch.md b/docs/submission/pitch.md index 75342c4..ef714ab 100644 --- a/docs/submission/pitch.md +++ b/docs/submission/pitch.md @@ -4,9 +4,12 @@ > No "trustless forever" fluff. > > **Ground truth:** [README.md](../../README.md), [Arkiv.md](../Arkiv.md), [COMPETITORS.md](../COMPETITORS.md) -> **Live:** [cortex-arkiv.vercel.app/console](https://cortex-arkiv.vercel.app/console) +> **Live site:** [cortex-arkiv.vercel.app](https://cortex-arkiv.vercel.app) — landing + +> install + video. The autonomous loop does **not** run on the public deploy; record the +> `/console` demo locally via `bun run dev`. > -> **Record on:** `/console` (**Judge** mode). **`?dev=1`** = engineer cockpit + memory inspector only. +> **Record on:** local `/console` (**Judge** mode) via `bun run dev`. **`?dev=1`** = +> engineer cockpit + memory inspector only. ### Jump to @@ -78,7 +81,7 @@ If you only see a hash, you stopped at the receipt — **open inspector or recal |---|------------| | **Product** | Obsidian vault sync + **Claude Code plugin** + `recall` / `act` / `cortex_store_document` | | **Console (Judge)** | **Proof booth** — graph, wallet upload, automated cite judge for judges | -| **Autonomous agent strip** | **Server judge robot** (canned questions every ~20s) — **not** Claude thinking in your IDE | +| **Autonomous agent strip** | **Local demo loop** (canned questions on a timer, run via `bun run dev`) — **not** Claude thinking in your IDE, and **not** running on the public Vercel deploy | --- @@ -532,7 +535,7 @@ Unused memories → expiry → dropped on Arkiv (no forever storage) **Honest Braga caveats (integrity):** -- `extend` is **REPLACE** — we use `remaining + reinforcement` so it never reverts (`src/darwinian/extend.ts`). +- `extend` on deployed Braga is **ADDITIVE** — `expiresAt += expiresIn`, verified on-chain 2026-05-25. Each citation sends exactly the reinforcement (+24h); `remaining + reinforcement` would double-count and balloon leases (`src/darwinian/extend.ts`). REPLACE semantics belong to the future Solidity `EntityRegistry`, not the live precompile. - Historical `atBlock` queries broken — cold tier = mirror replay, not time travel (`docs/Arkiv.md`). - Vercel may not run background agent — full loop on local `bun run dev`. diff --git a/lib/web/config.ts b/lib/web/config.ts index 61d44b9..475b2ca 100644 --- a/lib/web/config.ts +++ b/lib/web/config.ts @@ -1,7 +1,4 @@ export const WEB_CONFIG = { - walletConnect: { - projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID?.trim() || "unset", - }, rpc: { braga: process.env.NEXT_PUBLIC_BRAGA_RPC?.trim() || "https://braga.hoodi.arkiv.network/rpc", }, @@ -11,8 +8,3 @@ export const WEB_CONFIG = { url: process.env.NEXT_PUBLIC_APP_URL?.trim() || "http://localhost:3000", }, } as const; - -export function isWalletConnectConfigured(): boolean { - const id = WEB_CONFIG.walletConnect.projectId; - return id.length > 0 && id !== "unset"; -} diff --git a/lib/web/hooks/use-browser-upload.ts b/lib/web/hooks/use-browser-upload.ts index b8dd8a3..ea57424 100644 --- a/lib/web/hooks/use-browser-upload.ts +++ b/lib/web/hooks/use-browser-upload.ts @@ -1,8 +1,9 @@ "use client"; import { useCallback, useState } from "react"; -import { getChainId, getWalletClient } from "@wagmi/core"; +import { getChainId, getWalletClient, waitForTransactionReceipt } from "@wagmi/core"; import { useSwitchChain } from "wagmi"; +import { formatEther, formatGwei } from "viem"; import type { Hex } from "@/ui/types"; import type { PreparedUploadResponse } from "@/lib/web/types/upload-quote"; import { buildSealedDocumentCreate } from "@/src/lib/browser-store-document"; @@ -21,6 +22,24 @@ const EXPLORER = "https://explorer.braga.hoodi.arkiv.network"; export type UploadStep = "idle" | "switch" | "adopt" | "prepare" | "sign" | "done" | "error"; +/** + * MEASURED gas of a confirmed write — read from the on-chain receipt + * (`gasUsed × effectiveGasPrice`), NOT the pre-sign estimate. This is the proof + * that the user's own wallet burned real Braga GLM per write: the number on the + * receipt is the same one the block explorer shows, derived independently of any + * Cortex code path. + */ +export interface GasReceipt { + /** Gas units actually consumed. */ + gasUsed: string; + /** Effective gas price in gwei. */ + effectiveGasPriceGwei: string; + /** Fee in wei (gasUsed × effectiveGasPrice), as a decimal string. */ + feeWei: string; + /** Fee formatted in whole GLM (ether units) for display. */ + feeGlm: string; +} + export function useBrowserUpload() { const { switchChainAsync } = useSwitchChain(); const identity = useCortexIdentity(); @@ -28,6 +47,7 @@ export function useBrowserUpload() { const [error, setError] = useState(null); const [lastTx, setLastTx] = useState(null); const [lastEntityKey, setLastEntityKey] = useState(null); + const [lastGas, setLastGas] = useState(null); const upload = useCallback( async ( @@ -39,6 +59,7 @@ export function useBrowserUpload() { setError(null); setLastTx(null); setLastEntityKey(null); + setLastGas(null); try { setStep("switch"); @@ -101,6 +122,27 @@ export function useBrowserUpload() { const entityKey = result.createdEntities[0] as Hex | undefined; + // Read the on-chain receipt for the MEASURED fee (gasUsed × + // effectiveGasPrice). Best-effort: the tx already landed, so a slow/flaky + // receipt read must not fail the upload — it only enriches the proof. + let gas: GasReceipt | null = null; + try { + const receipt = await waitForTransactionReceipt(wagmiConfig, { + hash: result.txHash as Hex, + chainId: bragaChain.id, + }); + const feeWei = receipt.gasUsed * receipt.effectiveGasPrice; + gas = { + gasUsed: receipt.gasUsed.toString(), + effectiveGasPriceGwei: formatGwei(receipt.effectiveGasPrice), + feeWei: feeWei.toString(), + feeGlm: formatEther(feeWei), + }; + setLastGas(gas); + } catch { + /* receipt read is best-effort; the write itself is already confirmed */ + } + if (entityKey) { try { await fetch("/api/memories/register", { @@ -121,6 +163,7 @@ export function useBrowserUpload() { txHash: result.txHash as Hex, entityKey, explorer: `${EXPLORER}/tx/${result.txHash}`, + gas, }; } catch (e) { setStep("error"); @@ -133,5 +176,5 @@ export function useBrowserUpload() { [identity, switchChainAsync], ); - return { upload, step, error, lastTx, lastEntityKey, identity }; + return { upload, step, error, lastTx, lastEntityKey, lastGas, identity }; } diff --git a/lib/web/hooks/use-connect-wallet.ts b/lib/web/hooks/use-connect-wallet.ts index 906741a..ed85def 100644 --- a/lib/web/hooks/use-connect-wallet.ts +++ b/lib/web/hooks/use-connect-wallet.ts @@ -2,8 +2,6 @@ import { useCallback, useState } from "react"; import { useConnect, useConnectors } from "wagmi"; -import { useAppKit } from "@reown/appkit/react"; -import { isWalletConnectConfigured } from "../config"; function pickInjectedConnector(connectors: ReturnType) { return ( @@ -34,11 +32,15 @@ async function hasInjectedProvider( const NO_WALLET_MESSAGE = "No browser wallet detected. On desktop, install MetaMask or Rabby and refresh. " + - "On mobile, open this page inside your wallet app's in-app browser. " + - "(A free WalletConnect projectId enables QR + mobile connect for everyone — see the README.)"; + "On mobile, open this page inside your wallet app's in-app browser."; +/** + * Injected-only connect. The console signs + pays Braga gas with the user's own + * browser-extension wallet (the on-camera proof); there is no WalletConnect/Reown + * cloud path. `connectWallet` and `openWalletModal` both resolve to the same + * injected connect so existing callers (ConnectGate, WalletHeader) are unchanged. + */ export function useConnectWallet() { - const { open } = useAppKit(); const { connectAsync, connectors, isPending, error } = useConnect(); // Our own channel for pre-flight guidance: a thrown error from the click handler // is void-discarded and never reaches the UI, and wagmi's `error` only covers @@ -55,22 +57,9 @@ export function useConnectWallet() { await connectAsync({ connector: injected }); }, [connectors, connectAsync]); - const connectWallet = useCallback(async () => { - if (!isWalletConnectConfigured()) { - await connectBrowserWallet(); - return; - } - open({ view: "Connect" }); - }, [connectBrowserWallet, open]); - - const openWalletModal = useCallback(() => { - if (!isWalletConnectConfigured()) return connectBrowserWallet(); - open(); - }, [connectBrowserWallet, open]); - return { - connectWallet, - openWalletModal, + connectWallet: connectBrowserWallet, + openWalletModal: connectBrowserWallet, isPending, error: localError ?? error?.message ?? null, }; diff --git a/lib/web/providers.tsx b/lib/web/providers.tsx index 8a03530..bb7b8c5 100644 --- a/lib/web/providers.tsx +++ b/lib/web/providers.tsx @@ -2,38 +2,15 @@ import { useState, type ReactNode } from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { createAppKit } from "@reown/appkit/react"; import { cookieToInitialState, WagmiProvider, type Config } from "wagmi"; -import { wagmiAdapter, projectId, networks, bragaChain } from "./wagmi"; -import { WEB_CONFIG } from "./config"; - -let appKitInitialized = false; - -function initAppKit() { - if (appKitInitialized) return; - appKitInitialized = true; - - createAppKit({ - adapters: [wagmiAdapter], - projectId, - networks, - defaultNetwork: bragaChain, - metadata: { - name: WEB_CONFIG.app.name, - description: WEB_CONFIG.app.description, - url: typeof window !== "undefined" ? window.location.origin : WEB_CONFIG.app.url, - icons: [], - }, - features: { analytics: false }, - themeMode: "dark", - themeVariables: { - "--w3m-accent": "#ff5a00", - "--w3m-color-mix": "#1a1008", - "--w3m-color-mix-strength": 35, - }, - }); -} +import { wagmiConfig } from "./wagmi"; +/** + * Console providers — plain wagmi + react-query, injected-only (see ./wagmi.ts). + * No Reown AppKit: the previous build initialized AppKit unconditionally, which + * booted a WalletConnect cloud modal even with no projectId and broke the + * no-extension connect path. Connection is handled by ./hooks/use-connect-wallet. + */ export function WebProviders({ children, cookies, @@ -41,12 +18,11 @@ export function WebProviders({ children: ReactNode; cookies: string | null; }) { - initAppKit(); const [queryClient] = useState(() => new QueryClient()); - const initialState = cookieToInitialState(wagmiAdapter.wagmiConfig as Config, cookies); + const initialState = cookieToInitialState(wagmiConfig as Config, cookies); return ( - + {children} ); diff --git a/lib/web/wagmi.ts b/lib/web/wagmi.ts index 3b77b0f..3be97c9 100644 --- a/lib/web/wagmi.ts +++ b/lib/web/wagmi.ts @@ -1,25 +1,32 @@ import { cookieStorage, createStorage, http } from "@wagmi/core"; -import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; -import { mainnet, type AppKitNetwork } from "@reown/appkit/networks"; +import { createConfig } from "wagmi"; +import { injected } from "wagmi/connectors"; +import { mainnet } from "viem/chains"; import { braga } from "@arkiv-network/sdk/chains"; +import type { Chain } from "viem"; import { WEB_CONFIG } from "./config"; -/** Arkiv Braga — chain id 60138453102 (pinned in Cortex constants). */ -export const bragaChain = braga; - -export const projectId = WEB_CONFIG.walletConnect.projectId; +/** + * Console wallet config — INJECTED ONLY (MetaMask / Rabby / any EIP-6963 wallet). + * + * The console's job is an on-camera proof that the USER's own wallet signs and + * pays Braga gas per write. That only needs a desktop browser-extension wallet, + * so we deliberately drop the WalletConnect/Reown cloud stack: it added a hosted + * dependency (a `projectId` that, when unset, booted an AppKit modal that broke + * the no-extension path) for a mobile-QR flow this surface doesn't need. The + * sovereign, local-first product is the plugin — not this console. + */ -export const networks = [braga, mainnet] as [AppKitNetwork, ...AppKitNetwork[]]; +/** Arkiv Braga — chain id 60138453102 (pinned in Cortex constants). */ +export const bragaChain = braga as unknown as Chain; -export const wagmiAdapter = new WagmiAdapter({ +export const wagmiConfig = createConfig({ + chains: [bragaChain, mainnet], + connectors: [injected({ shimDisconnect: true })], storage: createStorage({ storage: cookieStorage }), ssr: true, - projectId, - networks, transports: { - [braga.id]: http(WEB_CONFIG.rpc.braga), + [bragaChain.id]: http(WEB_CONFIG.rpc.braga), [mainnet.id]: http(), }, }); - -export const wagmiConfig = wagmiAdapter.wagmiConfig; diff --git a/package.json b/package.json index c7c1604..e5f1681 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,6 @@ "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.6.1", "@react-three/postprocessing": "^3.0.4", - "@reown/appkit": "^1.8.18", - "@reown/appkit-adapter-wagmi": "^1.8.18", "@tanstack/react-query": "^5", "better-sqlite3": "^12.10.0", "cbor-x": "^1.6.4", diff --git a/scripts/cortex-hook-capture.ts b/scripts/cortex-hook-capture.ts index 51e1bd5..4007a7c 100644 --- a/scripts/cortex-hook-capture.ts +++ b/scripts/cortex-hook-capture.ts @@ -12,19 +12,23 @@ * 2. read the transcript JSONL and deterministically extract user goals + * assistant decisions into a concise summary (NO LLM call — hooks must be * fast/offline; `PreCompact` cannot block/delay compaction), - * 3. best-effort `storeSessionSummary(...)` to Arkiv with a short timeout; if - * the wallet/embedding provider/Arkiv is unavailable we WRITE THE SUMMARY - * to a local pending file under the plugin data dir and exit 0. + * 3. ALWAYS write the summary to a local pending file (atomic) under the plugin + * data dir, then hand the slow Arkiv write to a DETACHED background drainer + * (scripts/cortex-drain.ts) and exit 0 — never an inline chain write, since + * `PreCompact` cannot block/delay compaction. The drainer owns retries; the + * SessionStart hook also re-kicks it, so a queued summary is never lost. * * Invariant: this process NEVER throws and ALWAYS exits 0. A capture hook that * hangs or crashes would degrade the user's coding session — capture is * best-effort by design (local-mirror-first, retry on next SessionStart). */ -import { mkdirSync, writeFileSync, readFileSync, existsSync } from "node:fs"; -import { join, basename } from "node:path"; +import { mkdirSync, writeFileSync, renameSync, readFileSync, existsSync } from "node:fs"; +import { join } from "node:path"; import { homedir } from "node:os"; -import { execFileSync, spawn } from "node:child_process"; +import { spawn } from "node:child_process"; +import { createHash } from "node:crypto"; +import { resolveProject } from "../src/lib/project-identity.ts"; // --- hook contract --------------------------------------------------------- @@ -51,52 +55,9 @@ async function readStdin(): Promise { return Buffer.concat(chunks).toString("utf-8"); } -// --- project identity ------------------------------------------------------ - -/** - * Resolve a stable project id: `git remote get-url origin` of `cwd`, normalized - * to `host/owner/repo`; fallback to the cwd basename. Matches the identity the - * SessionStart recall hook uses so capture and recall agree on `project`. - */ -function resolveProject(cwd: string): string { - try { - const url = execFileSync("git", ["remote", "get-url", "origin"], { - cwd, - stdio: ["ignore", "pipe", "ignore"], - timeout: 2_000, - }) - .toString() - .trim(); - const norm = normalizeRemote(url); - if (norm) return norm; - } catch { - /* not a git repo, no origin, or git missing — fall through */ - } - try { - return basename(cwd) || "unknown-project"; - } catch { - return "unknown-project"; - } -} - -/** git@host:owner/repo.git | https://host/owner/repo.git → host/owner/repo */ -function normalizeRemote(url: string): string | null { - if (!url) return null; - let s = url.trim(); - s = s.replace(/\.git$/, ""); - // scp-style: git@github.com:owner/repo - const scp = s.match(/^[^@]+@([^:]+):(.+)$/); - if (scp) return `${scp[1]}/${scp[2]}`; - // url-style: https://github.com/owner/repo or ssh://git@host/owner/repo - try { - const u = new URL(s); - const path = u.pathname.replace(/^\/+/, ""); - if (u.hostname && path) return `${u.hostname}/${path}`; - } catch { - /* not a URL */ - } - return s || null; -} +// Project identity is resolved by the shared src/lib/project-identity.ts module +// so capture (which stamps `workspace`) and recall (which queries by it) can +// never drift — see that file's header. // --- transcript → summary (deterministic, offline) ------------------------- @@ -164,11 +125,23 @@ const DECISION_CUES = * ## Decisions & outcomes (what the assistant did) * - ... */ +interface BuiltSummary { + /** The rendered markdown summary. */ + text: string; + /** + * True when the transcript yielded at least one real goal or decision. + * When false, the summary is just the boilerplate header + "(no clear … + * extracted)" placeholders and is NOT worth a sealed chain write — capture + * skips it instead of paying gas to store an empty husk (recon GAP 3). + */ + meaningful: boolean; +} + function buildSummary( msgs: TranscriptMsg[], project: string, sessionId: string, -): string { +): BuiltSummary { const userTurns = msgs.filter((m) => m.role === "user"); const asstTurns = msgs.filter((m) => m.role === "assistant"); @@ -214,14 +187,18 @@ function buildSummary( if (summary.length > MAX_SUMMARY_CHARS) { summary = summary.slice(0, MAX_SUMMARY_CHARS) + "\n…(truncated)"; } - return summary; + return { text: summary, meaningful: goals.length > 0 || decisions.length > 0 }; } function firstMeaningfulLine(text: string): string | null { for (const raw of text.split("\n")) { const s = raw.trim().replace(/\s+/g, " "); - // Skip slash-commands, tool noise, fenced code openers, empty lines. - if (!s || s.startsWith("/") || s.startsWith("```") || s.startsWith("<")) continue; + // Skip slash-commands, fenced code openers, and markup noise (closing tags, + // comments/doctypes) — but NOT real content that opens with a tag like + // " should …" or "
renders …", which a frontend-heavy session + // legitimately uses as a goal (over-broad "<" dropped those and could empty + // the whole summary — recon B2). + if (!s || s.startsWith("/") || s.startsWith("```") || s.startsWith(" 240 ? s.slice(0, 240) + "…" : s; } @@ -265,8 +242,22 @@ interface PendingSummary { function queuePending(p: PendingSummary): string { const dir = dataDir(); - const file = join(dir, `${safeName(p.project)}__${safeName(p.sessionId)}.json`); - writeFileSync(file, JSON.stringify(p, null, 2), "utf-8"); + // safeName collapses every non-alnum to `_` and truncates, so two distinct raw + // projects ("a/b" vs "a_b", or long monorepo paths differing past char 120) + // could sanitize to the SAME name and silently overwrite each other (recon B1). + // Disambiguate with a short hash of the RAW project+sessionId. The same + // (project, sessionId) still maps to one file, so a re-capture of the same + // session overwrites itself (idempotent), but different sessions never collide. + const tag = createHash("sha1").update(`${p.project}\0${p.sessionId}`).digest("hex").slice(0, 8); + const file = join(dir, `${safeName(p.project)}__${safeName(p.sessionId)}__${tag}.json`); + // Atomic write: serialize to a temp file in the same dir, then rename over the + // target. rename(2) is atomic within a filesystem, so the SessionStart drainer + // (a separate, possibly concurrent process) only ever sees a fully-written + // file — never a torn read mid-write (recon GAP 2). A repeated capture for the + // same session deliberately overwrites with the fresher summary. + const tmp = `${file}.${process.pid}.tmp`; + writeFileSync(tmp, JSON.stringify(p, null, 2), "utf-8"); + renameSync(tmp, file); return file; } @@ -301,13 +292,16 @@ async function main(): Promise { // Build the summary from the transcript (deterministic, offline). let summary = ""; + let meaningful = false; try { const path = event.transcript_path; if (path && existsSync(path)) { let raw = readFileSync(path, "utf-8"); if (raw.length > MAX_TRANSCRIPT_BYTES) raw = raw.slice(-MAX_TRANSCRIPT_BYTES); const msgs = parseTranscript(raw); - summary = buildSummary(msgs, project, sessionId); + const built = buildSummary(msgs, project, sessionId); + summary = built.text; + meaningful = built.meaningful; } else { log(`transcript_path missing or not found: ${path}`); } @@ -315,9 +309,13 @@ async function main(): Promise { log("transcript parse failed:", err); } - if (!summary.trim()) { - // Nothing to store — still exit cleanly. - log(`no summary produced for project=${project} session=${sessionId}; nothing to capture.`); + if (!summary.trim() || !meaningful) { + // Either no summary, or only boilerplate with no extracted goal/decision — + // not worth a sealed chain write. Exit cleanly without queuing an empty husk + // (recon GAP 3: empty summaries were silently queued + written). + log( + `no meaningful summary for project=${project} session=${sessionId}; nothing to capture.`, + ); return; } diff --git a/scripts/cortex-hook-recall.ts b/scripts/cortex-hook-recall.ts index 8ea3367..7c1eb49 100644 --- a/scripts/cortex-hook-recall.ts +++ b/scripts/cortex-hook-recall.ts @@ -22,9 +22,10 @@ */ import { readdirSync, existsSync, statSync } from "node:fs"; -import { join, basename } from "node:path"; +import { join } from "node:path"; import { homedir } from "node:os"; -import { execFileSync, spawn } from "node:child_process"; +import { spawn } from "node:child_process"; +import { resolveProject } from "../src/lib/project-identity.ts"; interface HookEvent { session_id?: string; @@ -52,43 +53,9 @@ function withTimeout(p: Promise, ms: number): Promise { ]); } -// --- project identity (mirrors cortex-hook-capture.ts) --------------------- - -function resolveProject(cwd: string): string { - try { - const url = execFileSync("git", ["remote", "get-url", "origin"], { - cwd, - stdio: ["ignore", "pipe", "ignore"], - timeout: 2_000, - }) - .toString() - .trim(); - const norm = normalizeRemote(url); - if (norm) return norm; - } catch { - /* fall through */ - } - try { - return basename(cwd) || "unknown-project"; - } catch { - return "unknown-project"; - } -} - -function normalizeRemote(url: string): string | null { - if (!url) return null; - let s = url.trim().replace(/\.git$/, ""); - const scp = s.match(/^[^@]+@([^:]+):(.+)$/); - if (scp) return `${scp[1]}/${scp[2]}`; - try { - const u = new URL(s); - const path = u.pathname.replace(/^\/+/, ""); - if (u.hostname && path) return `${u.hostname}/${path}`; - } catch { - /* not a URL */ - } - return s || null; -} +// Project identity is resolved by the shared src/lib/project-identity.ts module +// so capture (which stamps the `workspace` provenance) and recall (which queries +// by it) can never drift — see that file's header. // --- query derivation ------------------------------------------------------ @@ -210,7 +177,18 @@ async function main(): Promise { try { const { recall } = await import("../src/darwinian/recall.ts"); const query = deriveQuery(cwd, project); - const hits = await withTimeout(recall({ query, k: RECALL_K, project }), HOOK_BUDGET_MS); + // Pass sessionId so resume/clear of an existing session re-surfaces that + // session's own memories first (the 1.3x same-session continuity boost). + // On a brand-new session id it's simply a no-op boost — harmless. + const hits = await withTimeout( + recall({ + query, + k: RECALL_K, + project, + ...(event.session_id ? { sessionId: event.session_id } : {}), + }), + HOOK_BUDGET_MS, + ); if (!hits || hits.length === 0) { if (queued > 0) { diff --git a/scripts/eval/live-anchor-proof.ts b/scripts/eval/live-anchor-proof.ts index 3317c73..5d28eb7 100644 --- a/scripts/eval/live-anchor-proof.ts +++ b/scripts/eval/live-anchor-proof.ts @@ -76,7 +76,7 @@ async function waitForEntity(key: Hex, timeoutMs = 30_000): Promise { } const MEMORIES = [ - "Accumulative extend: a cited memory's new lease is remaining + 24h reinforcement, so useful memories grow.", + "Accumulative extend: each citation adds +24h to a memory's lease (additive on deployed Braga), so useful memories grow while uncited ones decay.", "RaBitQ compresses a 1536-d float32 embedding to 198 bytes — about 31x — with an unbiased inner-product estimator.", ]; diff --git a/src/constants.ts b/src/constants.ts index 28fd9d1..0956159 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -114,8 +114,13 @@ export type EntityType = (typeof ENTITY_TYPE)[keyof typeof ENTITY_TYPE]; export const SEALED_CONTENT_TYPE = "application/x-cortex-sealed"; /** - * Reinforcement parameters for the Darwinian engine. Per CLAUDE.md "Accumulative extend": - * new_btl_seconds = remaining_seconds + REINFORCEMENT_SECONDS + * Reinforcement parameters for the Darwinian engine. Deployed Braga `extend` is + * ADDITIVE (verified on-chain 2026-05-25), so each citation adds its reinforcement + * to the existing lease: + * new_expires_at = current_expires_at + reinforcementSeconds + * where reinforcementSeconds = base × utility factor (see darwinian/utility.ts + * leaseSeconds — a proven memory earns up to 2.5× base [1 + gamma·(wMax−wInit) = + * 1 + 0.5·3.0], an unproven one gets exactly base). * * 24h reinforcement is the working baseline. Tier promotions multiply this: * working → episodic: +7 days diff --git a/src/darwinian/citation.ts b/src/darwinian/citation.ts index e539473..bcff2c8 100644 --- a/src/darwinian/citation.ts +++ b/src/darwinian/citation.ts @@ -38,10 +38,12 @@ import { setMemoryWeight, getCitationRows, enqueueOutbox, + getDaemonState, + listPendingOutbox, type OutboxBundle, } from "../mirror/db.ts"; import { getLastRecallIds, getLastRecallRanks, getLastRecallK } from "./recall.ts"; -import { REINFORCEMENT, ENTITY_TYPE, UTILITY } from "../constants.ts"; +import { REINFORCEMENT, ENTITY_TYPE, UTILITY, BRAGA } from "../constants.ts"; import { proxyUtility, evolveWeight, leaseSeconds } from "./utility.ts"; import { publish } from "../lib/events.ts"; @@ -61,12 +63,44 @@ export interface CitationScore { citationCount: number; } +/** + * Per-cited-memory "decay receipt" returned from act() so the agent can + * self-narrate the Darwinian effect of its decision ("reused X → +24h queued, + * lease ~3d, weight 1.0→1.32"). Honest by construction: + * - `deltaSecondsThisCite` is REAL — deployed Braga extend is additive, so this + * is the exact lease gain this citation queues. + * - `projectedLeaseSeconds`/`projectedExpiresAtBlock` are an ESTIMATE (the extend + * is enqueued, not yet anchored), flagged via `estimated`. NEVER render a tx + * hash here — the on-chain extend doesn't exist until the worker drains the + * outbox; `outboxId` on ActResult is the only real provenance handle. + */ +export interface CitationReceipt { + /** `cortex://` — stable, citable id for the memory. */ + id: string; + key: Hex; + /** Lease seconds ADDED by this citation (additive precompile → real gain). */ + deltaSecondsThisCite: number; + /** Estimated total lease after this cite = remaining + pending + delta. */ + projectedLeaseSeconds: number; + projectedExpiresAtBlock: number; + tier: "observation" | "episode" | "rule"; + /** Evolved utility weight, committed this turn (not an estimate). */ + weightAfter: number; + citationCountAfter: number; + /** Outcome signal applied to the utility math (opts.outcome ?? default). */ + outcomeApplied: number; + /** true when no chain-confirmed expiry baseline existed (projection is rougher). */ + estimated: boolean; +} + export interface ActResult { action: string; /** Citations that survived the lastRecallIds check. */ citations: Hex[]; /** Memories whose lifespan WILL be extended once the worker drains the bundle. */ extendedKeys: Hex[]; + /** Per-cited-memory decay receipt (id, lease delta/projection, tier, weight). */ + receipts: CitationReceipt[]; /** Memories that crossed a tier threshold this turn (already marked locally). */ promotedKeys: Hex[]; /** @@ -260,6 +294,7 @@ export async function act(opts: ActOptions): Promise { action: opts.action, citations: [], extendedKeys: [], + receipts: [], promotedKeys: [], status: "noop", outboxId: null, @@ -278,6 +313,21 @@ export async function act(opts: ActOptions): Promise { const recallK = getLastRecallK(); const citationCount = validCitations.length; + // Decay-receipt baseline (read ONCE, BEFORE this act enqueues its own bundle). + // headBlock = local mirror's last processed block (no RPC). pendingByKey sums + // PRIOR in-flight extends not yet anchored, so the projected lease folds in + // additive Braga semantics without double-counting THIS cite's delta (which is + // added separately below). Must precede the enqueueOutbox call at the end. + const headBlock = Number(getDaemonState(db, "last_processed_block") ?? "0"); + const blockTime = BRAGA.blockTimeSeconds; + const pendingByKey = new Map(); + for (const ob of listPendingOutbox(db, 500)) { + for (const it of ob.bundle.reinforceItems) { + const k = it.entityKey as Hex; + pendingByKey.set(k, (pendingByKey.get(k) ?? 0) + it.reinforcementSeconds); + } + } + for (const entityKey of validCitations) { const cachedType = entityTypeOf(entityKey); @@ -389,6 +439,51 @@ export async function act(opts: ActOptions): Promise { return { key, tier, weight: r?.weight ?? UTILITY.wInit, citationCount: r?.count ?? 0 }; }); + // Decay receipts: project each cited memory's resulting lease. delta is REAL + // (additive precompile); the absolute projection is an estimate (extend still + // queued). Projecting against the entity's CURRENT expiry — not headBlock — + // honors additive semantics: head + remaining + delta == currentExpiry + delta. + const reinforceByKey = new Map(reinforceItems.map((i) => [i.entityKey, i.reinforcementSeconds])); + const baselineStmt = db.prepare("SELECT expires_at_block FROM entities WHERE entity_key = ?"); + // Sanity ceiling on a projected lease (project cap is 1 year). A projection + // above this means the chain cursor is stale, NOT that the memory truly has a + // multi-year lease — clamp + flag rather than print false precision. + const SANE_MAX_LEASE_SECONDS = REINFORCEMENT.semanticInitialSeconds; + const receipts: CitationReceipt[] = scores.map((s) => { + const delta = reinforceByKey.get(s.key) ?? 0; + const baseRow = baselineStmt.get(s.key) as { expires_at_block: number } | null; + // A usable on-chain baseline needs a known expiry AND a real chain cursor + // (headBlock). The plugin-first product runs no sync daemon, so headBlock is + // often 0/stale; without it, (expires_at_block - headBlock) is meaningless + // (expires_at_block is an absolute Braga block in the millions) and would + // render an absurd multi-year lease as if confirmed. Fall back to the working + // estimate, flagged, instead of printing false precision. + const pendingSeconds = pendingByKey.get(s.key) ?? 0; + let remainingSeconds: number; + let estimated: boolean; + if (baseRow && baseRow.expires_at_block > 0 && headBlock > 0) { + const raw = Math.max(0, baseRow.expires_at_block - headBlock) * blockTime; + remainingSeconds = Math.min(raw, SANE_MAX_LEASE_SECONDS); + estimated = raw > SANE_MAX_LEASE_SECONDS; // clamped ⇒ cursor stale ⇒ flag it + } else { + remainingSeconds = REINFORCEMENT.initialWorkingSeconds; + estimated = true; // no reliable chain baseline → projection is an estimate + } + const projectedLeaseSeconds = remainingSeconds + pendingSeconds + delta; + return { + id: `cortex://${s.key}`, + key: s.key, + deltaSecondsThisCite: delta, + projectedLeaseSeconds, + projectedExpiresAtBlock: headBlock + Math.round(projectedLeaseSeconds / blockTime), + tier: s.tier, + weightAfter: s.weight, + citationCountAfter: s.citationCount, + outcomeApplied: opts.outcome ?? UTILITY.defaultOutcome, + estimated, + }; + }); + const built = buildCitationPayload(opts.action, validCitations, scores); const bundle: OutboxBundle = { action: opts.action, @@ -408,6 +503,7 @@ export async function act(opts: ActOptions): Promise { action: opts.action, citations: validCitations, extendedKeys: reinforceItems.map((i) => i.entityKey), + receipts, promotedKeys, status: "queued", outboxId, diff --git a/src/lib/project-identity.ts b/src/lib/project-identity.ts new file mode 100644 index 0000000..f14a4a5 --- /dev/null +++ b/src/lib/project-identity.ts @@ -0,0 +1,71 @@ +/** + * Cortex — canonical project identity. + * + * A single source of truth for "which project/workspace does this cwd belong + * to?". The capture hook (writes the memory's `workspace` provenance) and the + * recall hook (queries by that same provenance) MUST agree byte-for-byte, or a + * memory captured under one id is never recalled under another — a silent + * cross-session data-loss bug. Previously each hook carried its own copy of this + * logic; this module makes drift impossible by construction. + * + * Identity = `git remote get-url origin` of `cwd`, normalized to `host/owner/repo`; + * fallback to the cwd basename for non-git projects. Pure + synchronous; the only + * side effect is a short, sandboxed `git` invocation with a hard 2s timeout. + */ + +import { execFileSync } from "node:child_process"; +import { basename } from "node:path"; + +/** + * `git@host:owner/repo.git` | `https://host/owner/repo.git` | + * `ssh://git@host/owner/repo` → `host/owner/repo`. + * + * Exported so tests can pin every URL shape (scp, https, ssh, custom host/port, + * trailing `.git`) against the exact normalization the hooks use. + */ +export function normalizeRemote(url: string): string | null { + if (!url) return null; + // Strip a single trailing `.git` (covers `repo.git` and `repo.git/`). + let s = url.trim().replace(/\.git\/?$/, ""); + // scp-style: git@github.com:owner/repo. A real scp remote has NO `://` scheme; + // guard on that so we don't misparse `ssh://host:port/owner/repo` (which has + // both `@` and `:`) as scp and fold the port into the path. + const scp = !s.includes("://") ? s.match(/^[^@]+@([^:]+):(.+)$/) : null; + if (scp) return `${scp[1]}/${scp[2]}`.replace(/\/+$/, ""); + // url-style: https://github.com/owner/repo or ssh://git@host/owner/repo + try { + const u = new URL(s); + const path = u.pathname.replace(/^\/+/, "").replace(/\/+$/, ""); + if (u.hostname && path) return `${u.hostname}/${path}`; + } catch { + /* not a URL — fall through */ + } + const trimmed = s.replace(/\/+$/, ""); + return trimmed || null; +} + +/** + * Resolve a stable project id for `cwd`. Tries the git origin remote first + * (normalized), then falls back to the directory basename, then to a constant so + * the result is never empty. Never throws. + */ +export function resolveProject(cwd: string): string { + try { + const url = execFileSync("git", ["remote", "get-url", "origin"], { + cwd, + stdio: ["ignore", "pipe", "ignore"], + timeout: 2_000, + }) + .toString() + .trim(); + const norm = normalizeRemote(url); + if (norm) return norm; + } catch { + /* not a git repo, no origin, or git missing — fall through */ + } + try { + return basename(cwd) || "unknown-project"; + } catch { + return "unknown-project"; + } +} diff --git a/src/lib/store-file-prepare.ts b/src/lib/store-file-prepare.ts index 5658a10..ef94a95 100644 --- a/src/lib/store-file-prepare.ts +++ b/src/lib/store-file-prepare.ts @@ -54,6 +54,16 @@ export async function prepareUploadedFile( } } + // SOVEREIGNTY BOUNDARY (be precise in any pitch/marketing): the *payload* is + // sealed client-side (browser-store-document.ts) and Braga only ever holds + // ciphertext. But embedding needs a provider key, so on the HOSTED console this + // `prepare` step runs server-side and the server sees the plaintext `text` + // momentarily to compute the embedding. So "encrypted client-side" is true; + // "the server never sees your data" is NOT true for the hosted console. + // (The plugin path is fully sovereign: it embeds locally with the USER's own + // key from ~/.cortex/config.json, so no third party ever sees plaintext.) + // To make the console equally sovereign, embed in-browser with a user-supplied + // key — tracked as a follow-up; until then, scope the claim to the plugin. const embedding = await embedText(text); return { text, diff --git a/src/mcp/server.ts b/src/mcp/server.ts index e3f1ce4..0c591dd 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -101,17 +101,30 @@ server.registerTool( title: "Cortex act", description: "Record a decision and cite the memories that informed it. Each valid " + - "citation fires an accumulative lease extension (+24h per citation) " + - "so useful memories survive and the rest decay for free. Citations are " + - "validated against the most recent cortex_recall in this session.", + "citation fires an accumulative lease extension (+24h baseline, scaled up " + + "by the memory's proven utility) so useful memories survive and the rest " + + "decay for free. Pass `outcome` when you know whether the cited memories " + + "actually helped — that makes reinforcement utility-gated, not just " + + "citation-gated. Citations are validated against the most recent " + + "cortex_recall in this session.", inputSchema: { action: z.string().min(1).describe("The decision/action being taken."), citations: z .array(z.string()) .describe("Entity ids from the latest cortex_recall that you used."), + outcome: z + .number() + .min(0) + .max(1) + .optional() + .describe( + "How useful the cited memories were for this action, in [0,1]: " + + "1 = led to a correct/successful result, 0 = wrong or unhelpful, " + + "omit if unknown (defaults to neutral). Feeds the SEDM utility weight.", + ), }, }, - async ({ action, citations }) => { + async ({ action, citations, outcome }) => { // Owner EOA resolves env → ~/.cortex/config.json (written by `cortex auth`). // Previously env-only, which broke cortex_act for every fresh installer. const userPrimaryEOA = (resolveCredentials().ownerEOA ?? undefined) as Hex | undefined; @@ -134,6 +147,7 @@ server.registerTool( action, citations: citations as Hex[], userPrimaryEOA, + ...(outcome !== undefined ? { outcome } : {}), }); if (res.status === "noop") { @@ -149,13 +163,23 @@ server.registerTool( }; } + // Self-narrating decay receipt, per cited memory. Honest tense: the delta is + // REAL (additive precompile), the absolute lease is an estimate ("est."), and + // there is NO tx hash yet (the extend is queued; outboxId is the real handle). + const fmtLease = (s: number) => + s >= 86_400 ? `~${(s / 86_400).toFixed(1)}d` : `~${Math.max(1, Math.round(s / 3_600))}h`; const lines = [ `Recorded decision: "${action}"`, - `Reinforced ${res.extendedKeys.length} memory(ies) — leases extended (accumulative).`, + ...res.receipts.map( + (r) => + `${r.id} → +${(r.deltaSecondsThisCite / 3_600).toFixed(1)}h queued this cite; ` + + `projected lease ${fmtLease(r.projectedLeaseSeconds)}${r.estimated ? " (est.)" : ""}; ` + + `tier ${r.tier} (w=${r.weightAfter.toFixed(2)}, cites=${r.citationCountAfter}, outcome=${r.outcomeApplied})`, + ), res.promotedKeys.length > 0 ? `Promoted ${res.promotedKeys.length} to a higher tier.` : null, - `On-chain citation bundle queued (outbox #${res.outboxId}); anchors when a Cortex worker drains it.`, + `On-chain citation bundle queued (outbox #${res.outboxId}); anchors on Braga when a Cortex worker drains it.`, res.citationPayloadHashHex ? `MMR leaf (citation hash): ${res.citationPayloadHashHex}` : null, diff --git a/src/server/decay-timeline.ts b/src/server/decay-timeline.ts new file mode 100644 index 0000000..eef3dba --- /dev/null +++ b/src/server/decay-timeline.ts @@ -0,0 +1,216 @@ +/** + * Cortex — Decay Receipt timeline endpoint (`/api/decay/timeline?entityKey=…`). + * + * Renders one memory's life as a lease-over-time step curve: the on-chain spine + * (created → each anchored extend → eviction) plus the committed-but-not-yet- + * anchored cites overlaid as a "queued" step, plus a synthetic dashed downslope + * showing the projected eviction if the memory is never cited again. This is the + * Decay Receipt's visual half — the artifact no generic memory layer (mem0/Letta/ + * vector-DB/IPFS/S3) can draw, because only Arkiv prices lease + evicts for free. + * + * Honesty rules baked in (per the demo-readiness audit): + * - Each on-chain point's `leaseSeconds` is derived from the event's OWN block + + * expiry ((new_expiration_block − block_number) × blockTime) — NOT from a + * global chain head, so it's correct even though the plugin-first product runs + * no sync daemon (no reliable `last_processed_block`). + * - Optimistic act() means a freshly-cited memory has NO `extended` rows yet, so + * the climb is shown from committed-local state and labelled `source:"projected"` + * ("queued / not yet anchored"). The downslope is `source:"synthetic"`. + * - `estimated` is true whenever any projected/synthetic point is present. + */ + +import type { Hex } from "@arkiv-network/sdk"; +import { getEventsForEntity } from "../mirror/replay.ts"; +import { initMirrorDb, listPendingOutbox, type EventRow } from "../mirror/db.ts"; +import { BRAGA } from "../constants.ts"; + +export type DecayPointSource = "onchain" | "projected" | "synthetic"; + +export interface DecayPoint { + /** Wall-clock ms of this point (what the audience feels). */ + tMs: number; + /** Lease remaining at this point, in seconds (the y-axis). */ + leaseSeconds: number; + source: DecayPointSource; + /** created | extended | queued | evicted | neglect */ + eventType: string; + txHash: Hex | null; + label: string; +} + +export interface DecayTimelineResponse { + entityKey: string; + cortexId: string; + points: DecayPoint[]; + /** live = on-chain; queued = committed-local, not yet anchored; expired/unknown. */ + state: "live" | "queued" | "expired" | "unknown"; + /** true when any point is projected/synthetic rather than chain-confirmed. */ + estimated: boolean; + note: string; +} + +/** Compact lease duration for labels. */ +function fmtLease(s: number): string { + if (s <= 0) return "0"; + if (s >= 86_400) return `~${(s / 86_400).toFixed(1)}d`; + if (s >= 3_600) return `~${Math.round(s / 3_600)}h`; + return `~${Math.max(1, Math.round(s / 60))}m`; +} + +type TimelineEvent = Pick< + EventRow, + "event_type" | "block_number" | "old_expiration_block" | "new_expiration_block" | "tx_hash" | "observed_at_ms" +>; + +/** + * Pure timeline builder — no I/O, exhaustively testable. Takes the entity's event + * log (block-ascending), the sum of committed-but-unanchored extend seconds for + * this key, and `nowMs` for the projected/synthetic points. + */ +export function buildDecayTimeline(input: { + entityKey: string; + events: TimelineEvent[]; + pendingSeconds: number; + blockTimeSeconds: number; + nowMs: number; +}): DecayTimelineResponse { + const { entityKey, events, pendingSeconds, blockTimeSeconds, nowMs } = input; + const cortexId = `cortex://${entityKey}`; + const points: DecayPoint[] = []; + let state: "live" | "queued" | "expired" | "unknown" = events.length > 0 ? "live" : "unknown"; + + const leaseAt = (ev: TimelineEvent): number => + ev.new_expiration_block !== null + ? Math.max(0, ev.new_expiration_block - ev.block_number) * blockTimeSeconds + : 0; + + for (const ev of events) { + if (ev.event_type === "created") { + const lease = leaseAt(ev); + points.push({ + tMs: ev.observed_at_ms, + leaseSeconds: lease, + source: "onchain", + eventType: "created", + txHash: ev.tx_hash, + label: `created · ${fmtLease(lease)} lease`, + }); + } else if (ev.event_type === "extended" || ev.event_type === "updated") { + const lease = leaseAt(ev); + const gained = + ev.new_expiration_block !== null && ev.old_expiration_block !== null + ? Math.max(0, ev.new_expiration_block - ev.old_expiration_block) * blockTimeSeconds + : 0; + points.push({ + tMs: ev.observed_at_ms, + leaseSeconds: lease, + source: "onchain", + eventType: "extended", + txHash: ev.tx_hash, + label: `cited · +${fmtLease(gained)} → ${fmtLease(lease)}`, + }); + } else if (ev.event_type === "expired" || ev.event_type === "deleted") { + points.push({ + tMs: ev.observed_at_ms, + leaseSeconds: 0, + source: "onchain", + eventType: "evicted", + txHash: ev.tx_hash, + label: ev.event_type === "expired" ? "evicted (lease lapsed)" : "deleted", + }); + state = "expired"; + } + } + + const last = points.length > 0 ? points[points.length - 1]! : null; + + // Committed-but-unanchored cites: optimistic act() enqueues extends that only + // become on-chain `extended` rows after the worker anchors them. Surface them as + // ONE projected step so the climb is real (committed local SEDM state) without + // faking per-cite chain history we don't have. + if (pendingSeconds > 0 && state !== "expired") { + const base = last ? last.leaseSeconds : 0; + points.push({ + tMs: nowMs, + leaseSeconds: base + pendingSeconds, + source: "projected", + eventType: "queued", + txHash: null, + label: `+${fmtLease(pendingSeconds)} queued (not yet anchored)`, + }); + } + + // Synthetic downslope: the "neglect → eviction" half of the story. A still-live + // memory has no eviction event yet, so we DRAW the projected decay to zero. + if (state !== "expired" && points.length > 0) { + const tail = points[points.length - 1]!; + points.push({ + tMs: tail.tMs + tail.leaseSeconds * 1_000, + leaseSeconds: 0, + source: "synthetic", + eventType: "neglect", + txHash: null, + label: "projected eviction if never cited again", + }); + } + + // A memory cited before its create has anchored has local points but no chain + // events — surface that as "queued", not "unknown" (the header sat above a + // populated curve while claiming no data existed — verify-debate MUST-FIX #2). + if (state === "unknown" && pendingSeconds > 0) state = "queued"; + + const estimated = points.some((p) => p.source !== "onchain"); + const note = + events.length === 0 + ? pendingSeconds > 0 + ? "Committed locally (optimistic) — not yet anchored on Braga; the climb is real, the chain catches up via the worker." + : "No events for this memory yet (not cited, or not this project)." + : estimated + ? "Solid = anchored on Braga; dashed = committed-local / projected decay." + : "Fully reconstructed from on-chain events."; + + return { entityKey, cortexId, points, state, estimated, note }; +} + +/** Sum the committed-but-unanchored extend seconds for one entity key. */ +function pendingSecondsFor(db: Awaited>, key: string): number { + let total = 0; + for (const ob of listPendingOutbox(db, 500)) { + for (const it of ob.bundle.reinforceItems) { + if (it.entityKey.toLowerCase() === key.toLowerCase()) total += it.reinforcementSeconds; + } + } + return total; +} + +export async function handleDecayTimelineRequest(req: Request): Promise { + const url = new URL(req.url); + const entityKey = url.searchParams.get("entityKey"); + const headers = { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" }; + + if (!entityKey || !/^0x[0-9a-fA-F]{64}$/.test(entityKey)) { + return new Response( + JSON.stringify({ error: "entityKey query param required (0x + 64 hex)" }), + { status: 400, headers }, + ); + } + + try { + const db = await initMirrorDb(); + const events = await getEventsForEntity(entityKey as Hex); + const pendingSeconds = pendingSecondsFor(db, entityKey); + const timeline = buildDecayTimeline({ + entityKey, + events, + pendingSeconds, + blockTimeSeconds: BRAGA.blockTimeSeconds, + nowMs: Date.now(), + }); + return new Response(JSON.stringify(timeline), { status: 200, headers }); + } catch (err) { + return new Response( + JSON.stringify({ error: err instanceof Error ? err.message : String(err) }), + { status: 500, headers }, + ); + } +} diff --git a/src/server/dispatch.ts b/src/server/dispatch.ts index cce8c37..3dc6375 100644 --- a/src/server/dispatch.ts +++ b/src/server/dispatch.ts @@ -18,6 +18,7 @@ import { import { handleSSE } from "../api/sse"; import { handleTopologyRequest } from "../topology/build-from-mirror"; import { handleManualCitation } from "../api/citation"; +import { handleDecayTimelineRequest } from "./decay-timeline"; import { handleAdoptRequest, handleAuthMe } from "../api/auth-adopt"; import { handleSeedRequest } from "../api/seed"; import { handleStoreFileRequest, handleStoreFilePrepareRequest } from "../api/store-file"; @@ -52,6 +53,7 @@ const ROUTES: Record = { "/api/listings": handleListingsRequest, "/api/economics": handleEconomicsRequest, "/api/decay": handleDecayRequest, + "/api/decay/timeline": handleDecayTimelineRequest, "/api/topology": handleTopologyRequest, "/api/auth/siwe/init": { POST: handleSiweInit }, "/api/auth/siwe/verify": { POST: handleSiweVerify }, diff --git a/tests/darwinian-citation.test.ts b/tests/darwinian-citation.test.ts index ddc241b..d4e62c0 100644 --- a/tests/darwinian-citation.test.ts +++ b/tests/darwinian-citation.test.ts @@ -22,8 +22,8 @@ import { test, expect, describe, beforeEach } from "bun:test"; import { Database } from "bun:sqlite"; import type { Hex } from "@arkiv-network/sdk"; import { act, getCitationStats } from "../src/darwinian/citation.ts"; -import { listPendingOutbox, countOutbox, type OutboxBundle } from "../src/mirror/db.ts"; -import { ENTITY_TYPE, REINFORCEMENT } from "../src/constants.ts"; +import { listPendingOutbox, countOutbox, setDaemonState, type OutboxBundle } from "../src/mirror/db.ts"; +import { ENTITY_TYPE, REINFORCEMENT, UTILITY } from "../src/constants.ts"; const FAKE_USER = "0xCAfeBABe00000000000000000000000000000000" as Hex; const KEY_A = "0xaaaa111111111111111111111111111111111111111111111111111111111111" as Hex; @@ -315,6 +315,142 @@ describe("act — tier promotion", () => { }); }); +describe("act — decay receipts", () => { + test("fresh memory (no chain baseline) → real delta, estimated=true, cortex:// id", async () => { + const db = await freshDb(); + const deps = makeDeps(db, [KEY_A]); + deps.entityTypes.set(KEY_A, "observation"); + + const r = await act({ + action: "decide", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + sessionId: "s1", + _deps: depBundle(deps), + }); + + expect(r.receipts).toHaveLength(1); + const rec = r.receipts[0]!; + expect(rec.id).toBe(`cortex://${KEY_A}`); + expect(rec.key).toBe(KEY_A); + // additive precompile: a first/unproven cite adds exactly the base lease. + expect(rec.deltaSecondsThisCite).toBe(REINFORCEMENT.workingReinforcementSeconds); + // no entities row → no chain-confirmed baseline → estimated. + expect(rec.estimated).toBe(true); + expect(rec.tier).toBe("observation"); + expect(rec.citationCountAfter).toBe(1); + expect(rec.outcomeApplied).toBe(UTILITY.defaultOutcome); + expect(rec.projectedLeaseSeconds).toBeGreaterThan(rec.deltaSecondsThisCite); + }); + + test("with a chain baseline AND a real cursor → estimated=false, lease folds in remaining", async () => { + const db = await freshDb(); + db.prepare( + "INSERT INTO entities (entity_key, owner, expires_at_block, first_seen_block, last_event_block, last_event_type) VALUES (?, ?, ?, ?, ?, ?)", + ).run(KEY_A, FAKE_USER, 100, 0, 0, "created"); + // A real chain cursor is required for the baseline to be usable. + setDaemonState(db, "last_processed_block", "50"); + const deps = makeDeps(db, [KEY_A]); + deps.entityTypes.set(KEY_A, "observation"); + + const r = await act({ + action: "decide", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + _deps: depBundle(deps), + }); + + const rec = r.receipts[0]!; + expect(rec.estimated).toBe(false); + // remaining = (100 - 50) * 2s = 100; + delta (base, first cite); pending = 0. + expect(rec.projectedLeaseSeconds).toBe(100 + REINFORCEMENT.workingReinforcementSeconds); + }); + + test("baseline row but stale/zero chain cursor → estimated=true, no absurd lease", async () => { + const db = await freshDb(); + // Real Braga expiry block (millions) but NO daemon_state row → headBlock = 0. + // The plugin-first product runs no sync daemon, so this is the common case; + // it must NOT render a multi-year lease as confirmed (the bug the audit caught). + db.prepare( + "INSERT INTO entities (entity_key, owner, expires_at_block, first_seen_block, last_event_block, last_event_type) VALUES (?, ?, ?, ?, ?, ?)", + ).run(KEY_A, FAKE_USER, 5_000_000, 0, 0, "created"); + const deps = makeDeps(db, [KEY_A]); + deps.entityTypes.set(KEY_A, "observation"); + + const r = await act({ + action: "decide", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + _deps: depBundle(deps), + }); + + const rec = r.receipts[0]!; + expect(rec.estimated).toBe(true); + expect(rec.projectedLeaseSeconds).toBeLessThan(REINFORCEMENT.semanticInitialSeconds); + }); + + test("outcome flows through to the evolved weight (utility-gated, not frozen 0.5)", async () => { + const lowDb = await freshDb(); + const lowDeps = makeDeps(lowDb, [KEY_A]); + lowDeps.entityTypes.set(KEY_A, "observation"); + const low = await act({ + action: "a", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + outcome: 0, + _deps: depBundle(lowDeps), + }); + + const hiDb = await freshDb(); + const hiDeps = makeDeps(hiDb, [KEY_A]); + hiDeps.entityTypes.set(KEY_A, "observation"); + const hi = await act({ + action: "a", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + outcome: 1, + _deps: depBundle(hiDeps), + }); + + expect(low.receipts[0]!.outcomeApplied).toBe(0); + expect(hi.receipts[0]!.outcomeApplied).toBe(1); + // A successful outcome evolves a higher utility weight than a failed one. + expect(hi.receipts[0]!.weightAfter).toBeGreaterThan(low.receipts[0]!.weightAfter); + }); + + test("proven memory earns a longer lease on its next cite (one-cite lag, by design)", async () => { + const db = await freshDb(); + const deps = makeDeps(db, [KEY_A]); + deps.entityTypes.set(KEY_A, "observation"); + const bundle = depBundle(deps); + + const r1 = await act({ + action: "first", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + outcome: 1, + sessionId: "s1", + _deps: bundle, + }); + const r2 = await act({ + action: "second", + citations: [KEY_A], + userPrimaryEOA: FAKE_USER, + outcome: 1, + sessionId: "s1", + _deps: bundle, + }); + + // First cite: lease scaled by prior weight = wInit → exactly base. + expect(r1.receipts[0]!.deltaSecondsThisCite).toBe(REINFORCEMENT.workingReinforcementSeconds); + // Second cite: prior weight is now the weight earned on cite 1 (> wInit) → + // the lease this cite is strictly larger. This IS the Darwinian effect. + expect(r2.receipts[0]!.deltaSecondsThisCite).toBeGreaterThan( + REINFORCEMENT.workingReinforcementSeconds, + ); + }); +}); + describe("act — input validation", () => { beforeEach(async () => { // no shared state; freshDb in each test diff --git a/tests/decay-timeline.test.ts b/tests/decay-timeline.test.ts new file mode 100644 index 0000000..1d6efb4 --- /dev/null +++ b/tests/decay-timeline.test.ts @@ -0,0 +1,131 @@ +/** + * Decay Receipt timeline builder — pure-function tests (no DB, no chain). + * + * Asserts the lease step-curve is derived correctly from the event log, the + * committed-local "queued" overlay and the synthetic neglect downslope are + * appended honestly, and an evicted memory terminates at zero with no synthetic + * tail. + */ + +import { test, expect, describe } from "bun:test"; +import { buildDecayTimeline } from "../src/server/decay-timeline.ts"; + +const KEY = "0xabc0000000000000000000000000000000000000000000000000000000000abc"; +const BT = 2; // BRAGA.blockTimeSeconds +const NOW = 1_000_000; + +function ev(over: Partial[0]["events"][number]>) { + return { + event_type: "created" as const, + block_number: 0, + old_expiration_block: null, + new_expiration_block: null, + tx_hash: null, + observed_at_ms: 0, + ...over, + }; +} + +describe("buildDecayTimeline", () => { + test("created → onchain lease point + synthetic downslope, estimated", () => { + const t = buildDecayTimeline({ + entityKey: KEY, + events: [ev({ event_type: "created", block_number: 1000, new_expiration_block: 2800, observed_at_ms: 100, tx_hash: "0xdead" })], + pendingSeconds: 0, + blockTimeSeconds: BT, + nowMs: NOW, + }); + expect(t.cortexId).toBe(`cortex://${KEY}`); + expect(t.state).toBe("live"); + // (2800-1000)*2 = 3600s lease at creation. + expect(t.points[0]!.leaseSeconds).toBe(3600); + expect(t.points[0]!.source).toBe("onchain"); + // synthetic neglect downslope appended, terminating at 0. + const tail = t.points[t.points.length - 1]!; + expect(tail.source).toBe("synthetic"); + expect(tail.leaseSeconds).toBe(0); + expect(t.estimated).toBe(true); + }); + + test("extended event steps the lease up (gain from old→new)", () => { + const t = buildDecayTimeline({ + entityKey: KEY, + events: [ + ev({ event_type: "created", block_number: 1000, new_expiration_block: 2800, observed_at_ms: 100 }), + ev({ event_type: "extended", block_number: 1100, old_expiration_block: 2800, new_expiration_block: 46000, observed_at_ms: 200, tx_hash: "0xbeef" }), + ], + pendingSeconds: 0, + blockTimeSeconds: BT, + nowMs: NOW, + }); + const extended = t.points.find((p) => p.eventType === "extended")!; + // lease at extend = (46000-1100)*2 = 89800; gain = (46000-2800)*2 = 86400. + expect(extended.leaseSeconds).toBe(89800); + expect(extended.label).toContain("+~1.0d"); // 86400s ≈ 1.0d + expect(extended.txHash).toBe("0xbeef"); + }); + + test("pending committed-local cites → one projected 'queued' step before the downslope", () => { + const t = buildDecayTimeline({ + entityKey: KEY, + events: [ev({ event_type: "created", block_number: 1000, new_expiration_block: 2800, observed_at_ms: 100 })], + pendingSeconds: 86_400, + blockTimeSeconds: BT, + nowMs: NOW, + }); + const queued = t.points.find((p) => p.eventType === "queued")!; + expect(queued.source).toBe("projected"); + // base lease (3600) + pending (86400). + expect(queued.leaseSeconds).toBe(3600 + 86_400); + expect(queued.txHash).toBeNull(); + // synthetic downslope still terminates the curve. + expect(t.points[t.points.length - 1]!.source).toBe("synthetic"); + }); + + test("evicted memory terminates at 0 with NO synthetic tail", () => { + const t = buildDecayTimeline({ + entityKey: KEY, + events: [ + ev({ event_type: "created", block_number: 1000, new_expiration_block: 2800, observed_at_ms: 100 }), + ev({ event_type: "expired", block_number: 2801, observed_at_ms: 300 }), + ], + pendingSeconds: 0, + blockTimeSeconds: BT, + nowMs: NOW, + }); + expect(t.state).toBe("expired"); + const tail = t.points[t.points.length - 1]!; + expect(tail.eventType).toBe("evicted"); + expect(tail.leaseSeconds).toBe(0); + expect(t.points.some((p) => p.source === "synthetic")).toBe(false); + }); + + test("no events and no pending → empty curve, unknown state, honest note", () => { + const t = buildDecayTimeline({ + entityKey: KEY, + events: [], + pendingSeconds: 0, + blockTimeSeconds: BT, + nowMs: NOW, + }); + expect(t.points).toHaveLength(0); + expect(t.state).toBe("unknown"); + expect(t.note).toContain("No events"); + }); + + test("cited before create anchored (events empty, pending>0) → state 'queued', not 'unknown'", () => { + // The optimistic-act() live demo path: header must not claim 'unknown'/'no data' + // while a populated curve renders below it (verify-debate MUST-FIX #2). + const t = buildDecayTimeline({ + entityKey: KEY, + events: [], + pendingSeconds: 86_400, + blockTimeSeconds: BT, + nowMs: NOW, + }); + expect(t.state).toBe("queued"); + expect(t.note).toContain("Committed locally"); + expect(t.points.find((p) => p.eventType === "queued")?.leaseSeconds).toBe(86_400); + expect(t.points[t.points.length - 1]!.source).toBe("synthetic"); + }); +}); diff --git a/tests/fixtures/rabitq-realdata-report.json b/tests/fixtures/rabitq-realdata-report.json index 6cab91d..416a12a 100644 --- a/tests/fixtures/rabitq-realdata-report.json +++ b/tests/fixtures/rabitq-realdata-report.json @@ -1,24 +1,24 @@ { - "generatedAt": "2026-05-27T21:20:08.292Z", + "generatedAt": "2026-06-10T18:13:51.568Z", "provider": "cohere", "corpusSize": 12, "embedDim": 1536, "packBytes": 198, "selfRecallScores": [ - 1.0004, - 1.0004, - 1.0002, + 1.0007, + 0.9998, 1.0001, - 0.9999, 1, + 1.0003, + 1.0004, 0.9997, 0.9997, 0.9998, 1.0004, 0.9997, - 1 + 1.0004 ], - "intraClusterMean": 0.2945, + "intraClusterMean": 0.2941, "interClusterMean": 0.1025, "cluster_gap_pass_count": 9, "recall3OnQuery": { @@ -30,22 +30,22 @@ ] }, "estimatorError": { - "rawCosine": 0.6298, - "rabitqEstimate": 0.6339, - "abs": 0.0041 + "rawCosine": 0.6296, + "rabitqEstimate": 0.634, + "abs": 0.0044 }, "encodeTimesMs": [ + 0.316, + 0.193, + 0.371, + 0.301, + 0.291, + 0.112, + 0.299, + 0.197, + 0.195, 0.157, - 0.15, - 0.083, - 0.187, - 0.216, - 0.075, - 0.216, - 0.239, - 0.284, - 0.069, - 0.151, - 0.154 + 0.103, + 0.149 ] } diff --git a/tests/loop-singleton.test.ts b/tests/loop-singleton.test.ts index b121a59..8c79fa8 100644 --- a/tests/loop-singleton.test.ts +++ b/tests/loop-singleton.test.ts @@ -17,6 +17,7 @@ import { handleLoopControl, _resetLoopSingleton, } from "../src/agent/loop-singleton"; +import { _resetConfigCache } from "../src/lib/cortex-config"; afterEach(() => { _resetLoopSingleton(); @@ -31,13 +32,26 @@ function controlReq(body: string): Request { } test("startSingletonLoop returns null with no USER_PRIMARY_ADDRESS (read-only)", () => { - const saved = process.env.USER_PRIMARY_ADDRESS; + // The owner resolves env → ~/.cortex/config.json. Deleting the env var alone + // is NOT isolation: a real config.json (from `cortex auth`) leaks the owner and + // the loop starts, failing this test. Isolate BOTH the env and the config file + // (via CORTEX_CONFIG_PATH + a cache reset) so "no owner" is truly simulated. + const savedAddr = process.env.USER_PRIMARY_ADDRESS; + const savedPk = process.env.CORTEX_USER_PRIVATE_KEY; + const savedCfg = process.env.CORTEX_CONFIG_PATH; delete process.env.USER_PRIMARY_ADDRESS; + delete process.env.CORTEX_USER_PRIVATE_KEY; // could derive an owner otherwise + process.env.CORTEX_CONFIG_PATH = "/nonexistent/cortex-test-no-config.json"; + _resetConfigCache(); _resetLoopSingleton(); try { expect(startSingletonLoop()).toBeNull(); } finally { - if (saved !== undefined) process.env.USER_PRIMARY_ADDRESS = saved; + if (savedAddr !== undefined) process.env.USER_PRIMARY_ADDRESS = savedAddr; + if (savedPk !== undefined) process.env.CORTEX_USER_PRIVATE_KEY = savedPk; + if (savedCfg !== undefined) process.env.CORTEX_CONFIG_PATH = savedCfg; + else delete process.env.CORTEX_CONFIG_PATH; + _resetConfigCache(); } }); diff --git a/tests/project-identity.test.ts b/tests/project-identity.test.ts new file mode 100644 index 0000000..7df60da --- /dev/null +++ b/tests/project-identity.test.ts @@ -0,0 +1,69 @@ +/** + * Cortex — project-identity normalization tests. + * + * The capture hook stamps a memory's `workspace` provenance from resolveProject(); + * the recall hook queries by that same value. If the two ever disagree, a memory + * captured under one id is silently never recalled. This pins the normalization + * for every git-remote shape so the shared module can't regress that contract. + */ + +import { test, expect, describe } from "bun:test"; +import { tmpdir } from "node:os"; +import { normalizeRemote, resolveProject } from "../src/lib/project-identity.ts"; + +describe("normalizeRemote", () => { + const cases: Array<[string, string | null]> = [ + // scp-style (the default GitHub SSH remote) + ["git@github.com:LingSiewWin/Cortex.git", "github.com/LingSiewWin/Cortex"], + ["git@github.com:LingSiewWin/Cortex", "github.com/LingSiewWin/Cortex"], + // https, with and without the trailing .git + ["https://github.com/LingSiewWin/Cortex.git", "github.com/LingSiewWin/Cortex"], + ["https://github.com/LingSiewWin/Cortex", "github.com/LingSiewWin/Cortex"], + // trailing slashes must not produce a different id than the bare form + ["https://github.com/LingSiewWin/Cortex/", "github.com/LingSiewWin/Cortex"], + ["https://github.com/LingSiewWin/Cortex.git/", "github.com/LingSiewWin/Cortex"], + // ssh:// url form, and with an explicit port + ["ssh://git@github.com/LingSiewWin/Cortex.git", "github.com/LingSiewWin/Cortex"], + ["ssh://git@github.com:22/LingSiewWin/Cortex.git", "github.com/LingSiewWin/Cortex"], + // nested groups (GitLab subgroups) + ["git@gitlab.example.com:group/sub/repo.git", "gitlab.example.com/group/sub/repo"], + // custom self-hosted host + ["https://git.acme.io/team/proj", "git.acme.io/team/proj"], + // empty / junk + ["", null], + [" ", null], + ]; + + for (const [input, expected] of cases) { + test(`"${input}" → ${expected === null ? "null" : `"${expected}"`}`, () => { + expect(normalizeRemote(input)).toBe(expected); + }); + } + + test("the same repo via ssh and https normalizes identically", () => { + const ssh = normalizeRemote("git@github.com:LingSiewWin/Cortex.git"); + const https = normalizeRemote("https://github.com/LingSiewWin/Cortex.git"); + expect(ssh).toBe(https!); + }); +}); + +describe("resolveProject", () => { + test("falls back to the directory basename for a non-git path", () => { + // tmpdir() is (almost certainly) not a git repo, so we exercise the fallback. + const id = resolveProject(tmpdir()); + expect(typeof id).toBe("string"); + expect(id.length).toBeGreaterThan(0); + }); + + test("never returns empty, even for a nonexistent path", () => { + const id = resolveProject("/nonexistent/path/that/does/not/exist"); + expect(id.length).toBeGreaterThan(0); + }); + + test("resolves THIS repo to its github origin (capture/recall agree)", () => { + // Run inside the repo; both hooks call the exact same function, so whatever + // this returns is what capture stamps AND what recall queries. + const id = resolveProject(import.meta.dir + "/.."); + expect(id).toContain("/"); + }); +}); diff --git a/ui/components/DecayReceipt.tsx b/ui/components/DecayReceipt.tsx new file mode 100644 index 0000000..6904ad1 --- /dev/null +++ b/ui/components/DecayReceipt.tsx @@ -0,0 +1,157 @@ +"use client"; + +import type { DecayTimelineResponse, DecayPoint } from "@/src/server/decay-timeline"; + +/** + * Decay Receipt — a memory's lease over its life, as an inline-SVG step curve. + * No charting dependency. Solid = anchored on-chain; dashed = committed-local + * ("queued") or the synthetic projected-eviction downslope. The curve climbs on + * each citation and decays to zero on neglect — the Darwinian story, drawn. + */ + +const ACCENT = "#ff5a00"; +const AMBER = "#f0b429"; +const DASH = "#8a8f98"; +const W = 720; +const H = 280; +const PAD = { top: 28, right: 24, bottom: 56, left: 64 }; + +function fmtLease(s: number): string { + if (s <= 0) return "0"; + if (s >= 86_400) return `${(s / 86_400).toFixed(1)}d`; + if (s >= 3_600) return `${Math.round(s / 3_600)}h`; + return `${Math.max(1, Math.round(s / 60))}m`; +} + +export default function DecayReceipt({ data }: { data: DecayTimelineResponse }) { + const pts = data.points; + if (pts.length === 0) { + return ( +
+ {data.note} +
+ ); + } + + const innerW = W - PAD.left - PAD.right; + const innerH = H - PAD.top - PAD.bottom; + const maxLease = Math.max(...pts.map((p) => p.leaseSeconds), 1); + // Index-based x so real events stay readable even when the synthetic eviction + // point projects far into the future (time-based x would bunch them at the left). + const x = (i: number) => PAD.left + (pts.length === 1 ? innerW / 2 : (i / (pts.length - 1)) * innerW); + const y = (lease: number) => PAD.top + innerH - (lease / maxLease) * innerH; + + const dotColor = (p: DecayPoint) => + p.source === "onchain" ? ACCENT : p.source === "projected" ? AMBER : DASH; + + // Split each step into a HOLD (horizontal, coloured by where it comes FROM) and + // a JUMP (vertical, coloured by where it goes TO). Keying solidity off the hold's + // own provenance means the climb OUT of a real on-chain point renders SOLID — so + // the "solid = anchored, dashed = projected" story is visible in the live + // created→cite demo (verify-debate MUST-FIX #1). The neglect segment into a + // synthetic point is a diagonal SLOPE (gradual decay), not a hold-then-cliff. + interface Seg { + d: string; + stroke: string; + dashed: boolean; + } + function segments(): Seg[] { + const segs: Seg[] = []; + for (let i = 1; i < pts.length; i++) { + const a = pts[i - 1]!; + const b = pts[i]!; + if (b.source === "synthetic") { + // projected neglect: slope down from a's lease to zero. + segs.push({ + d: `M ${x(i - 1)} ${y(a.leaseSeconds)} L ${x(i)} ${y(b.leaseSeconds)}`, + stroke: DASH, + dashed: true, + }); + continue; + } + segs.push({ + d: `M ${x(i - 1)} ${y(a.leaseSeconds)} L ${x(i)} ${y(a.leaseSeconds)}`, + stroke: dotColor(a), + dashed: a.source !== "onchain", + }); + segs.push({ + d: `M ${x(i)} ${y(a.leaseSeconds)} L ${x(i)} ${y(b.leaseSeconds)}`, + stroke: dotColor(b), + dashed: b.source !== "onchain", + }); + } + return segs; + } + + return ( +
+
+ {data.cortexId}{" "} + + · {data.state} + {data.estimated ? " · projection (est.)" : " · on-chain"} + +
+ + + {/* y-axis ticks */} + {[0, 0.5, 1].map((f) => { + const yy = PAD.top + innerH - f * innerH; + return ( + + + + {fmtLease(maxLease * f)} + + + ); + })} + + {/* step curve */} + {segments().map((s, i) => ( + + ))} + + {/* points */} + {pts.map((p, i) => ( + + + {p.eventType === "evicted" || p.eventType === "neglect" ? ( + + ) : null} + + ))} + + + {/* legend / step labels */} +
    + {pts.map((p, i) => ( +
  1. + ● {p.label} + {p.txHash ? ( + <> + {" · "} + + tx ↗ + + + ) : null} +
  2. + ))} +
+

{data.note}

+
+ ); +} diff --git a/ui/components/WalletUpload.tsx b/ui/components/WalletUpload.tsx index 8e0450c..7bc810e 100644 --- a/ui/components/WalletUpload.tsx +++ b/ui/components/WalletUpload.tsx @@ -65,7 +65,7 @@ interface WalletUploadProps { export function WalletUpload({ onStored, onInspectKey }: WalletUploadProps) { const { isConnected } = useAccount(); - const { upload, step, error, lastTx, lastEntityKey, identity } = useBrowserUpload(); + const { upload, step, error, lastTx, lastEntityKey, lastGas, identity } = useBrowserUpload(); const { quote, prepared, @@ -303,6 +303,13 @@ export function WalletUpload({ onStored, onInspectKey }: WalletUploadProps) { {" · "} graph refreshes in a few seconds

+ {lastGas ? ( +

+ ⛽ your wallet burned{" "} + {Number(lastGas.feeGlm).toFixed(8)} GLM ·{" "} + {Number(lastGas.gasUsed).toLocaleString()} gas @ {Number(lastGas.effectiveGasPriceGwei).toFixed(4)} gwei +

+ ) : null} {lastEntityKey ? (

memory key{" "} diff --git a/ui/console.tsx b/ui/console.tsx index b25a3d9..acbb973 100644 --- a/ui/console.tsx +++ b/ui/console.tsx @@ -276,6 +276,11 @@ function ConsoleApp() { }, [loopConfigured, data.memories]); if (noLiveBackend) { + // Public serverless deploy: no loop, empty mirror. Still show the wallet + // upload — the browser-signed write path (connect → sign → pay GLM gas → + // measured receipt) needs no backend state, only the embedding key for + // /api/store-file/prepare. Without this, the deployed console had NO + // connect-wallet button at all and the on-camera gas proof was unreachable. return (

@@ -290,8 +295,17 @@ function ConsoleApp() {
local-first +
+ +
+ +
+
@@ -592,6 +606,18 @@ function ConsoleApp() { key {inspected.summary.entityKey}
+
owner diff --git a/ui/decay-receipt-page.tsx b/ui/decay-receipt-page.tsx new file mode 100644 index 0000000..b024c0d --- /dev/null +++ b/ui/decay-receipt-page.tsx @@ -0,0 +1,61 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { useParams } from "next/navigation"; +import DecayReceipt from "./components/DecayReceipt"; +import type { DecayTimelineResponse } from "@/src/server/decay-timeline"; + +/** + * /decay/ — the Decay Receipt page. Reads the entity key from the + * route, fetches the lease timeline, and renders the curve. The API is a query + * param (/api/decay/timeline?entityKey=…) because the dispatch router is + * exact-string match, not path-param. + */ +export default function DecayReceiptPage() { + const params = useParams<{ entityKey: string }>(); + const entityKey = Array.isArray(params?.entityKey) ? params.entityKey[0] : params?.entityKey; + const [data, setData] = useState(null); + const [error, setError] = useState(null); + + useEffect(() => { + if (!entityKey) return; + let alive = true; + setData(null); + setError(null); + fetch(`/api/decay/timeline?entityKey=${encodeURIComponent(entityKey)}`) + .then(async (r) => { + // Robust parse: a non-JSON 5xx (proxy/HTML) must surface the status, not a + // cryptic "Unexpected token" from r.json(). + const text = await r.text(); + let j: (DecayTimelineResponse & { error?: string }) | null = null; + try { + j = text ? (JSON.parse(text) as DecayTimelineResponse & { error?: string }) : null; + } catch { + /* non-JSON body */ + } + if (!r.ok || !j) throw new Error(j?.error ?? `${r.status} ${r.statusText}`); + if (alive) setData(j); + }) + .catch((e) => alive && setError(e instanceof Error ? e.message : String(e))); + return () => { + alive = false; + }; + }, [entityKey]); + + return ( +
+

Decay Receipt

+

+ One memory's lease over its life — climbs when cited, decays on neglect, evicts for + free on Arkiv. Useful memory earns its keep. +

+ {error ? ( +

Could not load timeline: {error}

+ ) : !data ? ( +

Loading…

+ ) : ( + + )} +
+ ); +}