From 4a1a8c45957656d922fc53db4a4814c70b5f44bc Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 14 Sep 2026 19:08:10 -0700 Subject: [PATCH 01/30] separate viem + ethers, add viem extend() --- .changeset/viem-first-sdk.md | 59 + .github/workflows/ci.yml | 95 + .github/workflows/on-create-release.yml | 41 +- MIGRATION.md | 227 + README.md | 68 +- biome.json | 13 +- .../vite-wagmi-ethers-rainbowkit/package.json | 62 +- .../vite-wagmi-ethers-rainbowkit/polyfills.ts | 4 +- .../vite-wagmi-ethers-rainbowkit/src/App.tsx | 9 +- .../tsconfig.json | 2 +- .../vite.config.ts | 3 - examples/vite-wagmi-ethers/package.json | 62 +- examples/vite-wagmi-ethers/polyfills.ts | 4 +- examples/vite-wagmi-ethers/src/App.tsx | 9 +- .../src/hooks/useEthersSigner.ts | 5 +- examples/vite-wagmi-ethers/tsconfig.json | 2 +- examples/vite-wagmi-ethers/vite.config.ts | 3 - examples/vite-wagmi-ethers6/package.json | 60 +- examples/vite-wagmi-ethers6/polyfills.ts | 4 +- examples/vite-wagmi-ethers6/src/App.tsx | 9 +- .../src/hooks/useEthers6Signer.ts | 5 +- examples/vite-wagmi-ethers6/tsconfig.json | 2 +- examples/vite-wagmi-ethers6/vite.config.ts | 3 - examples/vite-wagmi-viem/package.json | 59 +- examples/vite-wagmi-viem/polyfills.ts | 4 +- examples/vite-wagmi-viem/src/App.tsx | 38 +- examples/vite-wagmi-viem/tsconfig.json | 2 +- examples/vite-wagmi-viem/vite.config.ts | 3 - package.json | 41 +- packages/ethers/README.md | 102 + packages/ethers/package.json | 68 + packages/ethers/src/TokenboundClient.ts | 422 + packages/ethers/src/adapter.ts | 89 + packages/ethers/src/detect.ts | 45 + packages/ethers/src/index.ts | 24 + packages/ethers/src/test/adapter.test.ts | 144 + packages/ethers/src/test/constants.ts | 17 + packages/ethers/src/test/integration.test.ts | 317 + packages/ethers/src/test/transfer.test.ts | 175 + packages/ethers/src/test/v2.test.ts | 256 + packages/ethers/src/types.ts | 46 + packages/ethers/src/v5/adapter.ts | 17 + packages/ethers/src/v6/adapter.ts | 16 + packages/ethers/tsconfig.json | 20 + packages/ethers/vite.config.ts | 31 + packages/ethers/vitest.config.ts | 16 + packages/sdk/package.json | 74 +- packages/sdk/src/TokenboundClient.ts | 582 +- packages/sdk/src/functions/index.ts | 3 - packages/sdk/src/index.ts | 120 +- .../sdk/{ => src/protocol}/abis/ERC1155.ts | 0 packages/sdk/{ => src/protocol}/abis/ERC20.ts | 0 .../protocol}/abis/ERC6551RegistryV2.json | 0 .../sdk/{ => src/protocol}/abis/ERC721.ts | 0 .../protocol}/abis/IERC6551AccountV2.json | 0 .../protocol}/abis/MultiCallAuthenticated.ts | 0 packages/sdk/src/protocol/abis/erc6551V3.ts | 627 + packages/sdk/{ => src/protocol}/abis/index.ts | 22 +- .../{ => protocol}/constants/crossChain.ts | 0 .../constants/eip1167Implementation.ts | 0 .../sdk/src/{ => protocol}/constants/index.ts | 6 +- .../{ => protocol}/constants/interfaces.ts | 0 .../src/{ => protocol}/constants/multicall.ts | 0 .../constants/tokenboundAddresses.ts | 12 +- packages/sdk/src/protocol/core.ts | 313 + .../{ => protocol}/functions/crossChain.ts | 20 +- packages/sdk/src/protocol/functions/index.ts | 3 + .../viemV2.ts => protocol/functions/v2.ts} | 29 +- .../viemV3.ts => protocol/functions/v3.ts} | 114 +- packages/sdk/src/protocol/index.ts | 9 + packages/sdk/src/protocol/transfers.ts | 95 + packages/sdk/src/test/TestAll.test.ts | 1805 +- packages/sdk/src/test/config/setup.ts | 1 - packages/sdk/src/test/config/shell.ts | 7 - packages/sdk/src/test/constants/anvil.ts | 2 +- packages/sdk/src/test/mockWallet.tsx | 46 - packages/sdk/src/test/unit/protocol.test.ts | 332 + .../sdk/src/test/unit/viemExtension.test-d.ts | 138 + .../sdk/src/test/unit/viemExtension.test.ts | 246 + packages/sdk/src/test/utils/clients.ts | 22 +- packages/sdk/src/test/utils/debug.ts | 5 +- packages/sdk/src/test/utils/getAnvilLogs.ts | 10 - packages/sdk/src/test/utils/getWETHBalance.ts | 6 +- .../sdk/src/test/utils/getZora1155Balance.ts | 4 +- .../sdk/src/test/utils/getZora721Balance.ts | 6 +- packages/sdk/src/test/utils/index.ts | 4 +- packages/sdk/src/test/utils/shellCommand.ts | 26 - .../sdk/src/types/abstractEthersSigner.ts | 7 - .../abstractEthersTransactionResponse.ts | 7 - packages/sdk/src/types/index.ts | 5 +- packages/sdk/src/types/messages.ts | 14 - packages/sdk/src/types/params.ts | 19 +- .../src/utils/chainIdToChain.testDISABLED.ts | 18 - packages/sdk/src/utils/chainIdToChain.ts | 54 - .../sdk/src/utils/getImplementationName.ts | 2 +- packages/sdk/src/utils/index.ts | 3 - packages/sdk/src/utils/messageTypeguards.ts | 28 - .../sdk/src/utils/normalizeEthersMessage.ts | 19 - packages/sdk/src/utils/resolvePossibleENS.ts | 14 +- packages/sdk/src/viem/actions.ts | 452 + packages/sdk/src/viem/index.ts | 31 + packages/sdk/src/viem/tokenboundActions.ts | 155 + packages/sdk/tsconfig.json | 2 +- packages/sdk/tsconfig.test.json | 10 + packages/sdk/vite.config.ts | 67 +- packages/sdk/vitest.config.ts | 14 +- packages/sdk/wagmi.config.ts | 2 +- pnpm-lock.yaml | 19392 ++++++++-------- scripts/validate-package-contents.mjs | 94 + tsconfig.json | 2 +- 110 files changed, 15884 insertions(+), 11919 deletions(-) create mode 100644 .changeset/viem-first-sdk.md create mode 100644 .github/workflows/ci.yml create mode 100644 MIGRATION.md create mode 100644 packages/ethers/README.md create mode 100644 packages/ethers/package.json create mode 100644 packages/ethers/src/TokenboundClient.ts create mode 100644 packages/ethers/src/adapter.ts create mode 100644 packages/ethers/src/detect.ts create mode 100644 packages/ethers/src/index.ts create mode 100644 packages/ethers/src/test/adapter.test.ts create mode 100644 packages/ethers/src/test/constants.ts create mode 100644 packages/ethers/src/test/integration.test.ts create mode 100644 packages/ethers/src/test/transfer.test.ts create mode 100644 packages/ethers/src/test/v2.test.ts create mode 100644 packages/ethers/src/types.ts create mode 100644 packages/ethers/src/v5/adapter.ts create mode 100644 packages/ethers/src/v6/adapter.ts create mode 100644 packages/ethers/tsconfig.json create mode 100644 packages/ethers/vite.config.ts create mode 100644 packages/ethers/vitest.config.ts delete mode 100644 packages/sdk/src/functions/index.ts rename packages/sdk/{ => src/protocol}/abis/ERC1155.ts (100%) rename packages/sdk/{ => src/protocol}/abis/ERC20.ts (100%) rename packages/sdk/{ => src/protocol}/abis/ERC6551RegistryV2.json (100%) rename packages/sdk/{ => src/protocol}/abis/ERC721.ts (100%) rename packages/sdk/{ => src/protocol}/abis/IERC6551AccountV2.json (100%) rename packages/sdk/{ => src/protocol}/abis/MultiCallAuthenticated.ts (100%) create mode 100644 packages/sdk/src/protocol/abis/erc6551V3.ts rename packages/sdk/{ => src/protocol}/abis/index.ts (70%) rename packages/sdk/src/{ => protocol}/constants/crossChain.ts (100%) rename packages/sdk/src/{ => protocol}/constants/eip1167Implementation.ts (100%) rename packages/sdk/src/{ => protocol}/constants/index.ts (100%) rename packages/sdk/src/{ => protocol}/constants/interfaces.ts (100%) rename packages/sdk/src/{ => protocol}/constants/multicall.ts (100%) rename packages/sdk/src/{ => protocol}/constants/tokenboundAddresses.ts (86%) create mode 100644 packages/sdk/src/protocol/core.ts rename packages/sdk/src/{ => protocol}/functions/crossChain.ts (80%) create mode 100644 packages/sdk/src/protocol/functions/index.ts rename packages/sdk/src/{functions/viemV2.ts => protocol/functions/v2.ts} (93%) rename packages/sdk/src/{functions/viemV3.ts => protocol/functions/v3.ts} (52%) create mode 100644 packages/sdk/src/protocol/index.ts create mode 100644 packages/sdk/src/protocol/transfers.ts delete mode 100644 packages/sdk/src/test/config/setup.ts delete mode 100644 packages/sdk/src/test/config/shell.ts delete mode 100644 packages/sdk/src/test/mockWallet.tsx create mode 100644 packages/sdk/src/test/unit/protocol.test.ts create mode 100644 packages/sdk/src/test/unit/viemExtension.test-d.ts create mode 100644 packages/sdk/src/test/unit/viemExtension.test.ts delete mode 100644 packages/sdk/src/test/utils/getAnvilLogs.ts delete mode 100644 packages/sdk/src/test/utils/shellCommand.ts delete mode 100644 packages/sdk/src/types/abstractEthersSigner.ts delete mode 100644 packages/sdk/src/types/abstractEthersTransactionResponse.ts delete mode 100644 packages/sdk/src/types/messages.ts delete mode 100644 packages/sdk/src/utils/chainIdToChain.testDISABLED.ts delete mode 100644 packages/sdk/src/utils/chainIdToChain.ts delete mode 100644 packages/sdk/src/utils/messageTypeguards.ts delete mode 100644 packages/sdk/src/utils/normalizeEthersMessage.ts create mode 100644 packages/sdk/src/viem/actions.ts create mode 100644 packages/sdk/src/viem/index.ts create mode 100644 packages/sdk/src/viem/tokenboundActions.ts create mode 100644 packages/sdk/tsconfig.test.json create mode 100755 scripts/validate-package-contents.mjs diff --git a/.changeset/viem-first-sdk.md b/.changeset/viem-first-sdk.md new file mode 100644 index 0000000..14bce15 --- /dev/null +++ b/.changeset/viem-first-sdk.md @@ -0,0 +1,59 @@ +--- +"@tokenbound/sdk": major +"@tokenbound/ethers": minor +--- + +Make `@tokenbound/sdk` viem-first and move ethers v5/v6 support into a new +`@tokenbound/ethers` package. + +**`@tokenbound/sdk`** + +- Removed the `signer` option and all ethers-specific types, utilities and + runtime branches. The SDK no longer has ethers anywhere in its dependency + graph. +- Added an idiomatic viem client decorator: `.extend(tokenboundActions())` + exposes the API under `client.tokenbound.*`, with write actions typed only for + clients that carry an account. +- Extracted a library-independent protocol layer (`@tokenbound/sdk/protocol`) + that operates on `Address`/`Hex`/`bigint`/chain ids/ABIs, shared by the viem + core and `@tokenbound/ethers`. +- **Breaking:** `chain` is now required; passing only `chainId` is no longer + supported. The internal `chainIdToChain` lookup eagerly imported 17 chains + from `viem/chains` into every consumer bundle. +- **Breaking:** the constructor `chainId` option is removed; the chain id now + always comes from `chain`. Per-method `chainId` params (cross-chain execution, + deriving an account for another chain) are unchanged. +- **Breaking:** `signMessage` accepts only viem's `SignableMessage`. +- Added `./viem` and `./protocol` subpath exports and `"sideEffects": false`. +- Relocated the ERC-6551 ABIs out of the test tree, so generated test fixtures + (Zora, WETH) no longer end up in the published bundle. +- Bundle: 251.7 kB → 15.9 kB (74.5 kB → 3.8 kB gzipped). Published tarball: + 226.2 kB → ~80 kB. Bundle analysis is now opt-in (`ANALYZE=true pnpm build`) + and no longer writes a 668 kB `stats.html` into `dist/`. + +**`@tokenbound/ethers`** (new) + +- Ethers v5 and v6 compatibility, detected automatically at construction. +- Same public API as the SDK's `TokenboundClient`, so ethers users migrate by + changing the import and passing a `chain`. +- Reuses all ERC-6551 protocol logic from `@tokenbound/sdk`; no duplication. + +**Examples** + +- Updated the viem example to the `.extend(tokenboundActions())` API, and + repointed the ethers examples at `@tokenbound/ethers`. +- Bumped the examples to Vite 5. Vite 4 bundles esbuild 0.18, which cannot parse + the import attributes (`with { type: "json" }`) used by `@base-org/account` via + wagmi's connectors, so `vite dev` failed to start. + +**Packaging / tooling** + +- Added `description`, `keywords`, `repository`, `homepage` and `bugs` to both + packages — none were previously set, so npm had no linked source or issues. +- Dropped unused React/testing-library devDependencies from `@tokenbound/sdk` + (no React components or DOM tests remain) and removed the dead jest-dom test + setup file. +- Switched `moduleResolution` from the deprecated `Node` (node10, removed in + TypeScript 7) to `Bundler`, which also resolves the package `exports` map. + +See `MIGRATION.md` for full migration notes. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..9662a4e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,95 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + build-and-validate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint and format check + run: pnpm biome ci . + + - name: Typecheck @tokenbound/sdk + run: pnpm --filter @tokenbound/sdk exec tsc --noEmit + + - name: Build @tokenbound/sdk + run: pnpm --filter @tokenbound/sdk build + + - name: Typecheck @tokenbound/ethers + run: pnpm --filter @tokenbound/ethers exec tsc --noEmit + + - name: Build @tokenbound/ethers + run: pnpm --filter @tokenbound/ethers build + + # Fails if tests, examples, stats.html, coverage or raw sources would be + # published, and reports packed/unpacked sizes so regressions are visible. + - name: Validate published package contents + run: node scripts/validate-package-contents.mjs + + - name: Assert @tokenbound/sdk pulls in no ethers + run: | + if pnpm --filter @tokenbound/sdk why ethers 2>/dev/null | grep -q 'ethers@'; then + echo "::error::@tokenbound/sdk must not depend on ethers" + pnpm --filter @tokenbound/sdk why ethers + exit 1 + fi + echo "✓ @tokenbound/sdk has no ethers in its dependency graph" + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + version: 10 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build @tokenbound/sdk + run: pnpm --filter @tokenbound/sdk build + + # Deterministic protocol + viem extension tests, including the + # type-level assertions (expectTypeOf) for the .extend() surface. + - name: Unit and type tests (@tokenbound/sdk) + run: pnpm --filter @tokenbound/sdk exec vitest --watch=false --typecheck run src/test/unit/ + + # ethers v5 and v6 are exercised independently, each against its own fork, + # across both the ERC-6551 V2 (legacy) and V3 deployments. The suites run + # as separate vitest processes because ethers caches nonces per provider. + - name: Ethers v5/v6 tests (@tokenbound/ethers) + run: pnpm --filter @tokenbound/ethers test + env: + VITE_ANVIL_MAINNET_FORK_ENDPOINT: ${{ secrets.VITE_ANVIL_MAINNET_FORK_ENDPOINT }} + + # Anvil-backed viem integration suite. + - name: Integration tests (@tokenbound/sdk) + run: pnpm --filter @tokenbound/sdk test + env: + VITE_ANVIL_MAINNET_FORK_ENDPOINT: ${{ secrets.VITE_ANVIL_MAINNET_FORK_ENDPOINT }} diff --git a/.github/workflows/on-create-release.yml b/.github/workflows/on-create-release.yml index 8c47971..6f832b2 100644 --- a/.github/workflows/on-create-release.yml +++ b/.github/workflows/on-create-release.yml @@ -7,9 +7,6 @@ on: jobs: publish: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18] steps: - name: Clone repository uses: actions/checkout@v4 @@ -17,27 +14,35 @@ jobs: ref: 'main' # Ensure we're on the main branch - name: Set up PNPM - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v4 with: - version: 8 + version: 10 - - name: Set up Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Set up Node.js + uses: actions/setup-node@v4 with: - node-version: ${{ matrix.node-version }} + node-version: 20 registry-url: 'https://registry.npmjs.org' + cache: pnpm - # Navigate to the specific package directory within the monorepo - - name: Change to package directory - run: cd packages/sdk + - name: Install dependencies + run: pnpm install --frozen-lockfile - # - name: Install dependencies - # run: pnpm install - - name: Clean install and build 🔧 - run: cd packages/sdk && pnpm i --force --frozen-lockfile && pnpm build - # run: pnpm ci && pnpm build // pnpm ci not yet implemented: https://github.com/pnpm/pnpm/issues/6100 + # @tokenbound/ethers depends on @tokenbound/sdk, so the SDK builds first. + - name: Build packages 🔧 + run: | + pnpm --filter @tokenbound/sdk build + pnpm --filter @tokenbound/ethers build - - name: Publish package on NPM 📦 - run: cd packages/sdk && pnpm publish --publish-branch main --access public + - name: Validate published package contents + run: node scripts/validate-package-contents.mjs + + - name: Publish @tokenbound/sdk 📦 + run: pnpm --filter @tokenbound/sdk publish --publish-branch main --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + + - name: Publish @tokenbound/ethers 📦 + run: pnpm --filter @tokenbound/ethers publish --publish-branch main --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..bdca7db --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,227 @@ +# Migration Guide + +This release makes `@tokenbound/sdk` **viem-first** and moves all ethers v5/v6 +support into a new `@tokenbound/ethers` package. + +```text +before after +────── ───── +@tokenbound/sdk + viem → @tokenbound/sdk +@tokenbound/sdk + ethers5 → @tokenbound/ethers +@tokenbound/sdk + ethers6 → @tokenbound/ethers +``` + +`@tokenbound/sdk` no longer has ethers anywhere in its dependency graph, and no +longer imports every chain from `viem/chains`. + +--- + +## Summary of breaking changes + +| # | Change | Who is affected | +|---|--------|-----------------| +| 1 | `signer` option removed from `@tokenbound/sdk` | ethers users | +| 2 | `chain` is now **required**; the constructor `chainId` option is removed | everyone | +| 3 | Ethers message types removed from the SDK's public types | ethers users | +| 4 | `signMessage` accepts only viem's `SignableMessage` | viem users passing raw bytes | +| 5 | Cross-chain `execute` is viem-only | ethers users using cross-chain | +| 6 | Package entry points changed (`dist/index.js`, subpath exports) | deep-importers | + +Everything else — method names, parameter shapes, return values — is unchanged. + +--- + +## 1. Current `@tokenbound/sdk` + viem → new `@tokenbound/sdk` + +### The class API still works + +```diff + import { TokenboundClient } from "@tokenbound/sdk" ++ import { mainnet } from "viem/chains" + + const tokenboundClient = new TokenboundClient({ + walletClient, +- chainId: 1, ++ chain: mainnet, + }) +``` + +`chain` is now required. Previously the SDK mapped a bare `chainId` to a viem +`Chain` via an internal lookup table that eagerly imported **17 chains** from +`viem/chains` — that table is gone, and with it a significant chunk of every +consumer bundle. Import the chain you need and pass it in. + +The constructor-level `chainId` option is gone too. It previously let you +override the chain id used for derivation independently of the client's chain; +now the chain id always comes from `chain`. Per-method `chainId` parameters are +unchanged — `getAccount({ …, chainId })` still derives an account for another +chain, and `execute({ …, chainId })` still targets a cross-chain destination: + +```diff + const tokenboundClient = new TokenboundClient({ + walletClient, + chain: mainnet, +- chainId: 8453, // no longer accepted + }) + + // still supported — derive for a different chain: + tokenboundClient.getAccount({ tokenContract, tokenId, chainId: 8453 }) +``` + +If you only have a numeric chain id at runtime, map it yourself: + +```ts +import * as chains from "viem/chains" + +const chain = Object.values(chains).find((c) => c.id === myChainId) +``` + +### New: the viem `.extend()` API (recommended) + +```ts +import { createWalletClient, custom } from "viem" +import { mainnet } from "viem/chains" +import { tokenboundActions } from "@tokenbound/sdk/viem" + +const client = createWalletClient({ + chain: mainnet, + transport: custom(window.ethereum), + account, +}).extend(tokenboundActions()) + +const account = client.tokenbound.getAccount({ tokenContract, tokenId }) +await client.tokenbound.createAccount({ tokenContract, tokenId }) +await client.tokenbound.execute({ account, to, value, data }) +``` + +Everything is namespaced under `.tokenbound` so it can't collide with viem's own +actions or other decorators. Public clients are typed with the read-only subset +(no `execute`, `createAccount`, …); clients carrying an account get the full set. + +`tokenboundActions()` optionally pins a deployment: + +```ts +.extend(tokenboundActions({ version: TBVersion.V2 })) +.extend(tokenboundActions({ implementationAddress, registryAddress })) +``` + +### `signMessage` is stricter + +`signMessage` now accepts only viem's `SignableMessage` (`string | { raw }`). +Passing a bare `Uint8Array` or `ArrayLike` was already a runtime error; +it is now also a compile error. + +```diff +- tokenboundClient.signMessage({ message: new Uint8Array([1, 2, 3]) }) ++ tokenboundClient.signMessage({ message: { raw: new Uint8Array([1, 2, 3]) } }) +``` + +--- + +## 2. Current `@tokenbound/sdk` + ethers v5 → `@tokenbound/ethers` + +```bash +npm install @tokenbound/ethers +``` + +```diff +- import { TokenboundClient } from "@tokenbound/sdk" ++ import { TokenboundClient } from "@tokenbound/ethers" ++ import { mainnet } from "viem/chains" + + const tokenboundClient = new TokenboundClient({ + signer, +- chainId: 1, ++ chain: mainnet, + }) +``` + +That is the whole migration. Method names, parameters and return values are +unchanged, and ethers v5 `Signer` objects are accepted exactly as before. + +--- + +## 3. Current `@tokenbound/sdk` + ethers v6 → `@tokenbound/ethers` + +Identical to the v5 migration — the same import change and the same `chain` +requirement. The package detects which ethers major version your signer comes +from and adapts automatically: + +```ts +tokenboundClient.getEthersVersion() // 5 | 6 +``` + +You do **not** need to migrate from ethers v5 to v6. Both are supported and +tested independently. + +--- + +## 4. Removed from `@tokenbound/sdk`'s public API + +These moved to `@tokenbound/ethers` or were deleted: + +| Removed | Replacement | +|---------|-------------| +| `TokenboundClientOptions.signer` | `@tokenbound/ethers`'s `TokenboundClient` | +| `AbstractEthersSigner` | internal to `@tokenbound/ethers` | +| `AbstractEthersTransactionResponse` | internal to `@tokenbound/ethers` | +| `EthersSignableMessage` | `EthersSignableMessage` from `@tokenbound/ethers` | +| `Ethers5SignableMessage` / `Ethers6SignableMessage` | same, from `@tokenbound/ethers` | +| `UniversalSignableMessage` | viem's `SignableMessage` | +| `isEthers5SignableMessage` / `isEthers6SignableMessage` | internal to `@tokenbound/ethers` | +| `normalizeMessage` | internal to `@tokenbound/ethers` | +| `chainIdToChain` | pass a viem `Chain` directly | +| `TokenboundClientOptions.chainId` | pass `chain`; use per-method `chainId` for cross-chain | + +## 5. Cross-chain execution + +Cross-chain `execute` requires a viem public client for LayerZero fee quoting +and is therefore **viem-only**. Calling it through `@tokenbound/ethers` throws a +clear error. Same-chain execution is unaffected. + +--- + +## 6. New entry points + +```text +@tokenbound/sdk the TokenboundClient class + protocol utilities +@tokenbound/sdk/viem tokenboundActions() and the standalone viem actions +@tokenbound/sdk/protocol library-independent encoding/derivation only +@tokenbound/ethers ethers v5/v6 TokenboundClient +``` + +`@tokenbound/sdk/protocol` has no client dependency at all — it operates purely +on `Address`, `Hex`, `bigint`, chain ids and ABIs, and is what both the viem core +and `@tokenbound/ethers` build on. Use it if you only need deterministic address +derivation or calldata encoding: + +```ts +import { getAccountAddress, resolveDeployment } from "@tokenbound/sdk/protocol" + +const account = getAccountAddress( + { tokenContract, tokenId, chainId: 1 }, + resolveDeployment({}), +) +``` + +Built output filenames changed (`dist/tokenbound-sdk.js` → `dist/index.js`). +This only matters if you were deep-importing build artifacts rather than using +the package entry points. + +--- + +## Bundle size + +Dropping the eager `viem/chains` import, relocating the ERC-6551 ABIs out of the +test tree, and splitting entry points cut the published bundle substantially: + +| | before | after | +|---|--------|-------| +| main bundle | 251.7 kB | 15.9 kB | +| main bundle (gzip) | 74.5 kB | 3.8 kB | +| published tarball | 226.2 kB | 80.0 kB | +| unpacked | 1.2 MB | 496 kB | + +The old build also shipped a 668 kB `stats.html` bundle-analysis artifact inside +`dist/`. Analysis is now opt-in (`ANALYZE=true pnpm build`) and writes outside +the published directory. diff --git a/README.md b/README.md index 5c8f548..0fec277 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,11 @@ This repo houses the Tokenbound SDK, a front-end library for interacting with [E ### Packages -- **[@tokenbound/sdk](https://github.com/tokenbound/sdk/tree/main/packages/sdk)** - SDK client for all projects, signing enabled via either Ethers Signer or viem WalletClient. +- **[@tokenbound/sdk](https://github.com/tokenbound/sdk/tree/main/packages/sdk)** — the canonical, **viem-first** SDK. Signing via a viem `WalletClient`, plus an idiomatic `.extend(tokenboundActions())` client decorator. +- **[@tokenbound/ethers](https://github.com/tokenbound/sdk/tree/main/packages/ethers)** — ethers v5/v6 compatibility layer. Depends on `@tokenbound/sdk` and reuses its ERC-6551 protocol logic. + +`@tokenbound/sdk` has no ethers dependency, so viem consumers never pull ethers +into their bundle. Migrating from a previous release? See **[MIGRATION.md](./MIGRATION.md)**. ### Examples @@ -39,7 +43,7 @@ Tests are using [Vitest](https://vitest.dev), and can be performed via multiple - Unit tests spin up a local Anvil instance using [viem/anvil](https://www.npmjs.com/package/@viem/anvil) and transact against a local fork of mainnet. - Integration tests are rendered with a [custom `render` function](https://testing-library.com/docs/react-testing-library/setup/#custom-render) from React Testing Library that integrates with Anvil. See usage of `renderWithWagmiConfig` in `packages/sdk/src/tests`. -Both pipelines use [wagmi's Ethers adaptors](https://wagmi.sh/react/ethers-adapters) to convert the viem walletClient to Ethers 5 and Ethers 6 signers so the entire test suite is run against all 3 implementations. +`@tokenbound/sdk`'s suite is viem-only. `@tokenbound/ethers` runs its own suite, exercising ethers v5 and ethers v6 independently against separate Anvil forks, so a behavioural difference in one major version can't be masked by the other. Both packages cover the ERC-6551 V2 (legacy) and V3 deployments. These tests require a local Anvil node so test transactions can be run against a mainnet fork. @@ -94,12 +98,14 @@ The TokenboundClient class provides an interface for interacting with tokenbound The client is instantiated with an object containing two parameters: -| Parameter | | -| --------------------------------------- | --------- | -| One of **signer** _or_ **walletClient** | mandatory | -| One of **chainId** _or_ **chain** | mandatory | +| Parameter | | +| ---------------- | --------- | +| **walletClient** | required for transactions that need a signature | +| **chain** | mandatory | + +Use a viem `walletClient` [(see walletClient docs)](https://viem.sh/docs/clients/wallet.html) for transactions that require a user to sign. -Use either a viem `walletClient` [(see walletClient docs)](https://viem.sh/docs/clients/wallet.html) _or_ an Ethers `signer` [(see signer docs)](https://docs.ethers.org/v5/api/signer/) for transactions that require a user to sign. Note that viem is an SDK dependency, so walletClient is preferable for most use cases. _Use of Ethers signer is recommended only for legacy projects_. +Ethers users should install **[@tokenbound/ethers](./packages/ethers)** instead, which accepts an ethers v5 or v6 `Signer` and exposes the same API. The TokenboundClient is configured to use the [Version 3.1 ERC-6551 contract deployments →](https://docs.tokenbound.org/contracts/deployments) by default. @@ -107,38 +113,62 @@ For instructions about using a **Custom Account Implementation** and/or a **Lega ### Standard configuration -If you're using one of the [standard V2/V3 ERC-6551 contract deployments →](https://docs.tokenbound.org/contracts/deployments), you can simply pass the`chainId`. This will set `Chain` internally using imports from [`viem/chains`](https://viem.sh/docs/clients/chains.html). To keep the bundle size to a minimum, only standard chains are included in the SDK package. +Pass the viem `Chain` you're operating on. Import it from [`viem/chains`](https://viem.sh/docs/clients/chains.html) — the SDK no longer maps a bare `chainId` to a `Chain`, since that required eagerly importing every chain into your bundle. ```ts copy -import { useAccount, WalletClient } from 'wagmi' +import { useAccount } from 'wagmi' +import { createWalletClient, http, type WalletClient } from 'viem' +import { mainnet } from 'viem/chains' import { TokenboundClient } from '@tokenbound/sdk' const { address } = useAccount() const walletClient: WalletClient = createWalletClient({ - chainId: goerli, + chain: mainnet, account: address, transport: http(), }) -const tokenboundClient = new TokenboundClient({ walletClient, chainId: 5 }) +const tokenboundClient = new TokenboundClient({ walletClient, chain: mainnet }) ``` -### Custom chain - -If your chain isn't listed on the [deployments page →](https://docs.tokenbound.org/contracts/deployments), you'll need to pass the full `Chain` object from the [`viem/chains`](https://viem.sh/docs/clients/chains.html) package using the `chain` parameter. +Any viem `Chain` works, including ones not on the [deployments page →](https://docs.tokenbound.org/contracts/deployments): ```ts copy import { zora } from 'viem/chains' const tokenboundClient = new TokenboundClient({ walletClient, chain: zora }) ``` +### Using the viem client extension (recommended) + +The idiomatic viem API decorates a client, namespacing everything under `.tokenbound`: + +```ts copy +import { createWalletClient, custom } from 'viem' +import { mainnet } from 'viem/chains' +import { tokenboundActions } from '@tokenbound/sdk/viem' + +const client = createWalletClient({ + chain: mainnet, + account: address, + transport: custom(window.ethereum), +}).extend(tokenboundActions()) + +const account = client.tokenbound.getAccount({ tokenContract, tokenId }) +await client.tokenbound.createAccount({ tokenContract, tokenId }) +await client.tokenbound.execute({ account, to, value, data }) +``` + +Public clients receive only the read-only actions; clients carrying an account get the full set. The extension reuses exactly the same protocol code as the class API. + ### Using Ethers.js -Ethers 5 / 6 are supported as an alternative to viem. +Ethers 5 / 6 are supported through the separate `@tokenbound/ethers` package: ```ts copy -const { data: signer } = useSigner() -const tokenboundClient = new TokenboundClient({ signer, chainId: 1 }) +import { TokenboundClient } from '@tokenbound/ethers' +import { mainnet } from 'viem/chains' + +const tokenboundClient = new TokenboundClient({ signer, chain: mainnet }) ``` ### Making your first call @@ -146,7 +176,7 @@ const tokenboundClient = new TokenboundClient({ signer, chainId: 1 }) Now you can use the TokenboundClient to interact with the Tokenbound contracts: ```ts copy -const tokenboundClient = new TokenboundClient({ walletClient, chainId: 1 }) +const tokenboundClient = new TokenboundClient({ walletClient, chain: mainnet }) const tokenboundAccount = tokenboundClient.getAccount({ tokenContract: '', @@ -513,7 +543,7 @@ Gets an [EIP-191](https://eips.ethereum.org/EIPS/eip-191) formatted signature fo **Returns** a Promise that resolves to a signed Hex string -The message to be signed is typed as `UniversalSignableMessage` so that it can elegantly handle Ethers 5, Ethers 6, and viem's expected types for all signable formats. Check the types associated with signMessage for [viem](https://viem.sh/docs/actions/wallet/signMessage.html), [Ethers 5](https://docs.ethers.org/v5/api/signer/#Signer-signMessage), and [Ethers 6](https://docs.ethers.org/v6/api/providers/#Signer-signMessage) as needed. +In `@tokenbound/sdk` the message is typed as viem's `SignableMessage` (`string | { raw }`). In `@tokenbound/ethers` it is typed as `EthersSignableMessage`, which covers both ethers majors and is normalized internally. Check the types associated with signMessage for [viem](https://viem.sh/docs/actions/wallet/signMessage.html), [Ethers 5](https://docs.ethers.org/v5/api/signer/#Signer-signMessage), and [Ethers 6](https://docs.ethers.org/v6/api/providers/#Signer-signMessage) as needed. ```ts // Ethers 5 diff --git a/biome.json b/biome.json index 69a1c2e..1449b01 100644 --- a/biome.json +++ b/biome.json @@ -1,10 +1,7 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.13/schema.json", "files": { - "ignore": [ - "node_modules/*", - "dist/**/*" - ] + "includes": ["**", "!**/node_modules/**/*", "!**/dist/**/*"] }, "formatter": { "enabled": true, @@ -12,13 +9,11 @@ "indentStyle": "tab", "lineWidth": 80 }, - "organizeImports": { - "enabled": true - }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { "enabled": true, "rules": { - "recommended": true, + "preset": "recommended", "correctness": { "noUnusedImports": "error" }, diff --git a/examples/vite-wagmi-ethers-rainbowkit/package.json b/examples/vite-wagmi-ethers-rainbowkit/package.json index f65610a..eafa875 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/package.json +++ b/examples/vite-wagmi-ethers-rainbowkit/package.json @@ -1,33 +1,33 @@ { - "name": "vite-wagmi-ethers-rainbowkit", - "version": "0.0.7", - "private": true, - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "clean": "rm -rf node_modules" - }, - "dependencies": { - "@tokenbound/sdk": "workspace:^", - "@wagmi/core": "^2.13.9", - "buffer": "^6.0.3", - "@tanstack/react-query": "^5.59.15", - "@rainbow-me/rainbowkit": "^2.2.0", - "ethers": "^5.7.2", - "process": "^0.11.10", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "util": "^0.12.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^4.4.9" - } + "name": "vite-wagmi-ethers-rainbowkit", + "version": "0.0.7", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "clean": "rm -rf node_modules" + }, + "dependencies": { + "@rainbow-me/rainbowkit": "^2.2.11", + "@tanstack/react-query": "^5.59.15", + "@tokenbound/ethers": "workspace:^", + "@wagmi/core": "^2.13.9", + "buffer": "^6.0.3", + "ethers": "^5.8.0", + "process": "^0.11.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "util": "^0.12.5", + "viem": "^2.56.5", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "^5.2.2", + "vite": "^5.4.21" + } } diff --git a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts b/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts index beda33f..57e078c 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts +++ b/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer' -import process from 'node:process' +import { Buffer } from 'buffer' +import process from 'process' window.global = window window.process = process diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx b/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx index cf75edc..32ea063 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx +++ b/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx @@ -1,10 +1,11 @@ import { ConnectButton } from "@rainbow-me/rainbowkit" import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" +import { TokenboundClient } from "@tokenbound/ethers" import { Account } from "./components" import { parseUnits, getAddress } from "viem" +import { sepolia } from "viem/chains" import { useCallback, useEffect } from "react" import { useEthersSigner } from "./hooks" @@ -24,10 +25,10 @@ const ethAmountWei = parseUnits(`${ethAmount}`, 18) export function App() { const { isConnected, address } = useAccount() - const signer = useEthersSigner({ chainId: 5 }) + const signer = useEthersSigner({ chainId: sepolia.id }) // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() - const tokenboundClient = new TokenboundClient({ signer, chainId: 5 }) + const tokenboundClient = new TokenboundClient({ signer, chain: sepolia }) useEffect(() => { async function testTokenboundClass() { @@ -40,7 +41,7 @@ export function App() { account: account, to: account, value: 0n, - data: "", + data: "0x", }) const preparedAccount = await tokenboundClient.prepareCreateAccount({ diff --git a/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json b/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json index 792e511..2c92705 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json +++ b/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json @@ -8,7 +8,7 @@ "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noEmit": true, "resolveJsonModule": true, "skipLibCheck": true, diff --git a/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts b/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts index 70fd0ed..ca945ae 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts +++ b/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts @@ -11,9 +11,6 @@ export default defineConfig({ target: "es2020", }, }, - define: { - global: "globalThis", - }, resolve: { alias: { process: "process/browser", diff --git a/examples/vite-wagmi-ethers/package.json b/examples/vite-wagmi-ethers/package.json index bfec8bc..c8425d2 100644 --- a/examples/vite-wagmi-ethers/package.json +++ b/examples/vite-wagmi-ethers/package.json @@ -1,33 +1,33 @@ { - "name": "vite-wagmi-ethers", - "version": "0.0.7", - "private": true, - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "clean": "rm -rf node_modules" - }, - "dependencies": { - "@tokenbound/sdk": "workspace:^", - "buffer": "^6.0.3", - "@tanstack/react-query": "^5.59.15", - "@rainbow-me/rainbowkit": "2.2.0", - "connectkit": "1.8.2", - "ethers": "^5.7.2", - "process": "^0.11.10", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "util": "^0.12.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^4.4.9" - } + "name": "vite-wagmi-ethers", + "version": "0.0.7", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "clean": "rm -rf node_modules" + }, + "dependencies": { + "@rainbow-me/rainbowkit": "^2.2.11", + "@tanstack/react-query": "^5.59.15", + "@tokenbound/ethers": "workspace:^", + "buffer": "^6.0.3", + "connectkit": "^1.9.2", + "ethers": "^5.8.0", + "process": "^0.11.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "util": "^0.12.5", + "viem": "^2.56.5", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "^5.2.2", + "vite": "^5.4.21" + } } diff --git a/examples/vite-wagmi-ethers/polyfills.ts b/examples/vite-wagmi-ethers/polyfills.ts index beda33f..57e078c 100644 --- a/examples/vite-wagmi-ethers/polyfills.ts +++ b/examples/vite-wagmi-ethers/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer' -import process from 'node:process' +import { Buffer } from 'buffer' +import process from 'process' window.global = window window.process = process diff --git a/examples/vite-wagmi-ethers/src/App.tsx b/examples/vite-wagmi-ethers/src/App.tsx index af5313f..c925df8 100644 --- a/examples/vite-wagmi-ethers/src/App.tsx +++ b/examples/vite-wagmi-ethers/src/App.tsx @@ -1,9 +1,10 @@ import { ConnectKitButton } from "connectkit" import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" +import { TokenboundClient } from "@tokenbound/ethers" import { Account } from "./components" import { parseUnits, getAddress } from "viem" +import { sepolia } from "viem/chains" import { useCallback, useEffect } from "react" import { useEthersSigner } from "./hooks" @@ -23,12 +24,12 @@ const ethAmountWei = parseUnits(`${ethAmount}`, 18) export function App() { const { isConnected, address } = useAccount() - const signer = useEthersSigner({ chainId: 5 }) + const signer = useEthersSigner({ chainId: sepolia.id }) // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() const tokenboundClient = new TokenboundClient({ signer, - chainId: 5, + chain: sepolia, }) useEffect(() => { @@ -45,7 +46,7 @@ export function App() { account: tokenboundAccount, to: recipientAddress, value: 0n, - data: "", + data: "0x", }) const preparedCreateAccount = await tokenboundClient.prepareCreateAccount( diff --git a/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts b/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts index 81c0f98..5089516 100644 --- a/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts +++ b/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts @@ -1,5 +1,6 @@ import * as React from 'react' -import { type WalletClient, useWalletClient } from 'wagmi' +import { useWalletClient } from 'wagmi' +import type { WalletClient } from 'viem' import { providers } from 'ethers' // Ethers.js Adapters for Wagmi Wallet Client @@ -7,6 +8,8 @@ import { providers } from 'ethers' export function walletClientToSigner(walletClient: WalletClient) { const { account, chain, transport } = walletClient + if (!chain) throw new Error('Wallet client has no chain') + if (!account) throw new Error('Wallet client has no account') const network = { chainId: chain.id, name: chain.name, diff --git a/examples/vite-wagmi-ethers/tsconfig.json b/examples/vite-wagmi-ethers/tsconfig.json index 792e511..2c92705 100644 --- a/examples/vite-wagmi-ethers/tsconfig.json +++ b/examples/vite-wagmi-ethers/tsconfig.json @@ -8,7 +8,7 @@ "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noEmit": true, "resolveJsonModule": true, "skipLibCheck": true, diff --git a/examples/vite-wagmi-ethers/vite.config.ts b/examples/vite-wagmi-ethers/vite.config.ts index 70fd0ed..ca945ae 100644 --- a/examples/vite-wagmi-ethers/vite.config.ts +++ b/examples/vite-wagmi-ethers/vite.config.ts @@ -11,9 +11,6 @@ export default defineConfig({ target: "es2020", }, }, - define: { - global: "globalThis", - }, resolve: { alias: { process: "process/browser", diff --git a/examples/vite-wagmi-ethers6/package.json b/examples/vite-wagmi-ethers6/package.json index b6ee820..447970c 100644 --- a/examples/vite-wagmi-ethers6/package.json +++ b/examples/vite-wagmi-ethers6/package.json @@ -1,32 +1,32 @@ { - "name": "vite-wagmi-ethers6", - "version": "0.0.7", - "private": true, - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "clean": "rm -rf node_modules" - }, - "dependencies": { - "@tokenbound/sdk": "workspace:^", - "buffer": "^6.0.3", - "connectkit": "^1.8.2", - "@tanstack/react-query": "^5.59.15", - "ethers": "^6.13.4", - "process": "^0.11.10", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "util": "^0.12.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^4.4.9" - } + "name": "vite-wagmi-ethers6", + "version": "0.0.7", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "clean": "rm -rf node_modules" + }, + "dependencies": { + "@tanstack/react-query": "^5.59.15", + "@tokenbound/ethers": "workspace:^", + "buffer": "^6.0.3", + "connectkit": "^1.9.2", + "ethers": "^6.17.0", + "process": "^0.11.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "util": "^0.12.5", + "viem": "^2.56.5", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "^5.2.2", + "vite": "^5.4.21" + } } diff --git a/examples/vite-wagmi-ethers6/polyfills.ts b/examples/vite-wagmi-ethers6/polyfills.ts index beda33f..57e078c 100644 --- a/examples/vite-wagmi-ethers6/polyfills.ts +++ b/examples/vite-wagmi-ethers6/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer' -import process from 'node:process' +import { Buffer } from 'buffer' +import process from 'process' window.global = window window.process = process diff --git a/examples/vite-wagmi-ethers6/src/App.tsx b/examples/vite-wagmi-ethers6/src/App.tsx index d008a60..7eabbf9 100644 --- a/examples/vite-wagmi-ethers6/src/App.tsx +++ b/examples/vite-wagmi-ethers6/src/App.tsx @@ -1,10 +1,11 @@ import { ConnectKitButton } from "connectkit" import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" +import { TokenboundClient } from "@tokenbound/ethers" import { Account } from "./components" import { parseUnits, getAddress } from "viem" +import { sepolia } from "viem/chains" import { useCallback, useEffect } from "react" import { useEthers6Signer } from "./hooks" @@ -25,11 +26,11 @@ const ethAmountWei = parseUnits(`${ethAmount}`, 18) export function App() { const { isConnected, address } = useAccount() - const signer = useEthers6Signer({ chainId: 5 }) + const signer = useEthers6Signer({ chainId: sepolia.id }) // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() console.log("SIGNER", signer) - const tokenboundClient = new TokenboundClient({ signer, chainId: 5 }) + const tokenboundClient = new TokenboundClient({ signer, chain: sepolia }) useEffect(() => { async function testTokenboundClass() { @@ -42,7 +43,7 @@ export function App() { account: account, to: account, value: 0n, - data: "", + data: "0x", }) const preparedAccount = await tokenboundClient.prepareCreateAccount({ diff --git a/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts b/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts index 03d4f17..1021daa 100644 --- a/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts +++ b/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts @@ -1,5 +1,6 @@ import * as React from 'react' -import { type WalletClient, useWalletClient } from 'wagmi' +import { useWalletClient } from 'wagmi' +import type { WalletClient } from 'viem' import { BrowserProvider, JsonRpcSigner } from 'ethers' // Ethers.js Adapters for Wagmi Wallet Client @@ -7,6 +8,8 @@ import { BrowserProvider, JsonRpcSigner } from 'ethers' export function walletClientToSigner(walletClient: WalletClient) { const { account, chain, transport } = walletClient + if (!chain) throw new Error('Wallet client has no chain') + if (!account) throw new Error('Wallet client has no account') const network = { chainId: chain.id, name: chain.name, diff --git a/examples/vite-wagmi-ethers6/tsconfig.json b/examples/vite-wagmi-ethers6/tsconfig.json index 792e511..2c92705 100644 --- a/examples/vite-wagmi-ethers6/tsconfig.json +++ b/examples/vite-wagmi-ethers6/tsconfig.json @@ -8,7 +8,7 @@ "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noEmit": true, "resolveJsonModule": true, "skipLibCheck": true, diff --git a/examples/vite-wagmi-ethers6/vite.config.ts b/examples/vite-wagmi-ethers6/vite.config.ts index 70fd0ed..ca945ae 100644 --- a/examples/vite-wagmi-ethers6/vite.config.ts +++ b/examples/vite-wagmi-ethers6/vite.config.ts @@ -11,9 +11,6 @@ export default defineConfig({ target: "es2020", }, }, - define: { - global: "globalThis", - }, resolve: { alias: { process: "process/browser", diff --git a/examples/vite-wagmi-viem/package.json b/examples/vite-wagmi-viem/package.json index 65af749..b5493e7 100644 --- a/examples/vite-wagmi-viem/package.json +++ b/examples/vite-wagmi-viem/package.json @@ -1,32 +1,31 @@ { - "name": "vite-wagmi", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", - "clean": "rm -rf node_modules" - }, - "dependencies": { - "@tokenbound/sdk": "workspace:^", - "buffer": "^6.0.3", - "@tanstack/react-query": "^5.59.15", - "@rainbow-me/rainbowkit": "2.2.0", - "ethers": "^5.7.2", - "process": "^0.11.10", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "util": "^0.12.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@types/react": "^18.2.21", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^4.4.9" - } + "name": "vite-wagmi", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "clean": "rm -rf node_modules" + }, + "dependencies": { + "@tokenbound/sdk": "workspace:^", + "buffer": "^6.0.3", + "@tanstack/react-query": "^5.59.15", + "@rainbow-me/rainbowkit": "^2.2.11", + "process": "^0.11.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "util": "^0.12.5", + "viem": "^2.56.5", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "^5.2.2", + "vite": "^5.4.21" + } } diff --git a/examples/vite-wagmi-viem/polyfills.ts b/examples/vite-wagmi-viem/polyfills.ts index beda33f..57e078c 100644 --- a/examples/vite-wagmi-viem/polyfills.ts +++ b/examples/vite-wagmi-viem/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer' -import process from 'node:process' +import { Buffer } from 'buffer' +import process from 'process' window.global = window window.process = process diff --git a/examples/vite-wagmi-viem/src/App.tsx b/examples/vite-wagmi-viem/src/App.tsx index 7858355..2aa4350 100644 --- a/examples/vite-wagmi-viem/src/App.tsx +++ b/examples/vite-wagmi-viem/src/App.tsx @@ -9,10 +9,9 @@ import { custom, parseUnits, getAddress, - type WalletClient, } from "viem" import { baseSepolia, baseGoerli } from "viem/chains" -import { TokenboundClient } from "@tokenbound/sdk" +import { tokenboundActions } from "@tokenbound/sdk/viem" import { useCallback, useEffect } from "react" declare global { @@ -38,35 +37,32 @@ const ethAmountWei = parseUnits(`${ethAmount}`, 18) export function App() { const { isConnected, address } = useAccount() - const walletClient: WalletClient = createWalletClient({ + // The modern viem-first API: extend a viem client and call through + // `client.tokenbound.*`. The extension reuses the same protocol logic as the + // standalone functions, and preserves viem's type inference. + const tokenboundClient = createWalletClient({ chain: baseSepolia, account: address, transport: window.ethereum ? custom(window.ethereum) : http(), - }) - - const tokenboundClient = new TokenboundClient({ - walletClient, - chainId: baseSepolia.id, - // implementationAddress: '0x2d25602551487c3f3354dd80d76d54383a243358', - }) + }).extend(tokenboundActions()) useEffect(() => { async function testTokenboundClass() { if (!tokenboundClient) return - const tokenboundAccount = tokenboundClient.getAccount({ + const tokenboundAccount = tokenboundClient.tokenbound.getAccount({ tokenContract: originNFT.tokenContract, tokenId: originNFT.tokenId, }) - const preparedExecution = await tokenboundClient.prepareExecution({ + const preparedExecution = await tokenboundClient.tokenbound.prepareExecution({ account: tokenboundAccount, to: recipientAddress, value: 0n, - data: "", + data: "0x", }) - const preparedCreateAccount = await tokenboundClient.prepareCreateAccount( + const preparedCreateAccount = await tokenboundClient.tokenbound.prepareCreateAccount( { tokenContract: originNFT.tokenContract, tokenId: originNFT.tokenId, @@ -88,7 +84,7 @@ export function App() { const createAccount = useCallback(async () => { if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.createAccount({ + const createdAccount = await tokenboundClient.tokenbound.createAccount({ tokenContract: originNFT.tokenContract, tokenId: originNFT.tokenId, }) @@ -98,7 +94,7 @@ export function App() { const execute = useCallback(async () => { if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.execute({ + const executedCall = await tokenboundClient.tokenbound.execute({ account: sendingTBA, to: recipientAddress, value: ethAmountWei, @@ -109,7 +105,7 @@ export function App() { const transferETH = useCallback(async () => { if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.transferETH({ + const executedTransfer = await tokenboundClient.tokenbound.transferETH({ account: sendingTBA, recipientAddress, amount: ethAmount, @@ -124,11 +120,11 @@ export function App() { account: sendingTBA, to: originNFT.tokenContract, value: 0n, - data: "", - chain: baseGoerli, + data: "0x" as const, + chainId: baseGoerli.id, } - const executedCallTxHash = await tokenboundClient.execute(execution) + const executedCallTxHash = await tokenboundClient.tokenbound.execute(execution) executedCallTxHash && alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) @@ -136,7 +132,7 @@ export function App() { return ( <> -

viem walletClient + ConnectKit + Vite

+

viem .extend(tokenboundActions()) + RainbowKit + Vite

{isConnected && } {address && ( diff --git a/examples/vite-wagmi-viem/tsconfig.json b/examples/vite-wagmi-viem/tsconfig.json index 792e511..2c92705 100644 --- a/examples/vite-wagmi-viem/tsconfig.json +++ b/examples/vite-wagmi-viem/tsconfig.json @@ -8,7 +8,7 @@ "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", - "moduleResolution": "Node", + "moduleResolution": "Bundler", "noEmit": true, "resolveJsonModule": true, "skipLibCheck": true, diff --git a/examples/vite-wagmi-viem/vite.config.ts b/examples/vite-wagmi-viem/vite.config.ts index 70fd0ed..ca945ae 100644 --- a/examples/vite-wagmi-viem/vite.config.ts +++ b/examples/vite-wagmi-viem/vite.config.ts @@ -11,9 +11,6 @@ export default defineConfig({ target: "es2020", }, }, - define: { - global: "globalThis", - }, resolve: { alias: { process: "process/browser", diff --git a/package.json b/package.json index 71d7621..3e3f801 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,27 @@ { - "name": "tokenbound-monorepo", - "version": "0.0.0", - "description": "", - "scripts": { - "clean": "rm -rf node_modules", - "test": "cd packages/sdk && pnpm test", - "prepare": "husky install", + "name": "tokenbound-monorepo", + "version": "0.0.0", + "description": "", + "scripts": { + "build": "pnpm --filter @tokenbound/sdk build && pnpm --filter @tokenbound/ethers build", + "test": "pnpm --filter @tokenbound/sdk test && pnpm --filter @tokenbound/ethers test", + "test:unit": "pnpm --filter @tokenbound/sdk exec vitest --watch=false --typecheck run src/test/unit/", + "typecheck": "pnpm --filter @tokenbound/sdk exec tsc --noEmit && pnpm --filter @tokenbound/ethers exec tsc --noEmit", + "validate:packages": "node scripts/validate-package-contents.mjs", + "clean": "rm -rf node_modules", + "prepare": "husky install", "lint": "biome lint .", "lint:fix": "biome lint --write --unsafe .", "format": "biome format .", "format:fix": "biome format --write ." - }, - "keywords": [], - "author": "", - "license": "ISC", - "publishConfig.directory": { - "directory": "packages/sdk" - }, - "devDependencies": { - "@biomejs/biome": "1.9.4", - "@changesets/cli": "^2.26.2", - "husky": "^8.0.3", - "typescript": "^5.6.3" - } + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@changesets/cli": "^2.26.2", + "husky": "^8.0.3", + "typescript": "^5.6.3" + } } diff --git a/packages/ethers/README.md b/packages/ethers/README.md new file mode 100644 index 0000000..cb7bf65 --- /dev/null +++ b/packages/ethers/README.md @@ -0,0 +1,102 @@ +# @tokenbound/ethers + +Ethers v5 / v6 compatibility layer for the [Tokenbound](https://tokenbound.org) ERC-6551 SDK. + +`@tokenbound/sdk` is viem-first. This package adapts it to idiomatic ethers +`Signer` objects, so ethers apps keep working without pulling ethers into the +dependency graph of viem consumers. + +```text +@tokenbound/ethers + ↓ + @tokenbound/sdk +``` + +All ERC-6551 protocol logic (address derivation, calldata encoding, bytecode +deconstruction) is reused from `@tokenbound/sdk` — nothing is reimplemented here. + +## Installation + +```bash +npm install @tokenbound/ethers ethers +``` + +`ethers` and `viem` are peer dependencies. Both ethers v5 and v6 are supported; +the version in use is detected automatically. + +## Usage + +The API mirrors `@tokenbound/sdk`'s `TokenboundClient`, so migrating from +`@tokenbound/sdk` means changing the import and passing a `chain`: + +```ts +import { TokenboundClient } from "@tokenbound/ethers" +import { mainnet } from "viem/chains" + +const tokenboundClient = new TokenboundClient({ + signer, // an ethers v5 or v6 Signer + chain: mainnet, +}) + +const account = tokenboundClient.getAccount({ + tokenContract: "0x…", + tokenId: "1", +}) + +const { txHash } = await tokenboundClient.createAccount({ + tokenContract: "0x…", + tokenId: "1", +}) + +await tokenboundClient.transferETH({ + account, + recipientAddress: "0x…", + amount: 0.1, +}) +``` + +### Supported methods + +`getAccount`, `prepareCreateAccount`, `createAccount`, `prepareExecution`, +`execute`, `prepareExecuteCall` / `executeCall` (legacy V2), `isValidSigner`, +`checkAccountDeployment`, `deconstructBytecode`, `getNFT`, `transferNFT`, +`transferETH`, `transferERC20`, `signMessage`. + +### Legacy V2 deployments + +Pin the legacy ERC-6551 V2 deployment with `version`, or point at a custom +deployment with `implementationAddress` / `registryAddress`: + +```ts +import { TokenboundClient } from "@tokenbound/ethers" +import { TBVersion } from "@tokenbound/sdk" + +const tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, + version: TBVersion.V2, +}) +``` + +On a V2 deployment, `prepareExecution()`/`execute()` fall back to the legacy +`prepareExecuteCall()`/`executeCall()` encoding, and `isValidSigner()` throws — +matching `@tokenbound/sdk`. Both ERC-6551 V2 and V3 are tested against ethers v5 +and v6. + +### Version detection + +```ts +tokenboundClient.getEthersVersion() // 5 | 6 +``` + +Detection happens once, at construction. Message normalization differs between +majors (v6 rejects `ArrayLike`, v5 accepts it) and is handled internally. + +## Limitations + +- **Cross-chain execution** is not supported through the ethers adapter. Use + `@tokenbound/sdk` with a viem client for cross-chain calls. +- `chain` is required — passing only `chainId` is no longer supported, because + mapping a chain id to a `Chain` forced every viem chain into consumer bundles. + +See [MIGRATION.md](../../MIGRATION.md) for full migration notes. diff --git a/packages/ethers/package.json b/packages/ethers/package.json new file mode 100644 index 0000000..ea1472f --- /dev/null +++ b/packages/ethers/package.json @@ -0,0 +1,68 @@ +{ + "name": "@tokenbound/ethers", + "version": "0.1.0", + "description": "Ethers v5/v6 compatibility layer for the Tokenbound ERC-6551 SDK", + "keywords": [ + "ethereum", + "erc6551", + "erc-6551", + "tokenbound", + "nft", + "ethers", + "web3" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/tokenbound/sdk.git", + "directory": "packages/ethers" + }, + "homepage": "https://github.com/tokenbound/sdk/tree/main/packages/ethers#readme", + "bugs": { + "url": "https://github.com/tokenbound/sdk/issues" + }, + "type": "module", + "sideEffects": false, + "files": [ + "dist" + ], + "types": "./dist/index.d.ts", + "main": "./dist/tokenbound-ethers.umd.cjs", + "module": "./dist/tokenbound-ethers.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/tokenbound-ethers.js", + "require": "./dist/tokenbound-ethers.umd.cjs" + }, + "./package.json": "./package.json" + }, + "scripts": { + "build": "tsc --noEmit && vite build", + "test": "pnpm test:unit && pnpm test:integration && pnpm test:v2 && pnpm test:transfer", + "clean": "rm -rf node_modules/ dist/", + "lint": "biome lint .", + "format": "biome format .", + "test:unit": "vitest --watch=false run src/test/adapter.test.ts", + "test:integration": "vitest --watch=false run src/test/integration.test.ts", + "test:transfer": "vitest --watch=false run src/test/transfer.test.ts", + "test:v2": "vitest --watch=false run src/test/v2.test.ts" + }, + "dependencies": { + "@tokenbound/sdk": "workspace:^" + }, + "peerDependencies": { + "ethers": "^5.7.2 || ^6.0.0", + "viem": "^2.56.5" + }, + "devDependencies": { + "@biomejs/biome": "2.5.13", + "@viem/anvil": "^0.0.10", + "ethers": "^5.8.0", + "ethers6": "npm:ethers@^6.17.0", + "typescript": "^5.6.3", + "viem": "^2.56.5", + "vite": "^4.4.9", + "vite-plugin-dts": "^3.9.0", + "vitest": "^1.6.1" + } +} diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts new file mode 100644 index 0000000..20ccd43 --- /dev/null +++ b/packages/ethers/src/TokenboundClient.ts @@ -0,0 +1,422 @@ +// Ethers-backed TokenboundClient. +// +// The public API deliberately mirrors @tokenbound/sdk's TokenboundClient so +// existing ethers users migrate by changing only their import. All ERC-6551 +// encoding and address derivation is reused from @tokenbound/sdk's protocol +// layer — nothing is reimplemented here. + +import { + type Call3, + type CallData, + deconstructBytecode as deconstructBytecodeFromHex, + ERC_6551_DEFAULT, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeExecution, + encodeNFTTransfer, + getAccountAddress, + type MultiCallTx, + type Prettify, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + type SegmentedERC6551Bytecode, + type TBImplementationVersion, + type TokenboundAccountNFT, + VALID_SIGNER_MAGIC_VALUE, +} from "@tokenbound/sdk" +import { + type Address, + type Chain, + createPublicClient, + type Hex, + http, + type PublicClient, +} from "viem" + +import { type EthersAdapter, resolveAdapter } from "./adapter" +import type { EthersSignableMessage } from "./types" + +type PossibleENSAddress = Address | `${string}.eth` + +type NFTTokenTypeValue = "ERC721" | "ERC1155" + +export type TokenboundEthersClientOptions = { + /** An ethers v5 or v6 Signer. */ + signer: unknown + /** + * The viem Chain to operate on. Required, mirroring @tokenbound/sdk: the + * SDK no longer maps a bare chainId to a Chain. + */ + chain: Chain + /** A viem PublicClient used for reads. Created automatically when omitted. */ + publicClient?: PublicClient + publicClientRPCUrl?: string + implementationAddress?: Address + registryAddress?: Address + version?: TBImplementationVersion +} + +export type GetAccountParams = { + tokenContract: Address + tokenId: string + chainId?: number + salt?: number +} + +export type CreateAccountParams = Prettify< + GetAccountParams & { + appendedCalls?: Call3[] + } +> + +export type ExecuteParams = { + account: Address + to: Address + value: bigint + data: string + chainId?: number +} + +export class TokenboundClient { + private chainId: number + public isInitialized = false + public publicClient: PublicClient + private adapter: EthersAdapter + private deployment: ResolvedDeployment + + constructor(options: TokenboundEthersClientOptions) { + const { + signer, + chain, + publicClient, + publicClientRPCUrl, + implementationAddress, + registryAddress, + version, + } = options + + if (!chain) { + throw new Error( + "`chain` is required. Pass a viem Chain (e.g. `import { mainnet } from 'viem/chains'`).", + ) + } + + if (!signer) { + throw new Error("signer required.") + } + + if (publicClient && publicClientRPCUrl) { + throw new Error( + "Only one of `publicClient` or `publicClientRPCUrl` should be provided.", + ) + } + + this.chainId = chain.id + this.adapter = resolveAdapter(signer) + + this.publicClient = + publicClient ?? + createPublicClient({ + chain, + transport: http(publicClientRPCUrl ?? undefined), + }) + + this.deployment = resolveDeployment({ + implementationAddress, + registryAddress, + version, + }) + + this.isInitialized = true + } + + /** The detected ethers major version (5 or 6). */ + public getEthersVersion(): 5 | 6 { + return this.adapter.version + } + + /** + * Returns the tokenbound account address for a given token contract and token ID. + */ + public getAccount(params: GetAccountParams): Address { + const { tokenContract, tokenId, salt = 0, chainId = this.chainId } = params + return getAccountAddress( + { tokenContract, tokenId, chainId, salt }, + this.deployment, + ) + } + + /** + * Returns the prepared transaction to create a tokenbound account. + * Can be sent via `sendTransaction` on an ethers Signer. + */ + public async prepareCreateAccount( + params: CreateAccountParams, + ): Promise { + const { + tokenContract, + tokenId, + salt = 0, + chainId = this.chainId, + appendedCalls = [], + } = params + + return await prepareCreateAccountTx( + { tokenContract, tokenId, chainId, salt, appendedCalls }, + this.deployment, + ) + } + + /** + * Creates a tokenbound account, returning the account address and tx hash. + */ + public async createAccount( + params: CreateAccountParams, + ): Promise<{ account: Address; txHash: Hex }> { + const { tokenContract, tokenId, salt = 0, chainId = this.chainId } = params + + const account = this.getAccount({ tokenContract, tokenId, chainId, salt }) + const prepared = await this.prepareCreateAccount(params) + const txHash = await this.sendPrepared(prepared) + + return { account, txHash } + } + + /** + * Returns prepared transaction to execute a call on a tokenbound account. + * @deprecated available for legacy V2 deployments. Use prepareExecution(). + */ + public async prepareExecuteCall(params: ExecuteParams): Promise { + if (this.deployment.supportsV3) { + throw new Error( + "prepareExecuteCall() is not supported on V3 implementation deployments, use prepareExecution() instead.", + ) + } + const { account, to, value, data } = params + return await encodeExecuteCall({ account, to, value, data }) + } + + /** + * Executes a call on a legacy V2 tokenbound account. + * @deprecated available for legacy V2 deployments. Use execute(). + */ + public async executeCall(params: ExecuteParams): Promise { + const prepared = await this.prepareExecuteCall(params) + return await this.sendPrepared(prepared) + } + + /** + * Returns prepared transaction to execute on a tokenbound account. + * Cross-chain execution is not supported through the ethers adapter. + */ + public async prepareExecution(params: ExecuteParams): Promise { + const { account, to, value, data, chainId = this.chainId } = params + + if (!this.deployment.supportsV3) { + return await this.prepareExecuteCall(params) + } + + if (chainId !== this.chainId) { + throw new Error( + "Cross-chain execution is not supported via @tokenbound/ethers. Use @tokenbound/sdk with a viem client.", + ) + } + + return encodeExecution({ + account, + to, + value, + data: data as Hex, + }) + } + + /** Executes a call from a tokenbound account. */ + public async execute(params: ExecuteParams): Promise { + if (!this.deployment.supportsV3) { + return await this.executeCall(params) + } + const prepared = await this.prepareExecution(params) + return await this.sendPrepared(prepared) + } + + /** Checks whether the signer is a valid signer for a tokenbound account. */ + public async isValidSigner({ + account, + }: { + account: Address + }): Promise { + if (!this.deployment.supportsV3) { + throw new Error( + "isValidSigner is not supported using the V2 implementation", + ) + } + + const signerAddress = await this.adapter.getAddress() + const { numberToHex } = await import("viem") + + const validityCheck = await this.publicClient.readContract({ + address: account, + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "isValidSigner", + args: [signerAddress, numberToHex(0, { size: 32 })], + }) + + return validityCheck === VALID_SIGNER_MAGIC_VALUE + } + + /** Returns true when a tokenbound account has been deployed. */ + public async checkAccountDeployment({ + accountAddress, + }: { + accountAddress: Address + }): Promise { + const bytecode = await this.publicClient.getCode({ + address: accountAddress, + }) + return bytecode ? bytecode.length > 2 : false + } + + /** Splits a deployed account's bytecode into its ERC-6551 components. */ + public async deconstructBytecode({ + accountAddress, + }: { + accountAddress: Address + }): Promise { + const bytecode = await this.publicClient.getCode({ + address: accountAddress, + }) + return deconstructBytecodeFromHex(bytecode) + } + + /** Returns the NFT that owns a tokenbound account. */ + public async getNFT({ + accountAddress, + }: { + accountAddress: Address + }): Promise { + const deconstructed = await this.deconstructBytecode({ accountAddress }) + if (!deconstructed) { + throw new Error( + "The tokenbound account has not been deployed at this address", + ) + } + const { chainId, tokenContract, tokenId } = deconstructed + return { tokenContract, tokenId, chainId } + } + + /** Transfers an ERC721/ERC1155 out of a tokenbound account. */ + public async transferNFT(params: { + account: Address + tokenType: NFTTokenTypeValue + tokenContract: Address + tokenId: string + recipientAddress: PossibleENSAddress + amount?: number + chainId?: number + }): Promise { + const recipient = await this.resolveRecipient(params.recipientAddress) + + const transfer = encodeNFTTransfer({ + account: params.account, + tokenType: params.tokenType, + tokenContract: params.tokenContract, + tokenId: params.tokenId, + recipient, + amount: params.amount, + }) + + return await this.executeTransfer(params.account, transfer, params.chainId) + } + + /** Transfers ETH out of a tokenbound account. `amount` is in decimal ETH. */ + public async transferETH(params: { + account: Address + recipientAddress: PossibleENSAddress + amount: number + chainId?: number + }): Promise { + const recipient = await this.resolveRecipient(params.recipientAddress) + const transfer = encodeETHTransfer({ recipient, amount: params.amount }) + return await this.executeTransfer(params.account, transfer, params.chainId) + } + + /** Transfers an ERC-20 out of a tokenbound account. */ + public async transferERC20(params: { + account: Address + recipientAddress: PossibleENSAddress + amount: number + erc20tokenAddress: Address + erc20tokenDecimals: number + chainId?: number + }): Promise { + if (params.erc20tokenDecimals < 0 || params.erc20tokenDecimals > 18) { + throw new Error("Decimal value out of range. Should be between 0 and 18.") + } + + const recipient = await this.resolveRecipient(params.recipientAddress) + + const transfer = encodeERC20Transfer({ + recipient, + amount: params.amount, + erc20tokenAddress: params.erc20tokenAddress, + erc20tokenDecimals: params.erc20tokenDecimals, + }) + + return await this.executeTransfer(params.account, transfer, params.chainId) + } + + /** + * Signs a message with the ethers signer, normalizing the message for the + * detected ethers version. + */ + public async signMessage(params: { + message: EthersSignableMessage + }): Promise { + return await this.adapter.signMessage(params.message) + } + + /** Resolves an ENS name via the public client, or normalizes an address. */ + private async resolveRecipient( + recipientAddress: PossibleENSAddress, + ): Promise
{ + const { getAddress } = await import("viem") + + if (!recipientAddress.endsWith(".eth")) { + return getAddress(recipientAddress) + } + + const { normalize } = await import("viem/ens") + const resolved = await this.publicClient.getEnsAddress({ + name: normalize(recipientAddress), + }) + + if (!resolved) { + throw new Error("Failed to resolve ENS address") + } + return resolved + } + + /** Routes an encoded transfer through execute() or legacy executeCall(). */ + private async executeTransfer( + account: Address, + transfer: { to: Address; value: bigint; data: Hex }, + chainId?: number, + ): Promise { + const execution = { account, ...transfer } + if (this.deployment.supportsV3) { + return await this.execute({ ...execution, chainId }) + } + return await this.executeCall(execution) + } + + /** Sends a prepared transaction through the ethers signer. */ + private async sendPrepared(tx: CallData | MultiCallTx): Promise { + return await this.adapter.sendTransaction({ + to: tx.to as string, + value: (tx.value ?? 0n) as bigint, + data: tx.data as string, + }) + } +} diff --git a/packages/ethers/src/adapter.ts b/packages/ethers/src/adapter.ts new file mode 100644 index 0000000..11673f8 --- /dev/null +++ b/packages/ethers/src/adapter.ts @@ -0,0 +1,89 @@ +// The version-agnostic adapter interface. +// +// `resolveAdapter` is the only place that chooses between v5 and v6; every +// other module in this package talks to the resulting `EthersAdapter`. +// +// The v5 and v6 adapters are currently one implementation, because the only +// difference between the majors that we actually touch is which message shapes +// `signMessage` accepts — and normalizing to `string | Uint8Array` satisfies +// both. Verified against both majors: v5 accepts `number[]`, v6 rejects it with +// "invalid BytesLike value", and both produce identical signatures for the +// equivalent `Uint8Array`. The per-version normalizers in ./v5 and ./v6 remain +// the seam to reimplement if the majors ever diverge further. + +import { assertSigner, detectEthersVersion } from "./detect" +import type { + EthersSignableMessage, + EthersSigner, + EthersVersion, + Hex, +} from "./types" +import { normalizeV5Message } from "./v5/adapter" +import { normalizeV6Message } from "./v6/adapter" + +/** A uniform view over an ethers v5 or v6 Signer. */ +export type EthersAdapter = { + /** Which ethers major version backs this adapter. */ + version: EthersVersion + /** The underlying ethers Signer. */ + signer: EthersSigner + /** Sends a prepared transaction and returns its hash. */ + sendTransaction: (tx: { + to: string + value: bigint + data: string + }) => Promise + /** Signs a message, normalizing it for the detected ethers version. */ + signMessage: (message: EthersSignableMessage) => Promise + /** Returns the signer's address. */ + getAddress: () => Promise<`0x${string}`> +} + +/** Message normalization, per ethers major version. */ +const NORMALIZERS = { + 5: normalizeV5Message, + 6: normalizeV6Message, +} as const satisfies Record< + EthersVersion, + (message: EthersSignableMessage) => string | Uint8Array +> + +/** + * Builds an adapter over an already-validated signer for a known version. + * `value` is passed through as a JS bigint: v6 uses native bigint, and v5 + * coerces it via BigNumber. + */ +export function createAdapter( + signer: EthersSigner, + version: EthersVersion, +): EthersAdapter { + const normalize = NORMALIZERS[version] + + return { + version, + signer, + async sendTransaction(tx) { + const response = await signer.sendTransaction({ + to: tx.to, + value: tx.value, + data: tx.data, + }) + return response.hash as Hex + }, + async signMessage(message) { + return (await signer.signMessage(normalize(message))) as Hex + }, + async getAddress() { + return (await signer.getAddress()) as `0x${string}` + }, + } +} + +/** + * Wraps an ethers v5 or v6 Signer in a version-agnostic adapter. + * Detection happens once, here. + */ +export function resolveAdapter(signer: unknown): EthersAdapter { + const ethersSigner = assertSigner(signer) + return createAdapter(ethersSigner, detectEthersVersion(ethersSigner)) +} diff --git a/packages/ethers/src/detect.ts b/packages/ethers/src/detect.ts new file mode 100644 index 0000000..e875196 --- /dev/null +++ b/packages/ethers/src/detect.ts @@ -0,0 +1,45 @@ +// The single ethers-version boundary for this package. +// +// Version detection happens here and nowhere else; the rest of the package +// receives an already-resolved adapter, so no version branching is scattered +// through shared code. + +import type { EthersProvider, EthersSigner, EthersVersion } from "./types" + +/** + * Detects whether a signer or provider comes from ethers v5 or v6. + * + * ethers v5 stamps `_isSigner`/`_isProvider` onto its classes; v6 removed both + * and instead exposes a `provider.getNetwork()`-bearing signer whose + * constructor chain carries no `_isSigner` flag. We therefore treat the v5 + * markers as authoritative and default to v6. + */ +export function detectEthersVersion( + subject: EthersSigner | EthersProvider, +): EthersVersion { + if (typeof subject !== "object" || subject === null) { + throw new Error("Expected an ethers Signer or Provider object.") + } + + // ethers v5 markers. + if ( + (subject as Record)._isSigner === true || + (subject as Record)._isProvider === true + ) { + return 5 + } + + return 6 +} + +/** Narrows an unknown value to something signer-shaped, or throws. */ +export function assertSigner(signer: unknown): EthersSigner { + if ( + typeof signer !== "object" || + signer === null || + typeof (signer as EthersSigner).sendTransaction !== "function" + ) { + throw new Error("Expected an ethers Signer with a sendTransaction method.") + } + return signer as EthersSigner +} diff --git a/packages/ethers/src/index.ts b/packages/ethers/src/index.ts new file mode 100644 index 0000000..1d8c873 --- /dev/null +++ b/packages/ethers/src/index.ts @@ -0,0 +1,24 @@ +// @tokenbound/ethers — ethers v5/v6 compatibility layer for the Tokenbound SDK. +// +// Depends on @tokenbound/sdk for all ERC-6551 protocol logic. The dependency +// direction is strictly @tokenbound/ethers → @tokenbound/sdk. + +export { type EthersAdapter, resolveAdapter } from "./adapter" +export { detectEthersVersion } from "./detect" +export { + type CreateAccountParams, + type ExecuteParams, + type GetAccountParams, + TokenboundClient, + type TokenboundEthersClientOptions, +} from "./TokenboundClient" +export type { + Ethers5SignableMessage, + Ethers6SignableMessage, + EthersProvider, + EthersSignableMessage, + EthersSigner, + EthersVersion, +} from "./types" +export { normalizeV5Message } from "./v5/adapter" +export { normalizeV6Message } from "./v6/adapter" diff --git a/packages/ethers/src/test/adapter.test.ts b/packages/ethers/src/test/adapter.test.ts new file mode 100644 index 0000000..9af9675 --- /dev/null +++ b/packages/ethers/src/test/adapter.test.ts @@ -0,0 +1,144 @@ +// Unit tests for the ethers version boundary. +// +// These run without a chain: they verify that v5 and v6 signers are detected +// correctly and that message normalization respects each major version's +// accepted input types. v5 and v6 are asserted independently. + +import { describe, expect, it, vi } from "vitest" +import { detectEthersVersion, resolveAdapter } from "../index" +import { normalizeV5Message } from "../v5/adapter" +import { normalizeV6Message } from "../v6/adapter" + +/** Minimal stand-ins; the package only relies on structural shape. */ +const makeV5Signer = (overrides: Record = {}) => ({ + _isSigner: true, + sendTransaction: vi.fn(async () => ({ hash: "0xv5hash" })), + signMessage: vi.fn(async () => "0xv5sig"), + getAddress: vi.fn(async () => "0x000000000000000000000000000000000000c0de"), + ...overrides, +}) + +const makeV6Signer = (overrides: Record = {}) => ({ + sendTransaction: vi.fn(async () => ({ hash: "0xv6hash" })), + signMessage: vi.fn(async () => "0xv6sig"), + getAddress: vi.fn(async () => "0x000000000000000000000000000000000000c0de"), + provider: { getNetwork: vi.fn() }, + ...overrides, +}) + +describe("detectEthersVersion", () => { + it("detects an ethers v5 signer via _isSigner", () => { + expect(detectEthersVersion(makeV5Signer())).toBe(5) + }) + + it("detects an ethers v5 provider via _isProvider", () => { + expect(detectEthersVersion({ _isProvider: true } as never)).toBe(5) + }) + + it("detects an ethers v6 signer", () => { + expect(detectEthersVersion(makeV6Signer())).toBe(6) + }) + + it("throws on a non-object", () => { + expect(() => detectEthersVersion(null as never)).toThrow() + }) +}) + +describe("resolveAdapter", () => { + it("rejects objects without sendTransaction", () => { + expect(() => resolveAdapter({})).toThrow(/sendTransaction/) + }) + + it("builds a v5 adapter that reports version 5", () => { + expect(resolveAdapter(makeV5Signer()).version).toBe(5) + }) + + it("builds a v6 adapter that reports version 6", () => { + expect(resolveAdapter(makeV6Signer()).version).toBe(6) + }) + + it("returns the transaction hash from a v5 signer", async () => { + const signer = makeV5Signer() + const adapter = resolveAdapter(signer) + const hash = await adapter.sendTransaction({ + to: "0x000000000000000000000000000000000000c0de", + value: 0n, + data: "0x", + }) + expect(hash).toBe("0xv5hash") + expect(signer.sendTransaction).toHaveBeenCalledOnce() + }) + + it("returns the transaction hash from a v6 signer", async () => { + const signer = makeV6Signer() + const adapter = resolveAdapter(signer) + const hash = await adapter.sendTransaction({ + to: "0x000000000000000000000000000000000000c0de", + value: 0n, + data: "0x", + }) + expect(hash).toBe("0xv6hash") + expect(signer.sendTransaction).toHaveBeenCalledOnce() + }) + + it("signs via the v5 signer", async () => { + const signer = makeV5Signer() + expect(await resolveAdapter(signer).signMessage("gm")).toBe("0xv5sig") + }) + + it("signs via the v6 signer", async () => { + const signer = makeV6Signer() + expect(await resolveAdapter(signer).signMessage("gm")).toBe("0xv6sig") + }) +}) + +describe("message normalization", () => { + it("passes strings through unchanged on v5 and v6", () => { + expect(normalizeV5Message("gm")).toBe("gm") + expect(normalizeV6Message("gm")).toBe("gm") + }) + + it("passes Uint8Array through unchanged on v5 and v6", () => { + const bytes = new Uint8Array([72, 101, 108, 108, 111]) + expect(normalizeV5Message(bytes)).toBe(bytes) + expect(normalizeV6Message(bytes)).toBe(bytes) + }) + + it("converts ArrayLike to Uint8Array for v6, which rejects arrays", () => { + const normalized = normalizeV6Message([72, 101, 108, 108, 111]) + expect(normalized).toBeInstanceOf(Uint8Array) + expect(Array.from(normalized as Uint8Array)).toEqual([ + 72, 101, 108, 108, 111, + ]) + }) + + it("converts ArrayLike to Uint8Array for v5 as well", () => { + const normalized = normalizeV5Message([72, 101, 108, 108, 111]) + expect(normalized).toBeInstanceOf(Uint8Array) + expect(Array.from(normalized as Uint8Array)).toEqual([ + 72, 101, 108, 108, 111, + ]) + }) + + it("is the property that lets v5 and v6 share one adapter", async () => { + // v5 accepts number[] but v6 rejects it ("invalid BytesLike value"). + // Normalizing both to Uint8Array makes the two majors agree, which is + // why createAdapter is version-parameterized rather than duplicated. + const arrayLike = [72, 105] + expect(normalizeV5Message(arrayLike)).toEqual(normalizeV6Message(arrayLike)) + expect(normalizeV5Message("gm")).toEqual(normalizeV6Message("gm")) + + const bytes = new Uint8Array([72, 105]) + expect(normalizeV5Message(bytes)).toEqual(normalizeV6Message(bytes)) + }) + + it("normalizes the message before handing it to the signer", async () => { + const v5 = makeV5Signer() + await resolveAdapter(v5).signMessage([72, 105]) + expect(v5.signMessage).toHaveBeenCalledWith(new Uint8Array([72, 105])) + + const v6 = makeV6Signer() + await resolveAdapter(v6).signMessage([72, 105]) + expect(v6.signMessage).toHaveBeenCalledWith(new Uint8Array([72, 105])) + }) +}) diff --git a/packages/ethers/src/test/constants.ts b/packages/ethers/src/test/constants.ts new file mode 100644 index 0000000..c3b80ef --- /dev/null +++ b/packages/ethers/src/test/constants.ts @@ -0,0 +1,17 @@ +export const ANVIL_RPC_URL = "http://127.0.0.1:8545" + +export const ANVIL_ACCOUNTS = [ + { + address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + privateKey: + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + }, + { + address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + privateKey: + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + }, +] as const + +export const ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/ +export const TX_HASH_REGEX = /^0x[a-fA-F0-9]{64}$/ diff --git a/packages/ethers/src/test/integration.test.ts b/packages/ethers/src/test/integration.test.ts new file mode 100644 index 0000000..6814e20 --- /dev/null +++ b/packages/ethers/src/test/integration.test.ts @@ -0,0 +1,317 @@ +// Anvil-backed integration tests for @tokenbound/ethers. +// +// ethers v5 and ethers v6 are exercised INDEPENDENTLY against a fresh anvil +// fork each, so a behavioral difference in one major version cannot be masked +// by the other. + +import { createAnvil } from "@viem/anvil" +import { ethers } from "ethers" +import { JsonRpcProvider, Wallet } from "ethers6" +import { + createPublicClient, + encodeFunctionData, + http, + isAddress, + type PublicClient, + parseAbi, +} from "viem" +import { mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" + +import { TokenboundClient } from "../index" +import { ADDRESS_REGEX, ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" + +const TIMEOUT = 60000 + +// Zora "Webb's First Deep Field" — an open, free public mint on mainnet, so the +// anvil account can mint itself the NFT that controls the tokenbound account. +const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const +const ZORA_721_ABI = parseAbi([ + "function purchase(uint256 quantity) external payable returns (uint256)", + "function totalSupply() external view returns (uint256)", + "function ownerOf(uint256 tokenId) external view returns (address)", +]) + +// Set in beforeAll once the anvil account has minted. +let TOKEN_ID = "1" + +const FORK_URL = + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? + "https://ethereum-rpc.publicnode.com" + +/** Each ethers major version gets its own anvil so nonces never collide. */ +const PORT_FOR_VERSION = { 5: 8545, 6: 8546 } as const + +const rpcUrlFor = (version: 5 | 6) => + `http://127.0.0.1:${PORT_FOR_VERSION[version]}` + +/** Builds a signer for the requested ethers major version and anvil account. */ +function makeSignerForAccount(version: 5 | 6, accountIndex: 0 | 1) { + const rpcUrl = rpcUrlFor(version) + const { privateKey } = ANVIL_ACCOUNTS[accountIndex] + if (version === 5) { + const provider = new ethers.providers.JsonRpcProvider(rpcUrl) + return new ethers.Wallet(privateKey, provider) + } + const provider = new JsonRpcProvider(rpcUrl) + return new Wallet(privateKey, provider) +} + +/** Builds a signer on anvil account #0 for the requested ethers version. */ +function makeSigner(version: 5 | 6) { + return makeSignerForAccount(version, 0) +} + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version", + ({ version }) => { + const anvil = createAnvil({ + forkUrl: FORK_URL, + port: PORT_FOR_VERSION[version], + }) + let tokenboundClient: TokenboundClient + let publicClient: PublicClient + // One signer per version: separate ethers signers on the same account + // track nonces independently and collide. + let signer: ReturnType + + beforeAll(async () => { + await anvil.start() + + publicClient = createPublicClient({ + chain: mainnet, + transport: http(rpcUrlFor(version)), + }) as PublicClient + + // Mint a Zora 721 into the anvil account so it owns the NFT that + // controls the tokenbound account under test. + signer = makeSigner(version) + const mintTx = await signer.sendTransaction({ + to: TOKEN_CONTRACT, + value: 0n, + data: encodeFunctionData({ + abi: ZORA_721_ABI, + functionName: "purchase", + args: [1n], + }), + }) + await mintTx.wait() + + // Read the minted tokenId out of the Transfer log rather than guessing + // from totalSupply, which is not the minted id on this contract. + const mintReceipt = await publicClient.waitForTransactionReceipt({ + hash: mintTx.hash as `0x${string}`, + }) + const transferLog = mintReceipt.logs.find( + (log) => + log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && + log.topics[0] === + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" && + log.topics.length === 4, + ) + if (!transferLog?.topics[3]) { + throw new Error("Could not determine minted tokenId from mint receipt") + } + TOKEN_ID = BigInt(transferLog.topics[3]).toString() + const owner = await publicClient.readContract({ + address: TOKEN_CONTRACT, + abi: ZORA_721_ABI, + functionName: "ownerOf", + args: [BigInt(TOKEN_ID)], + }) + if (owner.toLowerCase() !== ANVIL_ACCOUNTS[0].address.toLowerCase()) { + throw new Error(`Minted token ${TOKEN_ID} is owned by ${owner}`) + } + + tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, + publicClient, + }) + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + }) + + it("detects the correct ethers version", () => { + expect(tokenboundClient.getEthersVersion()).toBe(version) + }) + + it("derives a tokenbound account address", () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + expect(isAddress(account)).toBe(true) + expect(account).toMatch(ADDRESS_REGEX) + }) + + it("derives the same address across both ethers versions", () => { + // Derivation is deterministic and client-independent, so v5 and v6 + // must agree with each other. + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + // Derivation is pure, so a read-only client on the other ethers major + // version must produce the same address. + const other = new TokenboundClient({ + signer: makeSigner(version === 5 ? 6 : 5), + chain: mainnet, + publicClient, + }).getAccount({ tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID }) + expect(account).toBe(other) + }) + + it("honours a custom salt", () => { + const base = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const salted = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + salt: 6551, + }) + expect(salted).not.toBe(base) + }) + + it("prepares a create-account transaction", async () => { + const prepared = await tokenboundClient.prepareCreateAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + expect(prepared.data).toMatch(/^0x/) + expect(prepared.to).toMatch(ADDRESS_REGEX) + }) + + it( + "creates a tokenbound account on-chain", + async () => { + const { account, txHash } = await tokenboundClient.createAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + + expect(account).toMatch(ADDRESS_REGEX) + expect(txHash).toMatch(TX_HASH_REGEX) + + const receipt = await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) + expect(receipt.status).toBe("success") + }, + TIMEOUT, + ) + + it( + "reports the account as deployed after creation", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const isDeployed = await tokenboundClient.checkAccountDeployment({ + accountAddress: account, + }) + expect(isDeployed).toBe(true) + }, + TIMEOUT, + ) + + it( + "deconstructs the deployed account bytecode", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: account, + }) + expect(bytecode).not.toBeNull() + expect(bytecode?.chainId).toBe(mainnet.id) + expect(bytecode?.tokenId).toBe(TOKEN_ID) + }, + TIMEOUT, + ) + + it( + "returns the owning NFT for a deployed account", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const nft = await tokenboundClient.getNFT({ accountAddress: account }) + expect(nft.tokenId).toBe(TOKEN_ID) + expect(nft.chainId).toBe(mainnet.id) + }, + TIMEOUT, + ) + + it( + "prepares an execution against the account", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const prepared = await tokenboundClient.prepareExecution({ + account, + to: ANVIL_ACCOUNTS[1].address, + value: 0n, + data: "0x", + }) + expect(prepared.to).toBe(account) + expect(prepared.data).toMatch(/^0x/) + }, + TIMEOUT, + ) + + it( + "signs a message", + async () => { + const signature = await tokenboundClient.signMessage({ + message: "Sign me", + }) + expect(signature).toMatch(/^0x[a-fA-F0-9]+$/) + }, + TIMEOUT, + ) + + it("rejects out-of-range ERC-20 decimals", async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + await expect( + tokenboundClient.transferERC20({ + account, + recipientAddress: ANVIL_ACCOUNTS[1].address, + amount: 1, + erc20tokenAddress: TOKEN_CONTRACT, + erc20tokenDecimals: 19, + }), + ).rejects.toThrow(/Decimal value out of range/) + }) + + it("rejects ERC721 transfers with an amount other than 1", async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + await expect( + tokenboundClient.transferNFT({ + account, + tokenType: "ERC721", + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + recipientAddress: ANVIL_ACCOUNTS[1].address, + amount: 2, + }), + ).rejects.toThrow(/ERC721 transfers can only transfer one token/) + }) + }, +) diff --git a/packages/ethers/src/test/transfer.test.ts b/packages/ethers/src/test/transfer.test.ts new file mode 100644 index 0000000..5fcc732 --- /dev/null +++ b/packages/ethers/src/test/transfer.test.ts @@ -0,0 +1,175 @@ +// ETH transfer through a tokenbound account, ethers v5 and v6. +// +// Lives in its own file (and therefore its own anvil instances) because the +// flow mints, deploys and spends in sequence: sharing an account's nonce +// stream with another suite makes ethers v6's per-provider nonce cache stale. + +import { createAnvil } from "@viem/anvil" +import { ethers } from "ethers" +import { JsonRpcProvider, Wallet } from "ethers6" +import { + createPublicClient, + createTestClient, + encodeFunctionData, + getAddress, + http, + type PublicClient, + parseAbi, +} from "viem" +import { mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest" + +import { TokenboundClient } from "../index" +import { ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" + +const TIMEOUT = 60000 + +const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const +const ZORA_721_ABI = parseAbi([ + "function purchase(uint256 quantity) external payable returns (uint256)", +]) + +const FORK_URL = + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? + "https://ethereum-rpc.publicnode.com" + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version — ETH transfer", + ({ version }) => { + // Randomized so a lingering anvil from a previous run can't be reused — + // connecting to a stale instance yields already-spent nonces. + const port = + 8600 + Math.floor(Math.random() * 300) + (version === 5 ? 0 : 300) + const rpcUrl = `http://127.0.0.1:${port}` + const anvil = createAnvil({ forkUrl: FORK_URL, port }) + + let publicClient: PublicClient + let testClient: ReturnType + + beforeAll(async () => { + await anvil.start() + publicClient = createPublicClient({ + chain: mainnet, + transport: http(rpcUrl), + }) as PublicClient + testClient = createTestClient({ + chain: mainnet, + mode: "anvil", + transport: http(rpcUrl), + }) + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + }) + + it( + "transfers ETH out of a tokenbound account", + async () => { + const { privateKey } = ANVIL_ACCOUNTS[version === 5 ? 0 : 1] + const signer = + version === 5 + ? new ethers.Wallet( + privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + : new Wallet(privateKey, new JsonRpcProvider(rpcUrl)) + + const client = new TokenboundClient({ + signer, + chain: mainnet, + publicClient, + }) + + // Mint the NFT that will control the account. + const mint = await signer.sendTransaction({ + to: TOKEN_CONTRACT, + value: 0n, + data: encodeFunctionData({ + abi: ZORA_721_ABI, + functionName: "purchase", + args: [1n], + }), + }) + const mintReceipt = await publicClient.waitForTransactionReceipt({ + hash: mint.hash as `0x${string}`, + }) + const transferLog = mintReceipt.logs.find( + (log) => + log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && + log.topics.length === 4, + ) + if (!transferLog?.topics[3]) { + throw new Error("Could not determine minted tokenId") + } + const tokenId = BigInt(transferLog.topics[3]).toString() + + const account = client.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + + await mint.wait() + + const { txHash: createHash } = await client.createAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + await publicClient.waitForTransactionReceipt({ hash: createHash }) + + // Wait until the signer's provider sees the same nonce as the chain; + // ethers v6 caches the pending count and can otherwise reuse it. + const signerAddress = getAddress(await signer.getAddress()) + await vi.waitFor(async () => { + const onChain = await publicClient.getTransactionCount({ + address: signerAddress, + }) + const provider = signer.provider + if (!provider) throw new Error("signer has no provider") + const fromEthers = await provider.getTransactionCount( + signerAddress, + "pending", + ) + expect(fromEthers).toBe(onChain) + }) + + // Fund via anvil rather than a second ethers transaction. + await testClient.setBalance({ address: account, value: 10n ** 18n }) + + // A fresh address nothing else touches, so the credit is unambiguous. + const recipient = getAddress( + "0x000000000000000000000000000000000000d00d", + ) + const recipientBefore = await publicClient.getBalance({ + address: recipient, + }) + const accountBefore = await publicClient.getBalance({ + address: account, + }) + + const txHash = await client.transferETH({ + account, + recipientAddress: recipient, + amount: 0.1, + }) + expect(txHash).toMatch(TX_HASH_REGEX) + + const receipt = await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) + expect(receipt.status).toBe("success") + + const recipientAfter = await publicClient.getBalance({ + address: recipient, + }) + const accountAfter = await publicClient.getBalance({ address: account }) + + // The TBA pays no gas (the signer does), so both sides move by + // exactly the transferred amount. + expect(recipientAfter - recipientBefore).toBe(10n ** 17n) + expect(accountBefore - accountAfter).toBe(10n ** 17n) + }, + TIMEOUT, + ) + }, +) diff --git a/packages/ethers/src/test/v2.test.ts b/packages/ethers/src/test/v2.test.ts new file mode 100644 index 0000000..78b8108 --- /dev/null +++ b/packages/ethers/src/test/v2.test.ts @@ -0,0 +1,256 @@ +// Legacy ERC-6551 V2 deployment coverage for @tokenbound/ethers. +// +// The rest of the suite exercises the default V3 deployment. This file pins +// `version: TBVersion.V2` so the V2-only branches of the client — the legacy +// `prepareExecuteCall`/`executeCall` path, the V3-only guards, and V2 address +// derivation — are exercised on BOTH ethers majors. +// +// Lives in its own file (and its own anvil instances) for the same reason as +// transfer.test.ts: ethers caches pending nonces per provider. + +import { ERC_6551_LEGACY_V2, TBVersion } from "@tokenbound/sdk" +import { createAnvil } from "@viem/anvil" +import { ethers } from "ethers" +import { JsonRpcProvider, Wallet } from "ethers6" +import { + createPublicClient, + encodeFunctionData, + getAddress, + http, + isAddress, + type PublicClient, + parseAbi, +} from "viem" +import { mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../index" +import { ADDRESS_REGEX, ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" + +const TIMEOUT = 60000 + +const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const +const ZORA_721_ABI = parseAbi([ + "function purchase(uint256 quantity) external payable returns (uint256)", +]) + +const FORK_URL = + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? + "https://ethereum-rpc.publicnode.com" + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version — ERC-6551 V2 deployment", + ({ version }) => { + const port = 9000 + (version === 5 ? 0 : 1) + const rpcUrl = `http://127.0.0.1:${port}` + const anvil = createAnvil({ forkUrl: FORK_URL, port }) + + let publicClient: PublicClient + let tokenboundClient: TokenboundClient + let tokenId: string + + beforeAll(async () => { + await anvil.start() + + publicClient = createPublicClient({ + chain: mainnet, + transport: http(rpcUrl), + }) as PublicClient + + const signer = + version === 5 + ? new ethers.Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + : new Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new JsonRpcProvider(rpcUrl), + ) + + // Pin the legacy V2 deployment. + tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, + publicClient, + version: TBVersion.V2, + }) + + // Mint the NFT that controls the account. + const mint = await signer.sendTransaction({ + to: TOKEN_CONTRACT, + value: 0n, + data: encodeFunctionData({ + abi: ZORA_721_ABI, + functionName: "purchase", + args: [1n], + }), + }) + // Await through ethers, not just viem: this is what refreshes ethers' + // cached pending nonce. Confirming only via publicClient leaves the + // signer's view stale and the next send fails with "nonce too low". + await mint.wait() + const receipt = await publicClient.waitForTransactionReceipt({ + hash: mint.hash as `0x${string}`, + }) + const transferLog = receipt.logs.find( + (log) => + log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && + log.topics.length === 4, + ) + if (!transferLog?.topics[3]) { + throw new Error("Could not determine minted tokenId") + } + tokenId = BigInt(transferLog.topics[3]).toString() + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + }) + + it("detects the correct ethers version", () => { + expect(tokenboundClient.getEthersVersion()).toBe(version) + }) + + it("derives a V2 account address", () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + expect(isAddress(account)).toBe(true) + expect(account).toMatch(ADDRESS_REGEX) + }) + + it("derives a different address than the V3 deployment", () => { + const v2Account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + + // Same NFT, default (V3) deployment — must derive elsewhere. + const v3Client = new TokenboundClient({ + signer: + version === 5 + ? new ethers.Wallet( + ANVIL_ACCOUNTS[1].privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + : new Wallet( + ANVIL_ACCOUNTS[1].privateKey, + new JsonRpcProvider(rpcUrl), + ), + chain: mainnet, + publicClient, + }) + + expect( + v3Client.getAccount({ tokenContract: TOKEN_CONTRACT, tokenId }), + ).not.toBe(v2Account) + }) + + it("uses the legacy V2 registry", () => { + // A V2 client must derive against the V2 registry, so its address + // differs from one built on a custom registry. + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + expect(account).toMatch(ADDRESS_REGEX) + expect(ERC_6551_LEGACY_V2.REGISTRY.ADDRESS).toMatch(ADDRESS_REGEX) + }) + + it( + "creates a V2 tokenbound account on-chain", + async () => { + const { account, txHash } = await tokenboundClient.createAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + expect(account).toMatch(ADDRESS_REGEX) + expect(txHash).toMatch(TX_HASH_REGEX) + + const receipt = await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) + expect(receipt.status).toBe("success") + + expect( + await tokenboundClient.checkAccountDeployment({ + accountAddress: account, + }), + ).toBe(true) + }, + TIMEOUT, + ) + + it( + "prepares a legacy executeCall (V2-only path)", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + + const prepared = await tokenboundClient.prepareExecuteCall({ + account, + to: getAddress(ANVIL_ACCOUNTS[1].address), + value: 0n, + data: "0x", + }) + + expect(prepared.to).toBe(account) + expect(prepared.data).toMatch(/^0x/) + }, + TIMEOUT, + ) + + it( + "routes prepareExecution through the V2 executeCall encoding", + async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + const args = { + account, + to: getAddress(ANVIL_ACCOUNTS[1].address), + value: 0n, + data: "0x", + } + + // On a V2 deployment, prepareExecution() must fall back to the + // legacy executeCall encoding. + const viaExecution = await tokenboundClient.prepareExecution(args) + const viaExecuteCall = await tokenboundClient.prepareExecuteCall(args) + + expect(viaExecution.data).toBe(viaExecuteCall.data) + }, + TIMEOUT, + ) + + it("rejects isValidSigner on a V2 deployment", async () => { + const account = tokenboundClient.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + }) + await expect(tokenboundClient.isValidSigner({ account })).rejects.toThrow( + /not supported using the V2 implementation/, + ) + }) + + it("rejects appendedCalls on a V2 deployment", async () => { + await expect( + tokenboundClient.prepareCreateAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId, + appendedCalls: [ + { + target: getAddress(TOKEN_CONTRACT), + allowFailure: false, + callData: "0x", + }, + ], + }), + ).rejects.toThrow(/Multicall via appendedCalls is not supported/) + }) + }, +) diff --git a/packages/ethers/src/types.ts b/packages/ethers/src/types.ts new file mode 100644 index 0000000..643f87b --- /dev/null +++ b/packages/ethers/src/types.ts @@ -0,0 +1,46 @@ +// Structural ethers types. +// +// @tokenbound/ethers never imports ethers itself — ethers is a peer dependency +// supplied by the consumer, and v5/v6 ship incompatible type trees. Describing +// the small surface we actually use structurally keeps the package free of a +// hard dependency on either major version. + +import type { Address, Hex } from "viem" + +/** An ethers v5 or v6 TransactionResponse, narrowed to what we consume. */ +export type EthersTransactionResponse = { + hash: string +} & Record + +/** The subset of an ethers Signer this package relies on. */ +export type EthersSigner = { + sendTransaction: (tx: { + to?: string + value?: bigint | unknown + data?: string + }) => Promise + signMessage: (message: string | Uint8Array) => Promise + getAddress: () => Promise + provider?: EthersProvider | null +} & Record + +/** The subset of an ethers Provider this package relies on. */ +export type EthersProvider = { + call: (tx: { to: string; data: string }) => Promise + getCode: (address: string) => Promise + resolveName?: (name: string) => Promise +} & Record + +/** The detected major version of an ethers object. */ +export type EthersVersion = 5 | 6 + +/** Message shapes accepted by ethers v5's `signMessage`. */ +export type Ethers5SignableMessage = ArrayLike | string +/** Message shapes accepted by ethers v6's `signMessage`. */ +export type Ethers6SignableMessage = string | Uint8Array +/** Any message either ethers major version can sign. */ +export type EthersSignableMessage = + | Ethers5SignableMessage + | Ethers6SignableMessage + +export type { Address, Hex } diff --git a/packages/ethers/src/v5/adapter.ts b/packages/ethers/src/v5/adapter.ts new file mode 100644 index 0000000..960aca7 --- /dev/null +++ b/packages/ethers/src/v5/adapter.ts @@ -0,0 +1,17 @@ +// ethers v5 message normalization. +// +// v5's `signMessage` accepts `Bytes | string`, where `Bytes` is +// `ArrayLike` — so a plain `number[]` is valid, and so is a +// `Uint8Array`. We still convert array-likes to `Uint8Array` so that the same +// input produces the same signature on both majors (v6 rejects `number[]`). + +import type { EthersSignableMessage } from "../types" + +/** Normalizes a message into something ethers v5's `signMessage` accepts. */ +export function normalizeV5Message( + message: EthersSignableMessage, +): string | Uint8Array { + if (typeof message === "string") return message + if (message instanceof Uint8Array) return message + return new Uint8Array(Array.from(message)) +} diff --git a/packages/ethers/src/v6/adapter.ts b/packages/ethers/src/v6/adapter.ts new file mode 100644 index 0000000..b7b5262 --- /dev/null +++ b/packages/ethers/src/v6/adapter.ts @@ -0,0 +1,16 @@ +// ethers v6 message normalization. +// +// v6's `signMessage` accepts `string | Uint8Array` only. `ArrayLike` is +// NOT accepted — passing `number[]` throws "invalid BytesLike value" — so +// array-likes must be converted before the message reaches ethers. + +import type { EthersSignableMessage } from "../types" + +/** Normalizes a message into something ethers v6's `signMessage` accepts. */ +export function normalizeV6Message( + message: EthersSignableMessage, +): string | Uint8Array { + if (typeof message === "string") return message + if (message instanceof Uint8Array) return message + return new Uint8Array(Array.from(message)) +} diff --git a/packages/ethers/tsconfig.json b/packages/ethers/tsconfig.json new file mode 100644 index 0000000..69ee19b --- /dev/null +++ b/packages/ethers/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Bundler", + "strict": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["src"], + "exclude": ["src/test", "src/**/*.test.ts", "src/**/*.spec.ts"] +} diff --git a/packages/ethers/vite.config.ts b/packages/ethers/vite.config.ts new file mode 100644 index 0000000..02e5002 --- /dev/null +++ b/packages/ethers/vite.config.ts @@ -0,0 +1,31 @@ +import { resolve } from "node:path" +import { defineConfig } from "vite" +import dts from "vite-plugin-dts" + +export default defineConfig({ + build: { + lib: { + entry: resolve(__dirname, "src/index.ts"), + name: "tokenbound-ethers", + fileName: "tokenbound-ethers", + }, + sourcemap: true, + rollupOptions: { + // ethers, viem and the core SDK are all consumer-supplied. + external: ["viem", "viem/ens", "ethers", "@tokenbound/sdk"], + output: { + globals: { + viem: "viem", + ethers: "ethers", + "@tokenbound/sdk": "tokenboundSDK", + }, + }, + }, + }, + plugins: [ + dts({ + // Never emit declarations for tests. + exclude: ["src/test/**", "src/**/*.test.ts", "src/**/*.spec.ts"], + }), + ], +}) diff --git a/packages/ethers/vitest.config.ts b/packages/ethers/vitest.config.ts new file mode 100644 index 0000000..6b40d56 --- /dev/null +++ b/packages/ethers/vitest.config.ts @@ -0,0 +1,16 @@ +/// +import { defineConfig } from "vitest/config" + +export default defineConfig({ + test: { + environment: "node", + globals: true, + // ethers signers cache pending nonces per provider instance. Run test + // files sequentially AND in isolated forks, so state from one file's + // signers can never leak into another's. + fileParallelism: false, + sequence: { concurrent: false }, + + exclude: ["**/node_modules/**", "**/dist/**"], + }, +}) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 24e2027..a8613a3 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,19 +1,50 @@ { "name": "@tokenbound/sdk", "version": "0.5.5", + "description": "Viem-first SDK for interacting with ERC-6551 tokenbound accounts.", + "keywords": [ + "ethereum", + "erc6551", + "erc-6551", + "tokenbound", + "nft", + "viem", + "web3" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/tokenbound/sdk.git", + "directory": "packages/sdk" + }, + "homepage": "https://github.com/tokenbound/sdk/tree/main/packages/sdk#readme", + "bugs": { + "url": "https://github.com/tokenbound/sdk/issues" + }, "type": "module", + "sideEffects": false, "files": [ "dist" ], "types": "./dist/src/index.d.ts", - "main": "./dist/tokenbound-sdk.umd.cjs", - "module": "./dist/tokenbound-sdk.js", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "exports": { ".": { - "import": "./dist/tokenbound-sdk.js", - "require": "./dist/tokenbound-sdk.umd.cjs", - "types": "./dist/src/index.d.ts" - } + "types": "./dist/src/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "./viem": { + "types": "./dist/src/viem/index.d.ts", + "import": "./dist/viem.js", + "require": "./dist/viem.cjs" + }, + "./protocol": { + "types": "./dist/src/protocol/index.d.ts", + "import": "./dist/protocol.js", + "require": "./dist/protocol.cjs" + }, + "./package.json": "./package.json" }, "scripts": { "dev": "vite", @@ -30,34 +61,19 @@ "format:fix": "biome format --write ." }, "dependencies": { - "@layerzerolabs/lz-v2-utilities": "^2.3.7", - "viem": "^2.21.32" + "@layerzerolabs/lz-v2-utilities": "^3.0.168", + "viem": "^2.56.5" }, "devDependencies": { - "@biomejs/biome": "1.9.4", - "@tanstack/react-query": "^5.59.15", - "@testing-library/dom": "^10.1.0", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/react": "^15.0.4", - "@testing-library/user-event": "^14.5.2", - "@tokenbound/sdk": "workspace:^", - "@types/react": "^18.3.11", - "@types/testing-library__jest-dom": "^5.14.9", + "@biomejs/biome": "2.5.13", "@viem/anvil": "^0.0.10", - "@vitest/coverage-c8": "^0.33.0", - "@wagmi/cli": "^2.1.16", - "ethers": "^5.7.2", - "forge-std": "1.1.2", - "ethers6": "npm:ethers@^6.12.1", - "jsdom": "^24.0.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "@vitest/coverage-v8": "^1.6.1", + "@wagmi/cli": "^2.10.0", + "rollup-plugin-visualizer": "^5.12.0", "typescript": "^5.4.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20", + "viem": "^2.56.5", "vite": "^4.4.9", "vite-plugin-dts": "^3.9.0", - "vitest": "^1.6.0", - "rollup-plugin-visualizer": "^5.12.0" + "vitest": "^1.6.0" } } diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index 915b67c..34bc166 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -1,79 +1,54 @@ import { - type WalletClient, - type PublicClient, + type Address, type Chain, createPublicClient, - http, - type GetBytecodeReturnType, - hexToNumber, - getAddress, + custom, encodeFunctionData, - parseUnits, - type SignableMessage, - isAddressEqual, + type GetCodeReturnType, + type Hex, + http, numberToHex, - custom, + type PublicClient, + type SignableMessage, + type WalletClient, } from "viem" +import { version as TB_SDK_VERSION } from "../package.json" import { - erc1155Abi, - erc721Abi, - erc20Abi, - multicall3AuthenticatedABI, -} from "../abis" -import { - getAccount, - computeAccount, - createAccount, - getCreationCode, - prepareExecuteCall, - executeCall, - prepareCreateAccount, - getTokenboundV3Account, - prepareCreateTokenboundV3Account, - encodeCrossChainCall, -} from "./functions" + deconstructBytecode as deconstructBytecodeFromHex, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeNFTTransfer, + getAccountAddress, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + VALID_SIGNER_MAGIC_VALUE, +} from "./protocol" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./protocol/constants" +import { createAccount, encodeCrossChainCall } from "./protocol/functions" import { - type AbstractEthersSigner, - type AbstractEthersTransactionResponse, type BytecodeParams, + CALL_OPERATIONS, + type CallData, type CreateAccountParams, type ERC20TransferParams, - type SignMessageParams, type ETHTransferParams, type ExecuteCallParams, + type ExecuteParams, type GetAccountParams, - NFTTokenType, + type MultiCallTx, type NFTTransferParams, - TBVersion, type PrepareCreateAccountParams, type PrepareExecuteCallParams, + type PrepareExecutionParams, type SegmentedERC6551Bytecode, + type SignMessageParams, type TokenboundAccountNFT, type TokenboundClientOptions, - type EthersSignableMessage, - type ExecuteParams, - CALL_OPERATIONS, - type PrepareExecutionParams, type ValidSignerParams, - type MultiCallTx, - type CallData, } from "./types" -import { - chainIdToChain, - segmentBytecode, - normalizeMessage, - isEthers5SignableMessage, - isEthers6SignableMessage, - isViemSignableMessage, - resolvePossibleENS, - getImplementationName, -} from "./utils" -import { - ERC_6551_DEFAULT, - ERC_6551_LEGACY_V2, - MULTICALL_AUTHENTICATED_ADDRESS, -} from "./constants" -import { version as TB_SDK_VERSION } from "../package.json" +import { getImplementationName, resolvePossibleENS } from "./utils" declare global { interface Window { @@ -86,17 +61,12 @@ class TokenboundClient { private chain: Chain public isInitialized = false public publicClient: PublicClient - private supportsV3 = true // Default to V3 implementation - private signer?: AbstractEthersSigner private walletClient?: WalletClient - private implementationAddress: `0x${string}` - private registryAddress: `0x${string}` + private deployment: ResolvedDeployment constructor(options: TokenboundClientOptions) { const { - chainId, chain, - signer, walletClient, publicClient, implementationAddress, @@ -105,13 +75,9 @@ class TokenboundClient { version, } = options - if (!chainId && !chain) { - throw new Error("chain or chainId required.") - } - - if (signer && walletClient) { + if (!chain) { throw new Error( - "Only one of `signer` or `walletClient` should be provided.", + "`chain` is required. Pass a viem Chain (e.g. `import { mainnet } from 'viem/chains'`). Passing only `chainId` is no longer supported: it forced every viem chain into consumer bundles.", ) } @@ -121,22 +87,14 @@ class TokenboundClient { ) } - if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { - throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") - } - - this.chainId = chainId ?? (chain?.id as number) - this.chain = chain ?? chainIdToChain(this.chainId) - - if (signer) { - this.signer = signer - } else if (walletClient) { - this.walletClient = walletClient - } + this.chainId = chain.id + this.chain = chain + this.walletClient = walletClient - // Use a custom publicClient if provided - // If a walletClient is provided, use its transport so publicClient can share the connection - // Otherwise create a new one, specifying a custom RPC URL if provided but defaulting to the default viem http() RPC URL + // Use a custom publicClient if provided. + // If a walletClient is provided, use its transport so publicClient can share the connection. + // Otherwise create a new one, specifying a custom RPC URL if provided but + // defaulting to the default viem http() RPC URL. this.publicClient = publicClient ?? createPublicClient({ @@ -147,24 +105,11 @@ class TokenboundClient { : http(publicClientRPCUrl ?? undefined), }) - this.registryAddress = registryAddress ?? ERC_6551_DEFAULT.REGISTRY.ADDRESS - this.implementationAddress = - implementationAddress ?? ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS - - // If legacy V2 implementation is in use, use V2 registry (unless custom registry is provided) - const isV2 = - (version && version === TBVersion.V2) || - (implementationAddress && - isAddressEqual( - implementationAddress, - ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS, - )) - - if (isV2) { - this.supportsV3 = false - if (!registryAddress) - this.registryAddress = ERC_6551_LEGACY_V2.REGISTRY.ADDRESS - } + this.deployment = resolveDeployment({ + implementationAddress, + registryAddress, + version, + }) this.isInitialized = true @@ -174,6 +119,30 @@ class TokenboundClient { } } + /** Throws unless a walletClient was supplied. */ + private requireWalletClient(): WalletClient { + if (!this.walletClient) { + throw new Error("No wallet client available.") + } + return this.walletClient + } + + /** + * Sends a prepared transaction via the wallet client, filling in the chain + * and account that are optional at WalletClient construction time. + */ + private async sendTransaction(tx: CallData | MultiCallTx): Promise { + const walletClient = this.requireWalletClient() + if (!walletClient.account) { + throw new Error("No account available on the wallet client.") + } + return await walletClient.sendTransaction({ + ...tx, + chain: this.chain, + account: walletClient.account, + } as Parameters[0]) + } + /** * Returns the SDK's package version. * @returns The version of the SDK. @@ -188,16 +157,11 @@ class TokenboundClient { * @param {string} params.tokenId The token ID. * @returns The tokenbound account address. */ - public getAccount(params: GetAccountParams): `0x${string}` { + public getAccount(params: GetAccountParams): Address { const { tokenContract, tokenId, salt = 0, chainId = this.chainId } = params - const getAcct = this.supportsV3 ? getTokenboundV3Account : computeAccount - return getAcct( - tokenContract, - tokenId, - chainId, - this.implementationAddress, - this.registryAddress, - salt, + return getAccountAddress( + { tokenContract, tokenId, chainId, salt }, + this.deployment, ) } @@ -205,15 +169,11 @@ class TokenboundClient { * Returns the prepared transaction to create a tokenbound account for a given token contract and token ID. * @param {`0x${string}`} params.tokenContract The address of the token contract. * @param {string} params.tokenId The token ID. - * @returns The prepared transaction to create a tokenbound account. Can be sent via `sendTransaction` on an Ethers signer or viem WalletClient. + * @returns The prepared transaction to create a tokenbound account. Can be sent via `sendTransaction` on a viem WalletClient. */ public async prepareCreateAccount( params: PrepareCreateAccountParams, ): Promise { - if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { - throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") - } - const { tokenContract, tokenId, @@ -222,78 +182,10 @@ class TokenboundClient { appendedCalls = [], } = params - const getAcct = this.supportsV3 ? getTokenboundV3Account : computeAccount - - const computedAcct = getAcct( - tokenContract, - tokenId, - chainId, - this.implementationAddress, - this.registryAddress, - salt, + return await prepareCreateAccountTx( + { tokenContract, tokenId, chainId, salt, appendedCalls }, + this.deployment, ) - - const isCustomImplementation = ![ - ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS, - ERC_6551_DEFAULT.IMPLEMENTATION.ADDRESS, - ].includes(getAddress(this.implementationAddress)) - - const prepareBasicCreateAccount = this.supportsV3 - ? prepareCreateTokenboundV3Account - : prepareCreateAccount - - const preparedBasicCreateAccount = await prepareBasicCreateAccount( - tokenContract, - tokenId, - chainId, - this.implementationAddress, - this.registryAddress, - salt, - ) - - if ( - appendedCalls.length > 0 && - (!this.supportsV3 || isCustomImplementation) - ) { - throw new Error( - "Multicall via appendedCalls is not supported using the legacy V2 implementation or custom implementations", - ) - } - - if (isCustomImplementation) { - // Don't initialize for custom implementations. Allow third-party handling of initialization. - return preparedBasicCreateAccount - } - // For standard implementations, use the multicall3 aggregate function to create and initialize the account in one transaction - return { - to: MULTICALL_AUTHENTICATED_ADDRESS, - value: BigInt(0), - data: encodeFunctionData({ - abi: multicall3AuthenticatedABI, - functionName: "aggregate3", - args: [ - [ - { - target: this.registryAddress, - allowFailure: false, - callData: preparedBasicCreateAccount.data, - }, - { - target: computedAcct, - allowFailure: false, - callData: encodeFunctionData({ - abi: ERC_6551_DEFAULT.ACCOUNT_PROXY?.ABI, - functionName: "initialize", - args: [ERC_6551_DEFAULT.IMPLEMENTATION?.ADDRESS], - }), - }, - // Append Multicall3 calls, so the newly-created Tokenbound account - // can be used to execute calls immediately after creation - ...appendedCalls, - ], - ], - }), - } as MultiCallTx } /** @@ -304,7 +196,7 @@ class TokenboundClient { */ public async createAccount( params: CreateAccountParams, - ): Promise<{ account: `0x${string}`; txHash: `0x${string}` }> { + ): Promise<{ account: Address; txHash: Hex }> { const { tokenContract, tokenId, @@ -312,18 +204,15 @@ class TokenboundClient { chainId = this.chainId, appendedCalls = [], } = params - let txHash: `0x${string}` | undefined - const getAcct = this.supportsV3 ? getTokenboundV3Account : computeAccount + const walletClient = this.requireWalletClient() - const computedAcct = getAcct( + const computedAcct = this.getAccount({ tokenContract, tokenId, chainId, - this.implementationAddress, - this.registryAddress, salt, - ) + }) const preparedCreateAccount = await this.prepareCreateAccount({ tokenContract, @@ -333,38 +222,22 @@ class TokenboundClient { appendedCalls, }) - if (this.signer) { - txHash = (await this.signer - .sendTransaction(preparedCreateAccount) - .then( - (tx: AbstractEthersTransactionResponse) => tx.hash, - )) as `0x${string}` - } else if (this.walletClient) { - txHash = this.supportsV3 - ? await this.walletClient.sendTransaction({ - ...preparedCreateAccount, - chain: this.chain, - // biome-ignore lint/style/noNonNullAssertion: Should exist - account: this.walletClient?.account?.address!, - }) // @BJ TODO: extract into viemV3? - : await createAccount( - tokenContract, - tokenId, - this.walletClient, - this.implementationAddress, - this.registryAddress, - salt, - chainId, - ) - } + const txHash = this.deployment.supportsV3 + ? await this.sendTransaction(preparedCreateAccount) + : await createAccount( + tokenContract, + tokenId, + walletClient, + this.deployment.implementationAddress, + this.deployment.registryAddress, + salt, + chainId, + ) - if (txHash) { - return { - account: computedAcct, - txHash, - } + return { + account: computedAcct, + txHash, } - throw new Error("No wallet client or signer available.") } /** @@ -373,20 +246,20 @@ class TokenboundClient { * @param {string} params.to The recipient address * @param {bigint} params.value The value to send, in wei * @param {string} params.data The data to send - * @returns a Promise with prepared transaction to execute a call on a tokenbound account. Can be sent via `sendTransaction` on a viem WalletClient or Ethers signer. + * @returns a Promise with prepared transaction to execute a call on a tokenbound account. Can be sent via `sendTransaction` on a viem WalletClient. * @deprecated this method is deprecated, but still available for use with legacy V2 deployments. Use prepareExecution() instead. */ public async prepareExecuteCall( params: PrepareExecuteCallParams, ): Promise { - if (this.supportsV3) { + if (this.deployment.supportsV3) { throw new Error( "prepareExecuteCall() is not supported on V3 implementation deployments, use prepareExecution() instead.", ) } const { account, to, value, data } = params - return prepareExecuteCall(account, to, value, data) + return await encodeExecuteCall({ account, to, value, data }) } /** @@ -398,32 +271,9 @@ class TokenboundClient { * @returns a Promise that resolves to the transaction hash of the executed call * @deprecated this method is deprecated, but still available for use with legacy V2 deployments. Use execute() instead. */ - public async executeCall(params: ExecuteCallParams): Promise<`0x${string}`> { + public async executeCall(params: ExecuteCallParams): Promise { const preparedExecuteCall = await this.prepareExecuteCall(params) - - if (this.supportsV3) { - throw new Error( - "executeCall() is not supported on V3 implementation deployments, use execute() instead.", - ) - } - if (this.signer) { - return (await this.signer - .sendTransaction(preparedExecuteCall) - .then( - (tx: AbstractEthersTransactionResponse) => tx.hash, - )) as `0x${string}` - } - if (this.walletClient) { - return await this.walletClient.sendTransaction({ - // chain and account need to be added explicitly - // because they're optional when instantiating a WalletClient - chain: this.chain, - // biome-ignore lint/style/noNonNullAssertion: Should exist - account: this.walletClient.account!, - ...preparedExecuteCall, - }) - } - throw new Error("No wallet client or signer available.") + return await this.sendTransaction(preparedExecuteCall) } /** @@ -432,17 +282,15 @@ class TokenboundClient { * @param {string} params.to The contract address to execute the call on * @param {bigint} params.value The value to send, in wei * @param {string} params.data The encoded operation calldata to send - * @returns a Promise with prepared transaction to execute on a tokenbound account. Can be sent via `sendTransaction` on a viem WalletClient or Ethers signer. + * @returns a Promise with prepared transaction to execute on a tokenbound account. Can be sent via `sendTransaction` on a viem WalletClient. */ public async prepareExecution( params: PrepareExecutionParams, ): Promise { - // operation?: CallOperation // The type of operation to perform ( CALL: 0, DELEGATECALL: 1, CREATE: 2, CREATE2: 3) const { account, to, value, data, chainId = this.chainId } = params const operation = CALL_OPERATIONS.CALL - if (!this.supportsV3) { - // const { operation, ...rest } = params + if (!this.deployment.supportsV3) { return await this.prepareExecuteCall(params) } @@ -460,7 +308,7 @@ class TokenboundClient { account, to, value, - data: data as `0x${string}`, + data: data as Hex, originChainId: this.chainId, destinationChainId: chainId, }) @@ -490,32 +338,13 @@ class TokenboundClient { * @param {string} params.data The encoded operation calldata to send * @returns a Promise that resolves to the transaction hash of the executed call */ - public async execute(params: ExecuteParams): Promise<`0x${string}`> { - if (!this.supportsV3) { - // const { operation, ...rest } = params + public async execute(params: ExecuteParams): Promise { + if (!this.deployment.supportsV3) { return await this.executeCall(params) } const preparedExecution = await this.prepareExecution(params) - - if (this.signer) { - return (await this.signer - .sendTransaction(preparedExecution) - .then( - (tx: AbstractEthersTransactionResponse) => tx.hash, - )) as `0x${string}` - } - if (this.walletClient) { - return await this.walletClient.sendTransaction({ - // chain and account need to be added explicitly - // because they're optional when instantiating a WalletClient - chain: this.chain, - // biome-ignore lint/style/noNonNullAssertion: Should exist - account: this.walletClient.account!, - ...preparedExecution, - }) - } - throw new Error("No wallet client or signer available.") + return await this.sendTransaction(preparedExecution) } /** @@ -524,16 +353,11 @@ class TokenboundClient { * @returns a Promise that resolves to true if the account is a valid signer, otherwise false */ public async isValidSigner({ account }: ValidSignerParams): Promise { - const { signer, walletClient } = this + const walletClient = this.requireWalletClient() const data = numberToHex(0, { size: 32 }) - const VALID_SIGNER_MAGIC_VALUE = "0x523e3260" // isValidSigner MUST return this bytes4 magic value if the given signer is valid - const walletAddress: `0x${string}` = - walletClient?.account?.address ?? signer?.address - if (!signer && !walletClient) { - throw new Error("No signer or wallet client available.") - } + const walletAddress = walletClient.account?.address - if (!this.supportsV3) { + if (!this.deployment.supportsV3) { throw new Error( "isValidSigner is not supported using the V2 implementation", ) @@ -558,8 +382,8 @@ class TokenboundClient { accountAddress, }: BytecodeParams): Promise { return await this.publicClient - .getBytecode({ address: accountAddress }) - .then((bytecode: GetBytecodeReturnType) => { + .getCode({ address: accountAddress }) + .then((bytecode: GetCodeReturnType) => { return bytecode ? bytecode.length > 2 : false }) } @@ -572,45 +396,11 @@ class TokenboundClient { public async deconstructBytecode({ accountAddress, }: BytecodeParams): Promise { - const rawBytecode = await this.publicClient.getBytecode({ + const rawBytecode = await this.publicClient.getCode({ address: accountAddress, }) - const bytecode = rawBytecode?.slice(2) - - if (!bytecode || !rawBytecode || !(rawBytecode.length > 2)) return null - - const [ - erc1167Header, - rawImplementationAddress, - erc1167Footer, - rawSalt, - rawChainId, - rawTokenContract, - rawTokenId, - ] = segmentBytecode(bytecode, 10, 20, 15, 32, 32, 32, 32) - - const chainId = hexToNumber(`0x${rawChainId}`, { size: 32 }) - const implementationAddress: `0x${string}` = getAddress( - `0x${rawImplementationAddress}`, - ) - const salt = hexToNumber(`0x${rawSalt}`, { size: 32 }) - const tokenContract: `0x${string}` = getAddress( - `0x${rawTokenContract.slice( - rawTokenContract.length - 40, - rawTokenContract.length, - )}`, - ) - const tokenId = hexToNumber(`0x${rawTokenId}`, { size: 32 }).toString() - return { - erc1167Header, - implementationAddress, - erc1167Footer, - salt, - tokenId, - tokenContract, - chainId, - } + return deconstructBytecodeFromHex(rawBytecode) } /** @@ -639,7 +429,7 @@ class TokenboundClient { } /** - * Executes a transaction call on a tokenbound account + * Executes an NFT transfer call on a tokenbound account * @param {string} params.account The tokenbound account address * @param {string} params.tokenType The type of token, either 'ERC721' or 'ERC1155' * @param {string} params.tokenContract The address of the token contract @@ -648,7 +438,7 @@ class TokenboundClient { * @param {string} params.amount The amount of tokens to transfer, (eg. 1 NFT = 1). Defaults to 1. 1155 only. * @returns a Promise that resolves to the transaction hash of the executed call */ - public async transferNFT(params: NFTTransferParams): Promise<`0x${string}`> { + public async transferNFT(params: NFTTransferParams): Promise { const { account: tbAccountAddress, tokenType, @@ -659,47 +449,22 @@ class TokenboundClient { chainId, } = params - const is1155: boolean = tokenType === NFTTokenType.ERC1155 - - if (!is1155 && amount !== 1) { - throw new Error("ERC721 transfers can only transfer one token at a time.") - } - try { const recipient = await resolvePossibleENS( this.publicClient, recipientAddress, ) - // Configure required args based on token type - // ERC1155: safeTransferFrom(address,address,uint256,uint256,bytes) - // ERC721: safeTransferFrom(address,address,uint256) - const sharedArgs = [tbAccountAddress, recipient, tokenId] - const transferArgs: unknown[] = is1155 - ? [...sharedArgs, amount, "0x"] - : sharedArgs - - const transferCallData = encodeFunctionData({ - abi: is1155 ? erc1155Abi : erc721Abi, - functionName: "safeTransferFrom", - args: transferArgs, - }) - - const execution = { + const transfer = encodeNFTTransfer({ account: tbAccountAddress, - to: tokenContract, - value: BigInt(0), - data: transferCallData, - } - - if (this.supportsV3) { - return await this.execute({ - ...execution, - chainId, - }) - } + tokenType, + tokenContract, + tokenId, + recipient, + amount, + }) - return await this.executeCall(execution) + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } catch (error) { console.log(error) throw error @@ -713,14 +478,13 @@ class TokenboundClient { * @param {string} params.recipientAddress The address to which the ETH should be transferred * @returns a Promise that resolves to the transaction hash of the executed call */ - public async transferETH(params: ETHTransferParams): Promise<`0x${string}`> { + public async transferETH(params: ETHTransferParams): Promise { const { account: tbAccountAddress, amount, recipientAddress, chainId, } = params - const weiValue = parseUnits(`${amount}`, 18) // convert ETH to wei try { const recipient = await resolvePossibleENS( @@ -728,20 +492,9 @@ class TokenboundClient { recipientAddress, ) - const execution = { - account: tbAccountAddress, - to: recipient, - value: weiValue, - data: "0x", - } + const transfer = encodeETHTransfer({ recipient, amount }) - if (this.supportsV3) { - return await this.execute({ - ...execution, - chainId, - }) - } - return await this.executeCall(execution) + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } catch (err) { console.log(err) throw err @@ -757,9 +510,7 @@ class TokenboundClient { * @param {string} params.erc20tokenDecimals The decimal specification of the ERC-20 token * @returns a Promise that resolves to the transaction hash of the executed call */ - public async transferERC20( - params: ERC20TransferParams, - ): Promise<`0x${string}`> { + public async transferERC20(params: ERC20TransferParams): Promise { const { account: tbAccountAddress, amount, @@ -769,79 +520,68 @@ class TokenboundClient { chainId, } = params + // Validate decimals before any network access, preserving prior behavior. if (erc20tokenDecimals < 0 || erc20tokenDecimals > 18) throw new Error("Decimal value out of range. Should be between 0 and 18.") - const amountBaseUnit = parseUnits(`${amount}`, erc20tokenDecimals) - try { const recipient = await resolvePossibleENS( this.publicClient, recipientAddress, ) - const callData = encodeFunctionData({ - abi: erc20Abi, - functionName: "transfer", - args: [recipient, amountBaseUnit], + const transfer = encodeERC20Transfer({ + recipient, + amount, + erc20tokenAddress, + erc20tokenDecimals, }) - const execution = { - account: tbAccountAddress, - to: erc20tokenAddress, - value: 0n, - data: callData, - } - - if (this.supportsV3) { - return await this.execute({ - ...execution, - chainId, - }) - } - return await this.executeCall(execution) + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } catch (error) { console.log(error) throw error } } + /** Routes an encoded transfer through execute() or the legacy executeCall(). */ + private async executeTransfer( + account: Address, + transfer: { to: Address; value: bigint; data: Hex }, + chainId?: number, + ): Promise { + const execution = { account, ...transfer } + + if (this.deployment.supportsV3) { + return await this.execute({ ...execution, chainId }) + } + return await this.executeCall(execution) + } + /** * Calculates an Ethereum-specific signature * @param {string} params.message The message to be signed * @returns a Promise that resolves to a signed Hex string */ - public async signMessage(params: SignMessageParams): Promise<`0x${string}`> { + public async signMessage(params: SignMessageParams): Promise { const { message } = params + const walletClient = this.requireWalletClient() try { - if (this.signer) { - // Normalize message for Ethers 5 and 6 compatibility - if (!isEthers5SignableMessage && !isEthers6SignableMessage) { - throw new Error("Message is not a valid Ethers signable message.") - } - const normalizedMessage = normalizeMessage( - message as EthersSignableMessage, - ) - return await this.signer.signMessage(normalizedMessage) - } - if (this.walletClient) { - if (!isViemSignableMessage(message)) { - throw new Error("Message is not a valid viem signable message.") - } - return await this.walletClient.signMessage({ - // biome-ignore lint/style/noNonNullAssertion: Should exist - account: this.walletClient.account!, - message: message as SignableMessage, - }) + if (!walletClient.account) { + throw new Error("No account available on the wallet client.") } - throw new Error("No wallet client or signer available.") + return await walletClient.signMessage({ + account: walletClient.account, + message: message as SignableMessage, + }) } catch (error) { console.log(error) throw error } } } + const erc6551AccountAbiV2 = ERC_6551_LEGACY_V2.IMPLEMENTATION.ABI const erc6551RegistryAbiV2 = ERC_6551_LEGACY_V2.REGISTRY.ABI const erc6551AccountAbiV3 = ERC_6551_DEFAULT.IMPLEMENTATION.ABI @@ -849,16 +589,10 @@ const erc6551AccountProxyAbiV3 = ERC_6551_DEFAULT.ACCOUNT_PROXY?.ABI const erc6551RegistryAbiV3 = ERC_6551_DEFAULT.REGISTRY.ABI export { - TokenboundClient, erc6551AccountAbiV2, - erc6551RegistryAbiV2, erc6551AccountAbiV3, erc6551AccountProxyAbiV3, + erc6551RegistryAbiV2, erc6551RegistryAbiV3, - getAccount, - createAccount, - getCreationCode, - computeAccount, - prepareExecuteCall, - executeCall, + TokenboundClient, } diff --git a/packages/sdk/src/functions/index.ts b/packages/sdk/src/functions/index.ts deleted file mode 100644 index d573579..0000000 --- a/packages/sdk/src/functions/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./viemV2" -export * from "./viemV3" -export * from "./crossChain" diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 5791d34..c2a8a2d 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,84 +1,68 @@ -import { erc6551AccountAbiV2, erc6551RegistryAbiV2 } from "../abis" +// @tokenbound/sdk — viem-first ERC-6551 SDK. +// +// Ethers v5/v6 support lives in the separate @tokenbound/ethers package, which +// builds on the same library-independent protocol layer exported here. -import { - getAccount, +// Library-independent protocol layer: deterministic derivation and pure +// calldata encoding, usable without any client. +export { computeAccount, - createAccount, + deconstructBytecode, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeExecution, + encodeNFTTransfer, + getAccountAddress, getCreationCode, - prepareExecuteCall, + isCustomImplementation, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + VALID_SIGNER_MAGIC_VALUE, +} from "./protocol" +export { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./protocol/constants" + +// Legacy standalone functions, retained for backwards compatibility. +export { + createAccount, executeCall, + getAccount, prepareCreateAccount, -} from "./functions" - -import { - type TokenboundAccountNFT, - type TokenboundClientOptions, - type GetAccountParams, - type TBAccountParams, - type PrepareCreateAccountParams, - type CreateAccountParams, - type PrepareExecuteCallParams, - type ExecuteCallParams, - type SignMessageParams, - type ComputeAccountParams, - type GetCreationCodeParams, - type ERC20TransferParams, - type ETHTransferParams, - type NFTTransferParams, - type BytecodeParams, - type TBImplementationVersion, - TBVersion, - type MultiCallTx, - type Call3, - CALL_OPERATIONS, - type SegmentedERC6551Bytecode, - type CallData, -} from "./types" - -import { - TokenboundClient, - erc6551AccountAbiV3, - erc6551AccountProxyAbiV3, - erc6551RegistryAbiV3, -} from "./TokenboundClient" - + prepareExecuteCall, +} from "./protocol/functions" export { - TokenboundClient, - TBVersion, erc6551AccountAbiV2, - erc6551RegistryAbiV2, erc6551AccountAbiV3, erc6551AccountProxyAbiV3, + erc6551RegistryAbiV2, erc6551RegistryAbiV3, - getAccount, - computeAccount, - prepareCreateAccount, - createAccount, - getCreationCode, - prepareExecuteCall, - executeCall, - CALL_OPERATIONS, -} - + TokenboundClient, +} from "./TokenboundClient" export type { - TokenboundClientOptions, - TokenboundAccountNFT, - GetAccountParams, - TBAccountParams, - PrepareCreateAccountParams, - CreateAccountParams, - PrepareExecuteCallParams, - ExecuteCallParams, - ComputeAccountParams, - GetCreationCodeParams, BytecodeParams, - SignMessageParams, + Call3, + CallData, + ComputeAccountParams, + CreateAccountParams, ERC20TransferParams, ETHTransferParams, - NFTTransferParams, - TBImplementationVersion, + ExecuteCallParams, + ExecuteParams, + GetAccountParams, + GetCreationCodeParams, MultiCallTx, - Call3, - CallData, + NFTTransferParams, + PrepareCreateAccountParams, + PrepareExecuteCallParams, + PrepareExecutionParams, + Prettify, SegmentedERC6551Bytecode, -} + SignMessageParams, + TBAccountParams, + TBImplementationVersion, + TokenboundAccountNFT, + TokenboundClientOptions, + ValidSignerParams, +} from "./types" +export { CALL_OPERATIONS, TBVersion } from "./types" diff --git a/packages/sdk/abis/ERC1155.ts b/packages/sdk/src/protocol/abis/ERC1155.ts similarity index 100% rename from packages/sdk/abis/ERC1155.ts rename to packages/sdk/src/protocol/abis/ERC1155.ts diff --git a/packages/sdk/abis/ERC20.ts b/packages/sdk/src/protocol/abis/ERC20.ts similarity index 100% rename from packages/sdk/abis/ERC20.ts rename to packages/sdk/src/protocol/abis/ERC20.ts diff --git a/packages/sdk/abis/ERC6551RegistryV2.json b/packages/sdk/src/protocol/abis/ERC6551RegistryV2.json similarity index 100% rename from packages/sdk/abis/ERC6551RegistryV2.json rename to packages/sdk/src/protocol/abis/ERC6551RegistryV2.json diff --git a/packages/sdk/abis/ERC721.ts b/packages/sdk/src/protocol/abis/ERC721.ts similarity index 100% rename from packages/sdk/abis/ERC721.ts rename to packages/sdk/src/protocol/abis/ERC721.ts diff --git a/packages/sdk/abis/IERC6551AccountV2.json b/packages/sdk/src/protocol/abis/IERC6551AccountV2.json similarity index 100% rename from packages/sdk/abis/IERC6551AccountV2.json rename to packages/sdk/src/protocol/abis/IERC6551AccountV2.json diff --git a/packages/sdk/abis/MultiCallAuthenticated.ts b/packages/sdk/src/protocol/abis/MultiCallAuthenticated.ts similarity index 100% rename from packages/sdk/abis/MultiCallAuthenticated.ts rename to packages/sdk/src/protocol/abis/MultiCallAuthenticated.ts diff --git a/packages/sdk/src/protocol/abis/erc6551V3.ts b/packages/sdk/src/protocol/abis/erc6551V3.ts new file mode 100644 index 0000000..4c0e5b5 --- /dev/null +++ b/packages/sdk/src/protocol/abis/erc6551V3.ts @@ -0,0 +1,627 @@ +// ERC-6551 V3 protocol ABIs. +// Relocated out of src/test/wagmi-cli-hooks/generated.ts so that production code +// never imports from the test tree (which also carries Zora/WETH test fixtures). + +export const erc6551AccountProxyV3ABI = [ + { + stateMutability: "nonpayable", + type: "constructor", + inputs: [ + { name: "_guardian", internalType: "address", type: "address" }, + { + name: "_initialImplementation", + internalType: "address", + type: "address", + }, + ], + }, + { type: "error", inputs: [], name: "AlreadyInitialized" }, + { type: "error", inputs: [], name: "InvalidImplementation" }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "previousAdmin", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "newAdmin", + internalType: "address", + type: "address", + indexed: false, + }, + ], + name: "AdminChanged", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "beacon", + internalType: "address", + type: "address", + indexed: true, + }, + ], + name: "BeaconUpgraded", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "implementation", + internalType: "address", + type: "address", + indexed: true, + }, + ], + name: "Upgraded", + }, + { stateMutability: "payable", type: "fallback" }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "implementation", internalType: "address", type: "address" }, + ], + name: "initialize", + outputs: [], + }, + { stateMutability: "payable", type: "receive" }, +] as const + +export const erc6551AccountV3ABI = [ + { + stateMutability: "nonpayable", + type: "constructor", + inputs: [ + { name: "entryPoint_", internalType: "address", type: "address" }, + { name: "multicallForwarder", internalType: "address", type: "address" }, + { name: "erc6551Registry", internalType: "address", type: "address" }, + { name: "guardian", internalType: "address", type: "address" }, + ], + }, + { type: "error", inputs: [], name: "AccountLocked" }, + { type: "error", inputs: [], name: "ContractCreationFailed" }, + { type: "error", inputs: [], name: "ExceedsMaxLockTime" }, + { type: "error", inputs: [], name: "InvalidAccountProof" }, + { type: "error", inputs: [], name: "InvalidERC6551Registry" }, + { type: "error", inputs: [], name: "InvalidEntryPoint" }, + { type: "error", inputs: [], name: "InvalidImplementation" }, + { type: "error", inputs: [], name: "InvalidInput" }, + { type: "error", inputs: [], name: "InvalidMulticallForwarder" }, + { type: "error", inputs: [], name: "InvalidOperation" }, + { type: "error", inputs: [], name: "NotAuthorized" }, + { type: "error", inputs: [], name: "OwnershipCycle" }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "previousAdmin", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "newAdmin", + internalType: "address", + type: "address", + indexed: false, + }, + ], + name: "AdminChanged", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "beacon", + internalType: "address", + type: "address", + indexed: true, + }, + ], + name: "BeaconUpgraded", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "lockedUntil", + internalType: "uint256", + type: "uint256", + indexed: false, + }, + ], + name: "LockUpdated", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "owner", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "selector", + internalType: "bytes4", + type: "bytes4", + indexed: false, + }, + { + name: "implementation", + internalType: "address", + type: "address", + indexed: false, + }, + ], + name: "OverrideUpdated", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "owner", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "caller", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "hasPermission", + internalType: "bool", + type: "bool", + indexed: false, + }, + ], + name: "PermissionUpdated", + }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "implementation", + internalType: "address", + type: "address", + indexed: true, + }, + ], + name: "Upgraded", + }, + { stateMutability: "payable", type: "fallback" }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "entryPoint", + outputs: [ + { name: "", internalType: "contract IEntryPoint", type: "address" }, + ], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "erc6551Registry", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "payable", + type: "function", + inputs: [ + { name: "to", internalType: "address", type: "address" }, + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "data", internalType: "bytes", type: "bytes" }, + { name: "operation", internalType: "uint8", type: "uint8" }, + ], + name: "execute", + outputs: [{ name: "", internalType: "bytes", type: "bytes" }], + }, + { + stateMutability: "payable", + type: "function", + inputs: [ + { + name: "operations", + internalType: "struct BatchExecutor.Operation[]", + type: "tuple[]", + components: [ + { name: "to", internalType: "address", type: "address" }, + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "data", internalType: "bytes", type: "bytes" }, + { name: "operation", internalType: "uint8", type: "uint8" }, + ], + }, + ], + name: "executeBatch", + outputs: [{ name: "", internalType: "bytes[]", type: "bytes[]" }], + }, + { + stateMutability: "payable", + type: "function", + inputs: [ + { name: "to", internalType: "address", type: "address" }, + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "data", internalType: "bytes", type: "bytes" }, + { name: "operation", internalType: "uint8", type: "uint8" }, + { + name: "proof", + internalType: "struct NestedAccountExecutor.ERC6551AccountInfo[]", + type: "tuple[]", + components: [ + { name: "salt", internalType: "bytes32", type: "bytes32" }, + { name: "tokenContract", internalType: "address", type: "address" }, + { name: "tokenId", internalType: "uint256", type: "uint256" }, + ], + }, + ], + name: "executeNested", + outputs: [{ name: "", internalType: "bytes", type: "bytes" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "to", internalType: "address", type: "address" }, + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "data", internalType: "bytes", type: "bytes" }, + ], + name: "extcall", + outputs: [{ name: "result", internalType: "bytes", type: "bytes" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "bytecode", internalType: "bytes", type: "bytes" }, + ], + name: "extcreate", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "value", internalType: "uint256", type: "uint256" }, + { name: "salt", internalType: "bytes32", type: "bytes32" }, + { name: "bytecode", internalType: "bytes", type: "bytes" }, + ], + name: "extcreate2", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [{ name: "slot", internalType: "bytes32", type: "bytes32" }], + name: "extsload", + outputs: [{ name: "value", internalType: "bytes32", type: "bytes32" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "getNonce", + outputs: [{ name: "", internalType: "uint256", type: "uint256" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "isLocked", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [{ name: "forwarder", internalType: "address", type: "address" }], + name: "isTrustedForwarder", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "hash", internalType: "bytes32", type: "bytes32" }, + { name: "signature", internalType: "bytes", type: "bytes" }, + ], + name: "isValidSignature", + outputs: [{ name: "magicValue", internalType: "bytes4", type: "bytes4" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "signer", internalType: "address", type: "address" }, + { name: "data", internalType: "bytes", type: "bytes" }, + ], + name: "isValidSigner", + outputs: [{ name: "magicValue", internalType: "bytes4", type: "bytes4" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "_lockedUntil", internalType: "uint256", type: "uint256" }, + ], + name: "lock", + outputs: [], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "lockedUntil", + outputs: [{ name: "", internalType: "uint256", type: "uint256" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "uint256[]", type: "uint256[]" }, + { name: "", internalType: "uint256[]", type: "uint256[]" }, + { name: "", internalType: "bytes", type: "bytes" }, + ], + name: "onERC1155BatchReceived", + outputs: [{ name: "", internalType: "bytes4", type: "bytes4" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "uint256", type: "uint256" }, + { name: "", internalType: "uint256", type: "uint256" }, + { name: "", internalType: "bytes", type: "bytes" }, + ], + name: "onERC1155Received", + outputs: [{ name: "", internalType: "bytes4", type: "bytes4" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "address", type: "address" }, + { name: "tokenId", internalType: "uint256", type: "uint256" }, + { name: "", internalType: "bytes", type: "bytes" }, + ], + name: "onERC721Received", + outputs: [{ name: "", internalType: "bytes4", type: "bytes4" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "bytes4", type: "bytes4" }, + ], + name: "overrides", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "owner", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "", internalType: "address", type: "address" }, + { name: "", internalType: "address", type: "address" }, + ], + name: "permissions", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "proxiableUUID", + outputs: [{ name: "", internalType: "bytes32", type: "bytes32" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "selectors", internalType: "bytes4[]", type: "bytes4[]" }, + { name: "implementations", internalType: "address[]", type: "address[]" }, + ], + name: "setOverrides", + outputs: [], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "callers", internalType: "address[]", type: "address[]" }, + { name: "_permissions", internalType: "bool[]", type: "bool[]" }, + ], + name: "setPermissions", + outputs: [], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "state", + outputs: [{ name: "", internalType: "uint256", type: "uint256" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [{ name: "interfaceId", internalType: "bytes4", type: "bytes4" }], + name: "supportsInterface", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + }, + { + stateMutability: "view", + type: "function", + inputs: [], + name: "token", + outputs: [ + { name: "chainId", internalType: "uint256", type: "uint256" }, + { name: "tokenContract", internalType: "address", type: "address" }, + { name: "tokenId", internalType: "uint256", type: "uint256" }, + ], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "newImplementation", internalType: "address", type: "address" }, + ], + name: "upgradeTo", + outputs: [], + }, + { + stateMutability: "payable", + type: "function", + inputs: [ + { name: "newImplementation", internalType: "address", type: "address" }, + { name: "data", internalType: "bytes", type: "bytes" }, + ], + name: "upgradeToAndCall", + outputs: [], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { + name: "userOp", + internalType: "struct UserOperation", + type: "tuple", + components: [ + { name: "sender", internalType: "address", type: "address" }, + { name: "nonce", internalType: "uint256", type: "uint256" }, + { name: "initCode", internalType: "bytes", type: "bytes" }, + { name: "callData", internalType: "bytes", type: "bytes" }, + { name: "callGasLimit", internalType: "uint256", type: "uint256" }, + { + name: "verificationGasLimit", + internalType: "uint256", + type: "uint256", + }, + { + name: "preVerificationGas", + internalType: "uint256", + type: "uint256", + }, + { name: "maxFeePerGas", internalType: "uint256", type: "uint256" }, + { + name: "maxPriorityFeePerGas", + internalType: "uint256", + type: "uint256", + }, + { name: "paymasterAndData", internalType: "bytes", type: "bytes" }, + { name: "signature", internalType: "bytes", type: "bytes" }, + ], + }, + { name: "userOpHash", internalType: "bytes32", type: "bytes32" }, + { name: "missingAccountFunds", internalType: "uint256", type: "uint256" }, + ], + name: "validateUserOp", + outputs: [ + { name: "validationData", internalType: "uint256", type: "uint256" }, + ], + }, + { stateMutability: "payable", type: "receive" }, +] as const + +export const erc6551RegistryV3ABI = [ + { type: "error", inputs: [], name: "AccountCreationFailed" }, + { + type: "event", + anonymous: false, + inputs: [ + { + name: "account", + internalType: "address", + type: "address", + indexed: false, + }, + { + name: "implementation", + internalType: "address", + type: "address", + indexed: true, + }, + { + name: "salt", + internalType: "bytes32", + type: "bytes32", + indexed: false, + }, + { + name: "chainId", + internalType: "uint256", + type: "uint256", + indexed: false, + }, + { + name: "tokenContract", + internalType: "address", + type: "address", + indexed: true, + }, + { + name: "tokenId", + internalType: "uint256", + type: "uint256", + indexed: true, + }, + ], + name: "ERC6551AccountCreated", + }, + { + stateMutability: "view", + type: "function", + inputs: [ + { name: "implementation", internalType: "address", type: "address" }, + { name: "salt", internalType: "bytes32", type: "bytes32" }, + { name: "chainId", internalType: "uint256", type: "uint256" }, + { name: "tokenContract", internalType: "address", type: "address" }, + { name: "tokenId", internalType: "uint256", type: "uint256" }, + ], + name: "account", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, + { + stateMutability: "nonpayable", + type: "function", + inputs: [ + { name: "implementation", internalType: "address", type: "address" }, + { name: "salt", internalType: "bytes32", type: "bytes32" }, + { name: "chainId", internalType: "uint256", type: "uint256" }, + { name: "tokenContract", internalType: "address", type: "address" }, + { name: "tokenId", internalType: "uint256", type: "uint256" }, + ], + name: "createAccount", + outputs: [{ name: "", internalType: "address", type: "address" }], + }, +] as const diff --git a/packages/sdk/abis/index.ts b/packages/sdk/src/protocol/abis/index.ts similarity index 70% rename from packages/sdk/abis/index.ts rename to packages/sdk/src/protocol/abis/index.ts index 589f808..43a57b9 100644 --- a/packages/sdk/abis/index.ts +++ b/packages/sdk/src/protocol/abis/index.ts @@ -1,15 +1,23 @@ +import { erc20Abi } from "./ERC20" +import { erc721Abi } from "./ERC721" +import { erc1155Abi } from "./ERC1155" import erc6551RegistryAbiV2 from "./ERC6551RegistryV2.json" +import { + erc6551AccountProxyV3ABI, + erc6551AccountV3ABI, + erc6551RegistryV3ABI, +} from "./erc6551V3" import erc6551AccountAbiV2 from "./IERC6551AccountV2.json" -import { erc1155Abi } from "./ERC1155" -import { erc721Abi } from "./ERC721" -import { erc20Abi } from "./ERC20" import { multicall3AuthenticatedABI } from "./MultiCallAuthenticated" export { - erc6551RegistryAbiV2, - erc6551AccountAbiV2, - erc1155Abi, - erc721Abi, erc20Abi, + erc721Abi, + erc1155Abi, + erc6551AccountAbiV2, + erc6551AccountProxyV3ABI, + erc6551AccountV3ABI, + erc6551RegistryAbiV2, + erc6551RegistryV3ABI, multicall3AuthenticatedABI, } diff --git a/packages/sdk/src/constants/crossChain.ts b/packages/sdk/src/protocol/constants/crossChain.ts similarity index 100% rename from packages/sdk/src/constants/crossChain.ts rename to packages/sdk/src/protocol/constants/crossChain.ts diff --git a/packages/sdk/src/constants/eip1167Implementation.ts b/packages/sdk/src/protocol/constants/eip1167Implementation.ts similarity index 100% rename from packages/sdk/src/constants/eip1167Implementation.ts rename to packages/sdk/src/protocol/constants/eip1167Implementation.ts diff --git a/packages/sdk/src/constants/index.ts b/packages/sdk/src/protocol/constants/index.ts similarity index 100% rename from packages/sdk/src/constants/index.ts rename to packages/sdk/src/protocol/constants/index.ts index d824a84..9bf35f7 100644 --- a/packages/sdk/src/constants/index.ts +++ b/packages/sdk/src/protocol/constants/index.ts @@ -1,5 +1,5 @@ -export * from "./tokenboundAddresses" -export * from "./interfaces" +export * from "./crossChain" export * from "./eip1167Implementation" +export * from "./interfaces" export * from "./multicall" -export * from "./crossChain" +export * from "./tokenboundAddresses" diff --git a/packages/sdk/src/constants/interfaces.ts b/packages/sdk/src/protocol/constants/interfaces.ts similarity index 100% rename from packages/sdk/src/constants/interfaces.ts rename to packages/sdk/src/protocol/constants/interfaces.ts diff --git a/packages/sdk/src/constants/multicall.ts b/packages/sdk/src/protocol/constants/multicall.ts similarity index 100% rename from packages/sdk/src/constants/multicall.ts rename to packages/sdk/src/protocol/constants/multicall.ts diff --git a/packages/sdk/src/constants/tokenboundAddresses.ts b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts similarity index 86% rename from packages/sdk/src/constants/tokenboundAddresses.ts rename to packages/sdk/src/protocol/constants/tokenboundAddresses.ts index 7b14e98..e54fe08 100644 --- a/packages/sdk/src/constants/tokenboundAddresses.ts +++ b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts @@ -1,14 +1,12 @@ import { type Abi, getAddress } from "viem" - -import { erc6551AccountAbiV2, erc6551RegistryAbiV2 } from "../../abis" - +import type { ContractABIPair } from "../../types" import { - erc6551AccountV3ABI, + erc6551AccountAbiV2, erc6551AccountProxyV3ABI, + erc6551AccountV3ABI, + erc6551RegistryAbiV2, erc6551RegistryV3ABI, -} from "../../src/test/wagmi-cli-hooks/generated" - -import type { ContractABIPair } from "../types" +} from "../abis" type Standard6551Deployment = { IMPLEMENTATION: ContractABIPair diff --git a/packages/sdk/src/protocol/core.ts b/packages/sdk/src/protocol/core.ts new file mode 100644 index 0000000..9f4f2b6 --- /dev/null +++ b/packages/sdk/src/protocol/core.ts @@ -0,0 +1,313 @@ +// Library-independent ERC-6551 protocol core. +// +// Every function here is pure: it takes standard Ethereum primitives and +// returns encoded calldata or a deterministic address. Nothing in this file +// touches a viem client, an ethers Signer, or any network transport, so it is +// shared verbatim by the viem core and by @tokenbound/ethers. + +import { + type Abi, + type Address, + encodeFunctionData, + getAddress, + type Hex, + hexToNumber, + isAddressEqual, +} from "viem" +import type { + Call3, + CallData, + MultiCallTx, + SegmentedERC6551Bytecode, + TBImplementationVersion, +} from "../types" +import { TBVersion } from "../types" +import { CALL_OPERATIONS, type CallOperation } from "../types/operations" +import { segmentBytecode } from "../utils/segmentBytecode" +import { multicall3AuthenticatedABI } from "./abis" +import { + ERC_6551_DEFAULT, + ERC_6551_LEGACY_V2, + MULTICALL_AUTHENTICATED_ADDRESS, +} from "./constants" +import { + computeAccount, + getCreationCode, + prepareCreateAccount as prepareCreateAccountV2, + prepareExecuteCall as prepareExecuteCallV2, +} from "./functions/v2" +import { + getTokenboundV3Account, + prepareCreateTokenboundV3Account, +} from "./functions/v3" + +/** + * The resolved ERC-6551 deployment a client is pointed at. Produced once by + * `resolveDeployment` and then threaded through the pure protocol functions, + * so version branching happens in exactly one place. + */ +export type ResolvedDeployment = { + supportsV3: boolean + implementationAddress: Address + registryAddress: Address +} + +/** + * Resolves which ERC-6551 deployment (V2 legacy or V3 default) is in use, + * applying the same precedence rules the SDK has always used: + * an explicit `version`, then a recognised legacy implementation address, + * otherwise the current V3 default. + */ +export function resolveDeployment(options: { + implementationAddress?: Address + registryAddress?: Address + version?: TBImplementationVersion +}): ResolvedDeployment { + const { implementationAddress, registryAddress, version } = options + + if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { + throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") + } + + const isV2 = + version === TBVersion.V2 || + (!!implementationAddress && + isAddressEqual( + implementationAddress, + ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS, + )) + + if (isV2) { + return { + supportsV3: false, + implementationAddress: + implementationAddress ?? ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS, + registryAddress: registryAddress ?? ERC_6551_LEGACY_V2.REGISTRY.ADDRESS, + } + } + + return { + supportsV3: true, + implementationAddress: + implementationAddress ?? ERC_6551_DEFAULT.ACCOUNT_PROXY.ADDRESS, + registryAddress: registryAddress ?? ERC_6551_DEFAULT.REGISTRY.ADDRESS, + } +} + +/** + * Deterministically derives a tokenbound account address. No network access. + */ +export function getAccountAddress( + params: { + tokenContract: Address + tokenId: string + chainId: number + salt?: number + }, + deployment: ResolvedDeployment, +): Address { + const { tokenContract, tokenId, chainId, salt = 0 } = params + const derive = deployment.supportsV3 ? getTokenboundV3Account : computeAccount + + return derive( + tokenContract, + tokenId, + chainId, + deployment.implementationAddress, + deployment.registryAddress, + salt, + ) +} + +/** + * Returns true when the implementation address is not one of the canonical + * Tokenbound deployments, in which case the SDK must not auto-initialize. + */ +export function isCustomImplementation( + deployment: ResolvedDeployment, +): boolean { + if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) return true + return ![ + ERC_6551_DEFAULT.ACCOUNT_PROXY.ADDRESS, + ERC_6551_DEFAULT.IMPLEMENTATION.ADDRESS, + ].includes(getAddress(deployment.implementationAddress)) +} + +/** + * Builds the transaction that creates (and, for standard deployments, + * initializes) a tokenbound account. Pure calldata construction. + */ +export async function prepareCreateAccountTx( + params: { + tokenContract: Address + tokenId: string + chainId: number + salt?: number + appendedCalls?: Call3[] + }, + deployment: ResolvedDeployment, +): Promise { + if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { + throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") + } + + const { + tokenContract, + tokenId, + chainId, + salt = 0, + appendedCalls = [], + } = params + + const computedAcct = getAccountAddress( + { tokenContract, tokenId, chainId, salt }, + deployment, + ) + + const custom = isCustomImplementation(deployment) + + const prepareBasicCreateAccount = deployment.supportsV3 + ? prepareCreateTokenboundV3Account + : prepareCreateAccountV2 + + const preparedBasicCreateAccount = await prepareBasicCreateAccount( + tokenContract, + tokenId, + chainId, + deployment.implementationAddress, + deployment.registryAddress, + salt, + ) + + if (appendedCalls.length > 0 && (!deployment.supportsV3 || custom)) { + throw new Error( + "Multicall via appendedCalls is not supported using the legacy V2 implementation or custom implementations", + ) + } + + if (custom) { + // Don't initialize for custom implementations. Allow third-party handling of initialization. + return preparedBasicCreateAccount + } + + // For standard implementations, use the multicall3 aggregate function to + // create and initialize the account in one transaction. + return { + to: MULTICALL_AUTHENTICATED_ADDRESS, + value: BigInt(0), + data: encodeFunctionData({ + abi: multicall3AuthenticatedABI, + functionName: "aggregate3", + args: [ + [ + { + target: deployment.registryAddress, + allowFailure: false, + callData: preparedBasicCreateAccount.data, + }, + { + target: computedAcct, + allowFailure: false, + callData: encodeFunctionData({ + abi: ERC_6551_DEFAULT.ACCOUNT_PROXY.ABI, + functionName: "initialize", + args: [ERC_6551_DEFAULT.IMPLEMENTATION.ADDRESS], + }), + }, + // Append Multicall3 calls, so the newly-created Tokenbound account + // can be used to execute calls immediately after creation + ...appendedCalls, + ], + ], + }), + } as MultiCallTx +} + +/** + * Encodes a same-chain execution call against a tokenbound account. + * Cross-chain encoding needs a public client for fee quoting and therefore + * lives in the viem layer. + */ +export function encodeExecution(params: { + account: Address + to: Address + value: bigint + data: Hex + operation?: CallOperation +}): CallData { + const { account, to, value, data, operation = CALL_OPERATIONS.CALL } = params + + return { + to: account, + value: 0n, + data: encodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "execute", + args: [to, value, data, operation], + }), + } +} + +/** + * Encodes a legacy V2 `executeCall` against a tokenbound account. + */ +export async function encodeExecuteCall(params: { + account: Address + to: Address + value: bigint + data: string +}): Promise { + const { account, to, value, data } = params + return prepareExecuteCallV2(account, to, value, data) +} + +/** + * Splits deployed ERC-6551 account bytecode into its constituent parts. + * Takes raw bytecode so it needs no client. + */ +export function deconstructBytecode( + rawBytecode: Hex | undefined, +): SegmentedERC6551Bytecode | null { + const bytecode = rawBytecode?.slice(2) + + if (!bytecode || !rawBytecode || !(rawBytecode.length > 2)) return null + + const [ + erc1167Header, + rawImplementationAddress, + erc1167Footer, + rawSalt, + rawChainId, + rawTokenContract, + rawTokenId, + ] = segmentBytecode(bytecode, 10, 20, 15, 32, 32, 32, 32) + + const chainId = hexToNumber(`0x${rawChainId}`, { size: 32 }) + const implementationAddress: Address = getAddress( + `0x${rawImplementationAddress}`, + ) + const salt = hexToNumber(`0x${rawSalt}`, { size: 32 }) + const tokenContract: Address = getAddress( + `0x${rawTokenContract.slice( + rawTokenContract.length - 40, + rawTokenContract.length, + )}`, + ) + const tokenId = hexToNumber(`0x${rawTokenId}`, { size: 32 }).toString() + + return { + erc1167Header, + implementationAddress, + erc1167Footer, + salt, + tokenId, + tokenContract, + chainId, + } +} + +/** `isValidSigner` MUST return this bytes4 magic value if the signer is valid. */ +export const VALID_SIGNER_MAGIC_VALUE = "0x523e3260" + +export type { Abi } +export { computeAccount, getCreationCode, getTokenboundV3Account } diff --git a/packages/sdk/src/functions/crossChain.ts b/packages/sdk/src/protocol/functions/crossChain.ts similarity index 80% rename from packages/sdk/src/functions/crossChain.ts rename to packages/sdk/src/protocol/functions/crossChain.ts index 9e46746..e51174f 100644 --- a/packages/sdk/src/functions/crossChain.ts +++ b/packages/sdk/src/protocol/functions/crossChain.ts @@ -1,14 +1,16 @@ -import { type PublicClient, encodeFunctionData, parseAbi } from "viem" -import { ERC_6551_DEFAULT, LZ_EXECUTORS, LZ_EIDS } from "../constants" import { Options } from "@layerzerolabs/lz-v2-utilities" -import type { CallData } from "../types" +import { encodeFunctionData, type PublicClient, parseAbi } from "viem" +import type { CallData, Prettify } from "../../types" +import { ERC_6551_DEFAULT, LZ_EIDS, LZ_EXECUTORS } from "../constants" -type CrossChainCallParams = { - publicClient: PublicClient - account: `0x${string}` - originChainId: number - destinationChainId: number -} & CallData +type CrossChainCallParams = Prettify< + { + publicClient: PublicClient + account: `0x${string}` + originChainId: number + destinationChainId: number + } & CallData +> export async function encodeCrossChainCall( params: CrossChainCallParams, diff --git a/packages/sdk/src/protocol/functions/index.ts b/packages/sdk/src/protocol/functions/index.ts new file mode 100644 index 0000000..c810425 --- /dev/null +++ b/packages/sdk/src/protocol/functions/index.ts @@ -0,0 +1,3 @@ +export * from "./crossChain" +export * from "./v2" +export * from "./v3" diff --git a/packages/sdk/src/functions/viemV2.ts b/packages/sdk/src/protocol/functions/v2.ts similarity index 93% rename from packages/sdk/src/functions/viemV2.ts rename to packages/sdk/src/protocol/functions/v2.ts index 2c1b23a..8171b1a 100644 --- a/packages/sdk/src/functions/viemV2.ts +++ b/packages/sdk/src/protocol/functions/v2.ts @@ -1,32 +1,17 @@ import { + concat, + encodeAbiParameters, + encodeFunctionData, + getAddress, getContract, getContractAddress, - concat, type PublicClient, - type WalletClient, - encodeFunctionData, - encodeAbiParameters, pad, - getAddress, + type WalletClient, } from "viem" - -import { erc6551AccountAbiV2, erc6551RegistryAbiV2 } from "../../abis" -import { - erc6551AccountProxyV3ABI, - erc6551AccountV3ABI, - erc6551RegistryV3ABI, -} from "../../src/test/wagmi-cli-hooks/generated" -import { addressToUint8Array } from "../utils" +import type { CallData } from "../../types" +import { addressToUint8Array } from "../../utils" import { ERC_6551_LEGACY_V2 } from "../constants" -import type { CallData } from "../types" - -export { - erc6551AccountAbiV2, - erc6551RegistryAbiV2, - erc6551AccountProxyV3ABI, - erc6551AccountV3ABI, - erc6551RegistryV3ABI, -} /** * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. diff --git a/packages/sdk/src/functions/viemV3.ts b/packages/sdk/src/protocol/functions/v3.ts similarity index 52% rename from packages/sdk/src/functions/viemV3.ts rename to packages/sdk/src/protocol/functions/v3.ts index c48cb18..1c405a0 100644 --- a/packages/sdk/src/functions/viemV3.ts +++ b/packages/sdk/src/protocol/functions/v3.ts @@ -1,31 +1,19 @@ import { - getContract, - getContractAddress, + bytesToHex, concat, - type WalletClient, - encodeFunctionData, encodeAbiParameters, - pad, - parseAbiParameters, - numberToHex, + encodeFunctionData, getAddress, + getContractAddress, numberToBytes, - bytesToHex, + pad, } from "viem" - -import { - erc6551AccountProxyV3ABI, - erc6551AccountV3ABI, - erc6551RegistryV3ABI, -} from "../../src/test/wagmi-cli-hooks/generated" -import { addressToUint8Array } from "../utils" - +import type { CallData } from "../../types" +import { addressToUint8Array } from "../../utils" import { ERC_6551_DEFAULT, STANDARD_EIP_1167_IMPLEMENTATION, } from "../constants" -import type { CallData } from "../types" -export { erc6551AccountProxyV3ABI, erc6551AccountV3ABI, erc6551RegistryV3ABI } /** * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. @@ -64,96 +52,6 @@ export async function prepareCreateTokenboundV3Account( }), } } - -/** - * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. - * @internal - */ -export async function createTokenboundV3Account( - tokenContract: string, - tokenId: string, - client: WalletClient, - implementationAddress?: `0x${string}`, - registryAddress?: `0x${string}`, - salt?: number, -): Promise<`0x${string}`> { - if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { - throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") - } - - const saltValue = salt ?? 0 - const erc6551implementation = - implementationAddress ?? ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS - const erc6551registry = registryAddress ?? ERC_6551_DEFAULT.REGISTRY.ADDRESS - - const registry = getContract({ - address: erc6551registry, - abi: ERC_6551_DEFAULT.REGISTRY.ABI, - client: { - wallet: client, - }, - }) - - const chainId = await client.getChainId() - - return await registry.write.createAccount([ - erc6551implementation, - encodeAbiParameters(parseAbiParameters(["bytes32"]), [ - numberToHex(saltValue, { size: 32 }), - ]), - chainId, - tokenContract, - tokenId, - ]) -} - -/** - * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. - * @internal - */ -export async function prepareTokenboundV3Execute( - account: string, - to: string, - value: bigint, - data: string, -): Promise { - return { - to: account as `0x${string}`, - value: 0n, - data: encodeFunctionData({ - abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, - functionName: "execute", - args: [to as `0x${string}`, value, data as `0x${string}`], - }), - } -} - -/** - * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. - * @internal - */ -export async function tokenboundV3Execute( - account: string, - to: string, - value: bigint, - data: string, - client: WalletClient, -) { - const registry = getContract({ - address: account as `0x${string}`, - abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, - client: { - wallet: client, - }, - }) - - return await registry.write.execute([ - to as `0x${string}`, - value, - data as `0x${string}`, - ]) -} - /** * @deprecated Direct consumption of this function is deprecated. Consume via TokenboundClient instead. * @internal diff --git a/packages/sdk/src/protocol/index.ts b/packages/sdk/src/protocol/index.ts new file mode 100644 index 0000000..15dd821 --- /dev/null +++ b/packages/sdk/src/protocol/index.ts @@ -0,0 +1,9 @@ +// Library-independent ERC-6551 protocol layer. +// Everything here operates on standard Ethereum primitives (Address, Hex, +// bigint, chain ids, ABIs) and is shared by the viem core and @tokenbound/ethers. + +export * from "./abis" +export * from "./constants" +export * from "./core" +export * from "./functions" +export * from "./transfers" diff --git a/packages/sdk/src/protocol/transfers.ts b/packages/sdk/src/protocol/transfers.ts new file mode 100644 index 0000000..05871a6 --- /dev/null +++ b/packages/sdk/src/protocol/transfers.ts @@ -0,0 +1,95 @@ +// Pure calldata encoders for the asset-transfer helpers. +// Shared by the viem core and @tokenbound/ethers so transfer semantics +// (including the ERC721 amount guard) exist in exactly one place. + +import { type Address, encodeFunctionData, type Hex, parseUnits } from "viem" +import { NFTTokenType } from "../types" +import { erc20Abi, erc721Abi, erc1155Abi } from "./abis" + +type TokenType = (typeof NFTTokenType)[keyof typeof NFTTokenType] + +/** + * Encodes an ERC721/ERC1155 `safeTransferFrom` from a tokenbound account. + * @throws if an ERC721 transfer requests an amount other than 1. + */ +export function encodeNFTTransfer(params: { + account: Address + tokenType: TokenType + tokenContract: Address + tokenId: string + recipient: Address + amount?: number +}): { to: Address; value: bigint; data: Hex } { + const { + account, + tokenType, + tokenContract, + tokenId, + recipient, + amount = 1, + } = params + + const is1155 = tokenType === NFTTokenType.ERC1155 + + if (!is1155 && amount !== 1) { + throw new Error("ERC721 transfers can only transfer one token at a time.") + } + + // ERC1155: safeTransferFrom(address,address,uint256,uint256,bytes) + // ERC721: safeTransferFrom(address,address,uint256) + const sharedArgs = [account, recipient, tokenId] + const transferArgs: unknown[] = is1155 + ? [...sharedArgs, amount, "0x"] + : sharedArgs + + return { + to: tokenContract, + value: BigInt(0), + data: encodeFunctionData({ + abi: is1155 ? erc1155Abi : erc721Abi, + functionName: "safeTransferFrom", + args: transferArgs, + }), + } +} + +/** + * Encodes an ETH transfer from a tokenbound account. `amount` is in decimal ETH. + */ +export function encodeETHTransfer(params: { + recipient: Address + amount: number +}): { to: Address; value: bigint; data: Hex } { + return { + to: params.recipient, + value: parseUnits(`${params.amount}`, 18), + data: "0x", + } +} + +/** + * Encodes an ERC-20 `transfer` from a tokenbound account. + * @throws if the token decimals are outside the 0-18 range. + */ +export function encodeERC20Transfer(params: { + recipient: Address + amount: number + erc20tokenAddress: Address + erc20tokenDecimals: number +}): { to: Address; value: bigint; data: Hex } { + const { recipient, amount, erc20tokenAddress, erc20tokenDecimals } = params + + if (erc20tokenDecimals < 0 || erc20tokenDecimals > 18) { + throw new Error("Decimal value out of range. Should be between 0 and 18.") + } + + return { + to: erc20tokenAddress, + value: 0n, + data: encodeFunctionData({ + abi: erc20Abi, + functionName: "transfer", + args: [recipient, parseUnits(`${amount}`, erc20tokenDecimals)], + }), + } +} diff --git a/packages/sdk/src/test/TestAll.test.ts b/packages/sdk/src/test/TestAll.test.ts index 14a05fe..30a4e44 100644 --- a/packages/sdk/src/test/TestAll.test.ts +++ b/packages/sdk/src/test/TestAll.test.ts @@ -1,57 +1,55 @@ // This suite tests Tokenbound SDK methods with -// viem walletClient + publicClient and Ethers 5/6. +// a viem walletClient + publicClient. -import { zora, mainnet } from "viem/chains" -import { describe, beforeAll, afterAll, expect, it, vi } from "vitest" -import { ethers, type providers } from "ethers" import { createAnvil } from "@viem/anvil" import { - type WalletClient, - type PublicClient, + createTestClient, createWalletClient, - http, - getAddress, + decodeEventLog, + encodeAbiParameters, encodeFunctionData, - type Log, - parseUnits, + erc20Abi, formatEther, + getAddress, getContract, - encodeAbiParameters, - parseAbiParameters, + http, isAddress, isHex, + type PublicClient, + parseAbiParameters, + parseUnits, + type SignableMessage, + type WalletClient, } from "viem" import { privateKeyToAccount } from "viem/accounts" +import { mainnet, zora } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it, vi } from "vitest" +import { type CreateAccountParams, TokenboundClient } from "../" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../protocol/constants" +import { type Call3, type TBImplementationVersion, TBVersion } from "../types" +import { resolvePossibleENS } from "../utils" +import { + ANVIL_CONFIG, + CREATE_ANVIL_OPTIONS, + TEST_CONFIG, + zora721, + zora1155, +} from "./config" import { ADDRESS_REGEX, ANVIL_ACCOUNTS, ANVIL_RPC_URL, WETH_CONTRACT_ADDRESS, } from "./constants" -import { resolvePossibleENS } from "../utils" import { ethToWei, getPublicClient, getWETHBalance, + getZora721Balance, // debugTransaction, getZora1155Balance, - getZora721Balance, } from "./utils" -import { - ANVIL_CONFIG, - CREATE_ANVIL_OPTIONS, - zora721, - zora1155, - TEST_CONFIG, -} from "./config" import { wethABI } from "./wagmi-cli-hooks/generated" -import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../constants" -import { type Call3, type TBImplementationVersion, TBVersion } from "../types" -import { JsonRpcSigner, JsonRpcProvider } from "ethers6" -import { erc20Abi } from "viem" -import { type CreateAccountParams, TokenboundClient } from "../" - -const pool = Number(process.env.VITEST_POOL_ID ?? 1) const TIMEOUT = 60000 // default 10000 const ANVIL_USER_0 = getAddress(ANVIL_ACCOUNTS[0].address) @@ -63,19 +61,16 @@ const walletClient = createWalletClient({ account: privateKeyToAccount(ANVIL_ACCOUNTS[0].privateKey), }) -const ethers5Provider = new ethers.providers.JsonRpcProvider(ANVIL_RPC_URL) -const ethers5Signer = new ethers.Wallet( - ANVIL_ACCOUNTS[0].privateKey, - ethers5Provider, -) - -const ethers6Provider = new JsonRpcProvider(ANVIL_RPC_URL) -const ethers6Signer = new JsonRpcSigner(ethers6Provider, ANVIL_USER_0) +// Anvil cheatcode client, used to normalize forked mainnet state +const testClient = createTestClient({ + transport: http(ANVIL_RPC_URL), + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + mode: "anvil", +}) type TestConfig = { testName: string - walletClient?: WalletClient - signer?: any + walletClient: WalletClient version?: TBImplementationVersion } @@ -85,36 +80,17 @@ const ENABLED_TESTS: Array = [ walletClient, version: TBVersion.V2, }, - { - testName: "ethers@5 v2", - signer: ethers5Signer, - version: TBVersion.V2, - }, - { - testName: "ethers@6 v2", - signer: ethers6Signer, - version: TBVersion.V2, - }, { testName: "viem v3", walletClient, }, - { - testName: "ethers@5 v3", - signer: ethers5Signer, - }, - { - testName: "ethers@6 v3", - signer: ethers6Signer, - }, ] describe.each(ENABLED_TESTS)( "$testName", - ({ testName, walletClient, signer, version }) => { + ({ testName, walletClient, version }) => { const isV2 = version === TBVersion.V2 const isV3 = isV2 === false - const viemOnlyIt = walletClient ? it : it.skip // Skip tests that are non-functional in Ethers const v3OnlyIt = isV3 ? it : it.skip // Set up Anvil instance + clients const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) @@ -128,23 +104,18 @@ describe.each(ENABLED_TESTS)( let TOKENID1_IN_TBA: string let TOKENID2_IN_TBA: string let ZORA721_TBA_ADDRESS: `0x${string}` - let ZORA721_TBA_ADDRESS_CUSTOM_SALT: `0x${string}` - let ZORA721_TBA_ADDRESS_MULTICALL: `0x${string}` const ERC6551_DEPLOYMENT = isV2 ? ERC_6551_LEGACY_V2 : ERC_6551_DEFAULT - // Spin up a fresh anvil instance each time we run the test suite against a different signer + // Spin up a fresh anvil instance each time we run the test suite against a different configuration beforeAll(async () => { try { - // publicClient = getPublicClient({ chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id }) publicClient = getPublicClient({ chain: ANVIL_CONFIG.ACTIVE_CHAIN }) // Pass in the Anvil test walletClient + publicClient tokenboundClient = new TokenboundClient({ - // chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id, chain: ANVIL_CONFIG.ACTIVE_CHAIN, walletClient, - signer, publicClient, implementationAddress: isV3 ? undefined @@ -155,6 +126,13 @@ describe.each(ENABLED_TESTS)( }) await anvil.start() + + // The fork inherits mainnet state for Anvil's well-known default accounts, + // including an EIP-7702 delegation on ANVIL_USER_1. That makes it look like a + // contract, so safeTransferFrom calls a receiver hook it doesn't implement. + // Clear it so the account behaves as a plain EOA. + await testClient.setCode({ address: ANVIL_USER_1, bytecode: "0x" }) + console.log(`START → \x1b[94m ${testName} \x1b[0m`) } catch (err) { console.error("Error during setup:", err) @@ -166,902 +144,1054 @@ describe.each(ENABLED_TESTS)( console.log(`END → \x1b[94m ${testName} \x1b[0m`) }) - it("can get the SDK version", () => { - const sdkVersion: string = tokenboundClient.getSDKVersion() - console.log(`SDK Version → \x1b[94m ${sdkVersion} \x1b[0m`) - // console.log('SDK Version:', sdkVersion) - expect(sdkVersion).toBeDefined() - }) - - // To test the SDK methods, we need to mint some NFTs into the Anvil wallet - // so that we can transfer them to the TBA and test the TBA methods. - it( - "can mint 2 Zora 721 NFTs into Anvil wallet #0", - async () => { - let mintLogs: Log[] = [] + // --------------------------------------------------------------------- + // Setup helpers. + // + // Each group of tests below declares the chain state it needs via its own + // beforeAll. These helpers are idempotent, so running the whole file in + // sequence does the work once, while running a single group (e.g. + // `pnpm test -t "transfers"`) still gets a correctly prepared TBA. + // --------------------------------------------------------------------- + + /** + * Waits for a transaction receipt by polling. + * + * viem's waitForTransactionReceipt relies on a block watcher that does not + * reliably observe new blocks in this suite, and a bare getTransactionReceipt + * races the block being mined. Polling is reliable for both. + */ + async function getReceipt(hash: `0x${string}`, timeoutMs = 30000) { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + return await publicClient.getTransactionReceipt({ hash }) + } catch { + await new Promise((r) => setTimeout(r, 200)) + } + } + throw new Error(`Transaction ${hash} was not mined within ${timeoutMs}ms`) + } - // Set up observer for mint event so we can get the tokenId - const unwatch = publicClient.watchContractEvent({ - address: zora721.proxyContractAddress, - abi: zora721.abi, - eventName: "Transfer", - args: { - to: ANVIL_USER_0, - }, - onLogs: (logs) => { - mintLogs = logs - const { tokenId: eoaTokenId } = logs[0].args - const { tokenId: tbaToken1Id } = logs[1].args - const { tokenId: tbaToken2Id } = logs[2].args - const { tokenId: multicallTokenId } = logs[3].args - - if (eoaTokenId && tbaToken1Id && tbaToken2Id && multicallTokenId) { - TOKENID_IN_EOA = eoaTokenId.toString() - TOKENID_FOR_MULTICALL_CREATE = multicallTokenId.toString() - TOKENID1_IN_TBA = tbaToken1Id.toString() - TOKENID2_IN_TBA = tbaToken2Id.toString() - - NFT_IN_EOA = { - tokenContract: zora721.proxyContractAddress, - tokenId: TOKENID_IN_EOA, - } - NFT_FOR_MULTICALL_CREATE = { - tokenContract: zora721.proxyContractAddress, - tokenId: TOKENID_FOR_MULTICALL_CREATE, - } - } - }, - }) + /** Mints 4 Zora 721s into the Anvil EOA and records their token IDs. */ + async function ensureMintedNFTs() { + if (TOKENID_IN_EOA) return - // Prepare mint transaction - const encodedMintFunctionData = encodeFunctionData({ + const mintTxHash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + account: ANVIL_USER_0, + to: zora721.proxyContractAddress, + value: zora721.mintPrice * BigInt(zora721.quantity), + data: encodeFunctionData({ abi: zora721.abi, functionName: "purchase", args: [BigInt(zora721.quantity)], + }), + }) + + const receipt = await getReceipt(mintTxHash) + + // Read token IDs off the mint receipt. The mint is a single transaction, + // so every Transfer log is here and this stays deterministic regardless + // of how the node batches event notifications. + const mintedIds = receipt.logs + .filter( + (log) => + log.address.toLowerCase() === + zora721.proxyContractAddress.toLowerCase(), + ) + .map((log) => { + try { + return decodeEventLog({ + abi: zora721.abi, + data: log.data, + topics: log.topics, + }) + } catch { + return undefined + } }) + .filter( + (event): event is NonNullable => + event?.eventName === "Transfer" && + (event.args as any)?.to?.toLowerCase() === + ANVIL_USER_0.toLowerCase(), + ) + .map((event) => ((event.args as any).tokenId as bigint).toString()) - const prepared721Mint = { - to: zora721.proxyContractAddress, - value: zora721.mintPrice * BigInt(zora721.quantity), - data: encodedMintFunctionData, - } + if (mintedIds.length < zora721.quantity) { + throw new Error( + `Expected ${zora721.quantity} minted token IDs, saw ${mintedIds.length}`, + ) + } - let mintTxHash: `0x${string}` + TOKENID_IN_EOA = mintedIds[0] + TOKENID1_IN_TBA = mintedIds[1] + TOKENID2_IN_TBA = mintedIds[2] + TOKENID_FOR_MULTICALL_CREATE = mintedIds[3] - if (walletClient) { - mintTxHash = await walletClient.sendTransaction({ - chain: ANVIL_CONFIG.ACTIVE_CHAIN, - account: ANVIL_USER_0, - ...prepared721Mint, - }) - } else if (signer) { - mintTxHash = await signer - .sendTransaction({ - chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id, - ...prepared721Mint, - }) - .then((tx: providers.TransactionResponse) => tx.hash) - } + NFT_IN_EOA = { + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + } + NFT_FOR_MULTICALL_CREATE = { + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_FOR_MULTICALL_CREATE, + } + } + + /** Deploys the primary TBA (backed by the NFT held in the EOA). */ + async function ensureTBA() { + await ensureMintedNFTs() + if (ZORA721_TBA_ADDRESS) return + + const { account, txHash } = + await tokenboundClient.createAccount(NFT_IN_EOA) + await getReceipt(txHash) + ZORA721_TBA_ADDRESS = account + } + + /** Moves one minted 721 from the EOA into the TBA. */ + async function transferNFTToTBA(tokenId: string) { + const hash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + // biome-ignore lint/style/noNonNullAssertion: configured at module scope + account: walletClient.account!.address, + to: zora721.proxyContractAddress, + value: 0n, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ANVIL_USER_0, ZORA721_TBA_ADDRESS, BigInt(tokenId)], + }), + }) + await getReceipt(hash) + return hash + } + + /** Ensures the TBA holds the two 721s that transfer tests operate on. */ + async function ensureNFTsInTBA() { + await ensureTBA() + const balance = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + if (balance >= 2n) return + + await transferNFTToTBA(TOKENID1_IN_TBA) + await transferNFTToTBA(TOKENID2_IN_TBA) + } + + /** + * The custom-salt TBA address is deterministic, so tests that only need the + * address can compute it instead of depending on the create test having run. + */ + function customSaltTBAAddress(): `0x${string}` { + return tokenboundClient.getAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + } - const zoraBalanceInAnvilWallet = await getZora721Balance({ - publicClient, - walletAddress: ANVIL_USER_0, - }) + /** Ensures the TBA holds Zora 1155s for the 1155 transfer tests. */ + async function ensure1155sInTBA() { + await ensureETHInTBA() + const balance = await getZora1155Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + if (balance >= zora1155.quantity) return + + const data = encodeFunctionData({ + abi: zora1155.abi, + functionName: "mint", + args: [ + zora1155.fixedPriceSalesStrategy, + zora1155.tokenId, + zora1155.quantity, + encodeAbiParameters(parseAbiParameters("address"), [ + ZORA721_TBA_ADDRESS, + ]), + ], + }) + + const execution = { + account: ZORA721_TBA_ADDRESS, + to: zora1155.proxyContractAddress, + value: zora1155.mintFee * zora1155.quantity, + data, + } + + const hash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) + await getReceipt(hash) + } + + /** Ensures the TBA holds at least `amount` ETH to spend. */ + async function ensureETHInTBA(amount = 1) { + await ensureTBA() + const wei = parseUnits(`${amount}`, 18) + const balance = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + if (balance >= wei) return + + const hash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + // biome-ignore lint/style/noNonNullAssertion: configured at module scope + account: walletClient.account!.address, + to: ZORA721_TBA_ADDRESS, + value: wei - balance, + }) + await getReceipt(hash) + } + + describe("client", () => { + it("can get the SDK version", () => { + const sdkVersion: string = tokenboundClient.getSDKVersion() + console.log(`SDK Version → \x1b[94m ${sdkVersion} \x1b[0m`) + // console.log('SDK Version:', sdkVersion) + expect(sdkVersion).toBeDefined() + }) + + // To test the SDK methods, we need to mint some NFTs into the Anvil wallet + // so that we can transfer them to the TBA and test the TBA methods. + }) + + describe("accounts", () => { + it( + "can mint 2 Zora 721 NFTs into Anvil wallet #0", + async () => { + await ensureMintedNFTs() + const zoraBalanceInAnvilWallet = await getZora721Balance({ + publicClient, + walletAddress: ANVIL_USER_0, + }) - await vi.waitFor(() => { - expect(mintLogs.length).toBe(zora721.quantity) - expect(mintTxHash).toMatch(ADDRESS_REGEX) expect(NFT_IN_EOA.tokenId).toBe(TOKENID_IN_EOA) expect(NFT_FOR_MULTICALL_CREATE.tokenId).toBe( TOKENID_FOR_MULTICALL_CREATE, ) - expect(zoraBalanceInAnvilWallet).toBe(4n) - unwatch() - }) - }, - TIMEOUT, - ) - - it( - "can prepareCreateAccount", - async () => { - const preparedAccount = await tokenboundClient.prepareCreateAccount({ - tokenContract: zora721.proxyContractAddress, - tokenId: "1", - }) + expect(zoraBalanceInAnvilWallet).toBe(BigInt(zora721.quantity)) + expect( + new Set([ + TOKENID_IN_EOA, + TOKENID1_IN_TBA, + TOKENID2_IN_TBA, + TOKENID_FOR_MULTICALL_CREATE, + ]).size, + ).toBe(4) + }, + TIMEOUT, + ) - if (!preparedAccount.to) return false - - expect(isAddress(preparedAccount.to)).toEqual(true) - expect(typeof preparedAccount.value).toEqual("bigint") - expect(isHex(preparedAccount.data)).toEqual(true) - }, - TIMEOUT, - ) - - // We create the account using an NFT in the EOA wallet so we can test the EOA methods and use the TBA address for tests - it( - "can createAccount", - async () => { - const { account, txHash } = - await tokenboundClient.createAccount(NFT_IN_EOA) - console.log("CREATED ACCT", account) - - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, + it( + "can prepareCreateAccount", + async () => { + await ensureMintedNFTs() + const preparedAccount = await tokenboundClient.prepareCreateAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: "1", }) - ZORA721_TBA_ADDRESS = account - await vi.waitFor(() => { - expect(account).toMatch(ADDRESS_REGEX) - expect(createdAccountTxReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) - - it( - "can createAccount with a custom salt", - async () => { - const { account, txHash } = await tokenboundClient.createAccount({ - ...NFT_IN_EOA, - salt: CUSTOM_SALT, - }) - console.log("CREATED ACCT WITH CUSTOM SALT", account) + if (!preparedAccount.to) return + + expect(isAddress(preparedAccount.to)).toEqual(true) + expect(typeof preparedAccount.value).toEqual("bigint") + expect(isHex(preparedAccount.data)).toEqual(true) + }, + TIMEOUT, + ) + + // We create the account using an NFT in the EOA wallet so we can test the EOA methods and use the TBA address for tests + it( + "can createAccount", + async () => { + await ensureMintedNFTs() + const { account, txHash } = + await tokenboundClient.createAccount(NFT_IN_EOA) + console.log("CREATED ACCT", account) + + const createdAccountTxReceipt = + await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, + ZORA721_TBA_ADDRESS = account + await vi.waitFor(() => { + expect(account).toMatch(ADDRESS_REGEX) + expect(createdAccountTxReceipt.status).toBe("success") }) + }, + TIMEOUT, + ) - ZORA721_TBA_ADDRESS_CUSTOM_SALT = account - await vi.waitFor(() => { - expect(account).toMatch(ADDRESS_REGEX) - expect(createdAccountTxReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) + it( + "can createAccount with a custom salt", + async () => { + await ensureMintedNFTs() + const { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + console.log("CREATED ACCT WITH CUSTOM SALT", account) - it( - "can createAccount with a custom chainId", - async () => { - const HARDHAT_CHAIN_ID = 31337 + const createdAccountTxReceipt = + await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) - const { account, txHash } = await tokenboundClient.createAccount({ - ...NFT_IN_EOA, - chainId: HARDHAT_CHAIN_ID, - }) - console.log("CREATED ACCT WITH CUSTOM CHAIN ID", account) + await vi.waitFor(() => { + expect(account).toMatch(ADDRESS_REGEX) + expect(createdAccountTxReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) + + it( + "can createAccount with a custom chainId", + async () => { + await ensureMintedNFTs() + const HARDHAT_CHAIN_ID = 31337 - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, + const { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_IN_EOA, + chainId: HARDHAT_CHAIN_ID, }) + console.log("CREATED ACCT WITH CUSTOM CHAIN ID", account) - const bytecode = await tokenboundClient.deconstructBytecode({ - accountAddress: account, - }) + const createdAccountTxReceipt = + await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) - if (!bytecode) return false + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: account, + }) - const { chainId } = bytecode + if (!bytecode) return - console.log("CHAINID OF CREATED ACCT", chainId) + const { chainId } = bytecode - expect(isAddress(account)).toEqual(true) - expect(createdAccountTxReceipt.status).toBe("success") - expect(chainId).toBe(HARDHAT_CHAIN_ID) - }, - TIMEOUT, - ) + console.log("CHAINID OF CREATED ACCT", chainId) - v3OnlyIt( - "can createAccount and append multicall transaction(s) that use the deployed TBA", - async () => { - const multicallTBAAddress = tokenboundClient.getAccount( - NFT_FOR_MULTICALL_CREATE, - ) + expect(isAddress(account)).toEqual(true) + expect(createdAccountTxReceipt.status).toBe("success") + expect(chainId).toBe(HARDHAT_CHAIN_ID) + }, + TIMEOUT, + ) - // Perform a simple ERC20 balanceOf call to test the appended multicall transaction - const encodedBalanceOfFunctionData = encodeFunctionData({ - abi: erc20Abi, - functionName: "balanceOf", - args: [multicallTBAAddress], - }) + v3OnlyIt( + "can createAccount and append multicall transaction(s) that use the deployed TBA", + async () => { + await ensureMintedNFTs() + const multicallTBAAddress = tokenboundClient.getAccount( + NFT_FOR_MULTICALL_CREATE, + ) - const preparedBalanceOfByTBA = await tokenboundClient.prepareExecution({ - account: multicallTBAAddress, - to: WETH_CONTRACT_ADDRESS, - value: 0n, - data: encodedBalanceOfFunctionData, - }) + // Perform a simple ERC20 balanceOf call to test the appended multicall transaction + const encodedBalanceOfFunctionData = encodeFunctionData({ + abi: erc20Abi, + functionName: "balanceOf", + args: [multicallTBAAddress], + }) - const appendedCall: Call3 = { - target: multicallTBAAddress, // Execute with TBA - allowFailure: false, - callData: preparedBalanceOfByTBA.data, - } + const preparedBalanceOfByTBA = + await tokenboundClient.prepareExecution({ + account: multicallTBAAddress, + to: WETH_CONTRACT_ADDRESS, + value: 0n, + data: encodedBalanceOfFunctionData, + }) - const { account, txHash } = await tokenboundClient.createAccount({ - ...NFT_FOR_MULTICALL_CREATE, - appendedCalls: [appendedCall], - }) - console.log("CREATED ACCT WITH MULTICALL", account) + const appendedCall: Call3 = { + target: multicallTBAAddress, // Execute with TBA + allowFailure: false, + callData: preparedBalanceOfByTBA.data, + } - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, + const { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_FOR_MULTICALL_CREATE, + appendedCalls: [appendedCall], }) + console.log("CREATED ACCT WITH MULTICALL", account) - ZORA721_TBA_ADDRESS_MULTICALL = account - await vi.waitFor(() => { - expect(account).toMatch(ADDRESS_REGEX) - expect(createdAccountTxReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) + const createdAccountTxReceipt = + await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) - it("can checkAccountDeployment for the created account", async () => { - const isAccountDeployed = await tokenboundClient.checkAccountDeployment({ - accountAddress: ZORA721_TBA_ADDRESS, - }) + await vi.waitFor(() => { + expect(account).toMatch(ADDRESS_REGEX) + expect(createdAccountTxReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) + }) - console.log(`isAccountDeployed ${testName}`, isAccountDeployed) + describe("account reads", () => { + it("can checkAccountDeployment for the created account", async () => { + await ensureTBA() + const isAccountDeployed = await tokenboundClient.checkAccountDeployment( + { + accountAddress: ZORA721_TBA_ADDRESS, + }, + ) - expect(isAccountDeployed).toEqual(true) - }) + console.log(`isAccountDeployed ${testName}`, isAccountDeployed) - it("can getNFT for the created account", async () => { - const nft = await tokenboundClient.getNFT({ - accountAddress: ZORA721_TBA_ADDRESS, + expect(isAccountDeployed).toEqual(true) }) - if (!nft) throw new Error("Bytecode is undefined") + it("can getNFT for the created account", async () => { + await ensureTBA() + const nft = await tokenboundClient.getNFT({ + accountAddress: ZORA721_TBA_ADDRESS, + }) - const { chainId, tokenContract, tokenId } = nft + if (!nft) throw new Error("Bytecode is undefined") - expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) - expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) - expect(tokenId).toEqual(NFT_IN_EOA.tokenId) - }) + const { chainId, tokenContract, tokenId } = nft - it("can deconstructBytecode for the created account", async () => { - const bytecode = await tokenboundClient.deconstructBytecode({ - accountAddress: ZORA721_TBA_ADDRESS, + expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) + expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) + expect(tokenId).toEqual(NFT_IN_EOA.tokenId) }) - if (!bytecode) throw new Error("Bytecode is undefined") - - const { - chainId, - implementationAddress, - tokenContract, - tokenId, - salt, - erc1167Header, - erc1167Footer, - } = bytecode - - expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) - expect(erc1167Header).toEqual(TEST_CONFIG.ERC1167_HEADER) - // expect(implementationAddress).toEqual(ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS) - - if (isV2) { - expect(implementationAddress).toEqual( - ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, - ) - } - if (isV3) { - expect(implementationAddress).toEqual( - ERC6551_DEPLOYMENT.ACCOUNT_PROXY?.ADDRESS, - ) - } + it("can deconstructBytecode for the created account", async () => { + await ensureTBA() + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: ZORA721_TBA_ADDRESS, + }) - expect(erc1167Footer).toEqual(TEST_CONFIG.ERC1167_FOOTER) - expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) - expect(tokenId).toEqual(NFT_IN_EOA.tokenId) - expect(salt).toEqual(0) - }) + if (!bytecode) throw new Error("Bytecode is undefined") + + const { + chainId, + implementationAddress, + tokenContract, + tokenId, + salt, + erc1167Header, + erc1167Footer, + } = bytecode + + expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) + expect(erc1167Header).toEqual(TEST_CONFIG.ERC1167_HEADER) + // expect(implementationAddress).toEqual(ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS) + + if (isV2) { + expect(implementationAddress).toEqual( + ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, + ) + } + if (isV3) { + expect(implementationAddress).toEqual( + ERC6551_DEPLOYMENT.ACCOUNT_PROXY?.ADDRESS, + ) + } - it("can getAccount", async () => { - const getAccount = tokenboundClient.getAccount(NFT_IN_EOA) - await vi.waitFor(() => { - expect(getAccount).toMatch(ADDRESS_REGEX) - expect(getAccount).toEqual(ZORA721_TBA_ADDRESS) + expect(erc1167Footer).toEqual(TEST_CONFIG.ERC1167_FOOTER) + expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) + expect(tokenId).toEqual(NFT_IN_EOA.tokenId) + expect(salt).toEqual(0) }) - }) - it("can getAccount with a custom salt", async () => { - const getAccount = tokenboundClient.getAccount({ - ...NFT_IN_EOA, - salt: CUSTOM_SALT, + it("can getAccount", async () => { + await ensureTBA() + const getAccount = tokenboundClient.getAccount(NFT_IN_EOA) + await vi.waitFor(() => { + expect(getAccount).toMatch(ADDRESS_REGEX) + expect(getAccount).toEqual(ZORA721_TBA_ADDRESS) + }) }) - await vi.waitFor(() => { - expect(getAccount).toMatch(ADDRESS_REGEX) - expect(getAccount).toEqual(ZORA721_TBA_ADDRESS_CUSTOM_SALT) + + it("can getAccount with a custom salt", async () => { + await ensureTBA() + const getAccount = tokenboundClient.getAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + await vi.waitFor(() => { + expect(getAccount).toMatch(ADDRESS_REGEX) + expect(getAccount).toEqual(customSaltTBAAddress()) + }) }) - }) - // We transfer an NFT to the TBA so that we can test the TBA methods. - it( - "can transfer one of the minted NFTs to the TBA", - async () => { - console.log( - "SAFE_TRANSFER", - ZORA721_TBA_ADDRESS, - "tokenId", - TOKENID1_IN_TBA, - ) + // We transfer an NFT to the TBA so that we can test the TBA methods. + }) - const transferCallData = encodeFunctionData({ - abi: zora721.abi, - functionName: "safeTransferFrom", - args: [ - ANVIL_USER_0, // from - ZORA721_TBA_ADDRESS, // to - BigInt(TOKENID1_IN_TBA), // tokenId - ], - }) + describe("funding", () => { + it( + "can transfer one of the minted NFTs to the TBA", + async () => { + await ensureTBA() + console.log( + "SAFE_TRANSFER", + ZORA721_TBA_ADDRESS, + "tokenId", + TOKENID1_IN_TBA, + ) - const preparedNFTTransfer = { - to: zora721.proxyContractAddress, - value: 0n, - data: transferCallData, - } + const transferCallData = encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ + ANVIL_USER_0, // from + ZORA721_TBA_ADDRESS, // to + BigInt(TOKENID1_IN_TBA), // tokenId + ], + }) - let transferHash: `0x${string}` + const preparedNFTTransfer = { + to: zora721.proxyContractAddress, + value: 0n, + data: transferCallData, + } - if (walletClient) { if (!walletClient.account?.address) { throw new Error("walletClient.account.address is undefined") } - transferHash = await walletClient.sendTransaction({ + + const transferHash = await walletClient.sendTransaction({ chain: ANVIL_CONFIG.ACTIVE_CHAIN, - account: walletClient.account?.address, - ...preparedNFTTransfer, - }) - } else { - const tx = await signer.sendTransaction({ - chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id, + account: walletClient.account.address, ...preparedNFTTransfer, }) - transferHash = tx.hash - } - - const transactionReceipt = await publicClient.waitForTransactionReceipt( - { - hash: transferHash, - }, - ) + const transactionReceipt = + await publicClient.waitForTransactionReceipt({ + hash: transferHash, + }) - const tbaNFTBalance = await getZora721Balance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) - console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) + const tbaNFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) - await vi.waitFor(() => { - expect(transferHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - expect(tbaNFTBalance).toBe(1n) - }) - }, - TIMEOUT, - ) - - it( - "can transfer another minted NFT to the TBA", - async () => { - const transferCallData = encodeFunctionData({ - abi: zora721.abi, - functionName: "safeTransferFrom", - args: [ - ANVIL_USER_0, // from - ZORA721_TBA_ADDRESS, // to - BigInt(TOKENID2_IN_TBA), // tokenId - ], - }) + await vi.waitFor(() => { + expect(transferHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + expect(tbaNFTBalance).toBe(1n) + }) + }, + TIMEOUT, + ) - const preparedNFTTransfer = { - to: zora721.proxyContractAddress, - value: 0n, - data: transferCallData, - } + it( + "can transfer another minted NFT to the TBA", + async () => { + await ensureTBA() + const transferCallData = encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ + ANVIL_USER_0, // from + ZORA721_TBA_ADDRESS, // to + BigInt(TOKENID2_IN_TBA), // tokenId + ], + }) - let transferHash: `0x${string}` + const preparedNFTTransfer = { + to: zora721.proxyContractAddress, + value: 0n, + data: transferCallData, + } - if (walletClient) { if (!walletClient.account?.address) { throw new Error("walletClient.account.address is undefined") } - transferHash = await walletClient.sendTransaction({ + + const transferHash = await walletClient.sendTransaction({ chain: ANVIL_CONFIG.ACTIVE_CHAIN, - account: walletClient.account?.address, + account: walletClient.account.address, ...preparedNFTTransfer, }) - } else { - const tx = await signer.sendTransaction({ - chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id, - ...preparedNFTTransfer, - }) - transferHash = tx.hash - } - const transactionReceipt = await publicClient.waitForTransactionReceipt( - { - hash: transferHash, - }, - ) + const transactionReceipt = + await publicClient.waitForTransactionReceipt({ + hash: transferHash, + }) - const tbaNFTBalance = await getZora721Balance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) - console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) + const tbaNFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) - await vi.waitFor(() => { - expect(transferHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - expect(tbaNFTBalance).toBe(2n) - }) - }, - TIMEOUT, - ) - - // To perform transactions using the SDK, we need to transfer some ETH into the TBA. - it( - "can transfer ETH to the TBA", - async () => { - const ethAmount = 1 - const ethAmountWei = parseUnits(`${ethAmount}`, 18) - - const preparedETHTransfer = { - to: ZORA721_TBA_ADDRESS, - value: ethAmountWei, - // data is optional if nil - } + await vi.waitFor(() => { + expect(transferHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + expect(tbaNFTBalance).toBe(2n) + }) + }, + TIMEOUT, + ) + + // To perform transactions using the SDK, we need to transfer some ETH into the TBA. + it( + "can transfer ETH to the TBA", + async () => { + await ensureTBA() + const ethAmount = 1 + const ethAmountWei = parseUnits(`${ethAmount}`, 18) + + const preparedETHTransfer = { + to: ZORA721_TBA_ADDRESS, + value: ethAmountWei, + // data is optional if nil + } - let transferHash: `0x${string}` - if (walletClient) { if (!walletClient.account?.address) { throw new Error("walletClient.account.address is undefined") } - transferHash = await walletClient.sendTransaction({ + + const transferHash = await walletClient.sendTransaction({ chain: ANVIL_CONFIG.ACTIVE_CHAIN, - account: walletClient.account?.address, + account: walletClient.account.address, ...preparedETHTransfer, }) - } else { - transferHash = await signer - .sendTransaction({ - chainId: ANVIL_CONFIG.ACTIVE_CHAIN.id, - ...preparedETHTransfer, - }) - .then((tx: providers.TransactionResponse) => tx.hash) - } - - const balanceAfter = await publicClient.getBalance({ - address: ZORA721_TBA_ADDRESS, - }) - - await vi.waitFor(() => { - expect(transferHash).toMatch(ADDRESS_REGEX) - expect(balanceAfter).toBe(ethAmountWei) - }) - }, - TIMEOUT, - ) - it(isV2 ? "can prepareExecuteCall" : "can prepareExecution", async () => { - const execution = { - account: ZORA721_TBA_ADDRESS, - to: TEST_CONFIG.RECIPIENT_ADDRESS, - value: 0n, - data: "", - } - - const preparedCall = isV3 - ? await tokenboundClient.prepareExecution(execution) - : await tokenboundClient.prepareExecuteCall(execution) + const balanceAfter = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) - expect(isAddress(preparedCall.to)).toEqual(true) - expect(typeof preparedCall.value).toEqual("bigint") - expect(isHex(preparedCall.data)).toEqual(true) + await vi.waitFor(() => { + expect(transferHash).toMatch(ADDRESS_REGEX) + expect(balanceAfter).toBe(ethAmountWei) + }) + }, + TIMEOUT, + ) }) - // Execute a basic call with no value with the TBA to see if it works. - it( - isV2 ? "can executeCall with the TBA" : "can execute with the TBA", - async () => { + describe("execution", () => { + it(isV2 ? "can prepareExecuteCall" : "can prepareExecution", async () => { + await ensureETHInTBA() const execution = { account: ZORA721_TBA_ADDRESS, - to: zora721.proxyContractAddress, + to: TEST_CONFIG.RECIPIENT_ADDRESS, value: 0n, data: "", } - const executedCallTxHash = isV3 - ? await tokenboundClient.execute(execution) - : await tokenboundClient.executeCall(execution) + const preparedCall = isV3 + ? await tokenboundClient.prepareExecution(execution) + : await tokenboundClient.prepareExecuteCall(execution) - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: executedCallTxHash, - }) + expect(isAddress(preparedCall.to)).toEqual(true) + expect(typeof preparedCall.value).toEqual("bigint") + expect(isHex(preparedCall.data)).toEqual(true) + }) - await vi.waitFor(() => { - expect(executedCallTxHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) + // Execute a basic call with no value with the TBA to see if it works. + it( + isV2 ? "can executeCall with the TBA" : "can execute with the TBA", + async () => { + await ensureETHInTBA() + const execution = { + account: ZORA721_TBA_ADDRESS, + to: zora721.proxyContractAddress, + value: 0n, + data: "", + } - it( - "can fall back to executeCall from execute for V2", - async () => { - const execution = { - account: ZORA721_TBA_ADDRESS, - to: zora721.proxyContractAddress, - value: 0n, - data: "", - } + const executedCallTxHash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) - const executedCallTxHash = await tokenboundClient.execute(execution) + const transactionReceipt = await getReceipt(executedCallTxHash) - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: executedCallTxHash, - }) + await vi.waitFor(() => { + expect(executedCallTxHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) - await vi.waitFor(() => { - expect(executedCallTxHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) + it( + "can fall back to executeCall from execute for V2", + async () => { + await ensureETHInTBA() + const execution = { + account: ZORA721_TBA_ADDRESS, + to: zora721.proxyContractAddress, + value: 0n, + data: "", + } - // Other methods in the SDK implement executeCall, like transferETH, transferNFT, etc. - // so they provide further assurance that executeCall is working as expected: + const executedCallTxHash = await tokenboundClient.execute(execution) - it("can transferETH with the TBA", async () => { - const EXPECTED_BALANCE_BEFORE = parseUnits("1", 18) - const EXPECTED_BALANCE_AFTER = parseUnits("0.75", 18) + const transactionReceipt = await getReceipt(executedCallTxHash) - const balanceBefore = await publicClient.getBalance({ - address: ZORA721_TBA_ADDRESS, - }) - const ethTransferHash = await tokenboundClient.transferETH({ - account: ZORA721_TBA_ADDRESS, - amount: 0.25, - recipientAddress: ANVIL_USER_1, - }) + await vi.waitFor(() => { + expect(executedCallTxHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: ethTransferHash, - }) + // Other methods in the SDK implement executeCall, like transferETH, transferNFT, etc. + // so they provide further assurance that executeCall is working as expected: + }) - const balanceAfter = await publicClient.getBalance({ - address: ZORA721_TBA_ADDRESS, - }) + describe("transfers", () => { + it("can transferETH with the TBA", async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + // Assert the delta rather than absolute balances, so this test does not + // depend on how much ETH earlier tests happened to spend. + const TRANSFER_AMOUNT = parseUnits("0.25", 18) - console.log( - "BEFORE: ", - formatEther(balanceBefore), - "AFTER: ", - formatEther(balanceAfter), - ) + const balanceBefore = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + const ethTransferHash = await tokenboundClient.transferETH({ + account: ZORA721_TBA_ADDRESS, + amount: 0.25, + recipientAddress: ANVIL_USER_1, + }) - await vi.waitFor(() => { - expect(ethTransferHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - expect(balanceBefore).toBe(EXPECTED_BALANCE_BEFORE) - expect(balanceAfter).toBe(EXPECTED_BALANCE_AFTER) - }) - }) + const transactionReceipt = await getReceipt(ethTransferHash) - it("can transferETH to an ENS with the TBA", async () => { - const EXPECTED_BALANCE_BEFORE = parseUnits("0.75", 18) - const EXPECTED_BALANCE_AFTER = parseUnits("0.5", 18) + const balanceAfter = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) - const balanceBefore = await publicClient.getBalance({ - address: ZORA721_TBA_ADDRESS, - }) - const ethTransferHash = await tokenboundClient.transferETH({ - account: ZORA721_TBA_ADDRESS, - amount: 0.25, - recipientAddress: "jeebay.eth", - }) - const balanceAfter = await publicClient.getBalance({ - address: ZORA721_TBA_ADDRESS, + console.log( + "BEFORE: ", + formatEther(balanceBefore), + "AFTER: ", + formatEther(balanceAfter), + ) + + await vi.waitFor(() => { + expect(ethTransferHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + expect(balanceBefore - balanceAfter).toBe(TRANSFER_AMOUNT) + }) }) - console.log( - "BEFORE: ", - formatEther(balanceBefore), - "AFTER: ", - formatEther(balanceAfter), - ) + it("can transferETH to an ENS with the TBA", async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + // Assert the delta rather than absolute balances, so this test does not + // depend on how much ETH earlier tests happened to spend. + const TRANSFER_AMOUNT = parseUnits("0.25", 18) + + const balanceBefore = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + const ethTransferHash = await tokenboundClient.transferETH({ + account: ZORA721_TBA_ADDRESS, + amount: 0.25, + recipientAddress: "jeebay.eth", + }) + const balanceAfter = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) - await vi.waitFor(() => { - expect(ethTransferHash).toMatch(ADDRESS_REGEX) - expect(balanceBefore).toBe(EXPECTED_BALANCE_BEFORE) - expect(balanceAfter).toBe(EXPECTED_BALANCE_AFTER) + console.log( + "BEFORE: ", + formatEther(balanceBefore), + "AFTER: ", + formatEther(balanceAfter), + ) + + await vi.waitFor(() => { + expect(ethTransferHash).toMatch(ADDRESS_REGEX) + expect(balanceBefore - balanceAfter).toBe(TRANSFER_AMOUNT) + }) }) - }) - it("will not allow transferNFT 721 with an amount other than 1", async () => { - vi.spyOn(console, "error") + it("will not allow transferNFT 721 with an amount other than 1", async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + vi.spyOn(console, "error") - await expect(() => - tokenboundClient.transferNFT({ + await expect(() => + tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC721", + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID1_IN_TBA, + recipientAddress: ANVIL_USER_1, + amount: 2, + }), + ).rejects.toThrowError() + }) + + it("can transferNFT a 721 with the TBA", async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + const transferNFTHash = await tokenboundClient.transferNFT({ account: ZORA721_TBA_ADDRESS, tokenType: "ERC721", tokenContract: zora721.proxyContractAddress, tokenId: TOKENID1_IN_TBA, recipientAddress: ANVIL_USER_1, - amount: 2, - }), - ).rejects.toThrowError() - }) - - it("can transferNFT a 721 with the TBA", async () => { - const transferNFTHash = await tokenboundClient.transferNFT({ - account: ZORA721_TBA_ADDRESS, - tokenType: "ERC721", - tokenContract: zora721.proxyContractAddress, - tokenId: TOKENID1_IN_TBA, - recipientAddress: ANVIL_USER_1, - }) + }) - const anvilAccount1NFTBalance = await getZora721Balance({ - publicClient, - walletAddress: ANVIL_USER_1, - }) + const anvilAccount1NFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) - await vi.waitFor(() => { - expect(transferNFTHash).toMatch(ADDRESS_REGEX) - expect(anvilAccount1NFTBalance).toBe(1n) + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1NFTBalance).toBe(1n) + }) }) - }) - it("can transferNFT to an ENS with the TBA", async () => { - const transferNFTHash = await tokenboundClient.transferNFT({ - account: ZORA721_TBA_ADDRESS, - tokenType: "ERC721", - tokenContract: zora721.proxyContractAddress, - tokenId: TOKENID2_IN_TBA, - recipientAddress: "jeebay.eth", - }) + it("can transferNFT to an ENS with the TBA", async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + const transferNFTHash = await tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC721", + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID2_IN_TBA, + recipientAddress: "jeebay.eth", + }) - const addr = await resolvePossibleENS(publicClient, "jeebay.eth") + const addr = await resolvePossibleENS(publicClient, "jeebay.eth") - const anvilAccount1NFTBalance = await getZora721Balance({ - publicClient, - walletAddress: addr, - }) + const anvilAccount1NFTBalance = await getZora721Balance({ + publicClient, + walletAddress: addr, + }) - await vi.waitFor(() => { - expect(transferNFTHash).toMatch(ADDRESS_REGEX) - expect(anvilAccount1NFTBalance).toBe(1n) + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1NFTBalance).toBe(1n) + }) }) }) - it("can mint 4 Zora 721 NFTs with the TBA", async () => { - const encodedMintFunctionData = encodeFunctionData({ - abi: zora721.abi, - functionName: "purchase", - args: [BigInt(zora721.quantity)], - }) + describe("minting", () => { + it("can mint 4 Zora 721 NFTs with the TBA", async () => { + await ensureETHInTBA() + const encodedMintFunctionData = encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [BigInt(zora721.quantity)], + }) - const execution = { - account: ZORA721_TBA_ADDRESS, - to: zora721.proxyContractAddress, - value: zora721.mintPrice * BigInt(zora721.quantity), - data: encodedMintFunctionData, - } + const execution = { + account: ZORA721_TBA_ADDRESS, + to: zora721.proxyContractAddress, + value: zora721.mintPrice * BigInt(zora721.quantity), + data: encodedMintFunctionData, + } - const mintToTBATxHash = isV3 - ? await tokenboundClient.execute(execution) - : await tokenboundClient.executeCall(execution) + const mintToTBATxHash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) - const zoraBalanceInTBA = await getZora721Balance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) + const zoraBalanceInTBA = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) - console.log("721s MINTED TO TBA: ", zoraBalanceInTBA.toString()) + console.log("721s MINTED TO TBA: ", zoraBalanceInTBA.toString()) - await vi.waitFor(() => { - expect(mintToTBATxHash).toMatch(ADDRESS_REGEX) - expect(NFT_IN_EOA.tokenId).toBe(TOKENID_IN_EOA) - expect(zoraBalanceInTBA).toBe(4n) + await vi.waitFor(() => { + expect(mintToTBATxHash).toMatch(ADDRESS_REGEX) + expect(NFT_IN_EOA.tokenId).toBe(TOKENID_IN_EOA) + expect(zoraBalanceInTBA).toBe(4n) + }) }) - }) - it("can mint an 1155 with the TBA", async () => { - const mintingAccount: `0x${string}` = ZORA721_TBA_ADDRESS + it("can mint an 1155 with the TBA", async () => { + await ensureETHInTBA() + const mintingAccount: `0x${string}` = ZORA721_TBA_ADDRESS - const minterArguments: `0x${string}` = encodeAbiParameters( - parseAbiParameters("address"), - [mintingAccount], - ) + const minterArguments: `0x${string}` = encodeAbiParameters( + parseAbiParameters("address"), + [mintingAccount], + ) - const data = encodeFunctionData({ - abi: zora1155.abi, - functionName: "mint", - args: [ - zora1155.fixedPriceSalesStrategy, // IMinter1155 - zora1155.tokenId, // uint256 - zora1155.quantity, // uint256 - minterArguments, // bytes - ], - }) + const data = encodeFunctionData({ + abi: zora1155.abi, + functionName: "mint", + args: [ + zora1155.fixedPriceSalesStrategy, // IMinter1155 + zora1155.tokenId, // uint256 + zora1155.quantity, // uint256 + minterArguments, // bytes + ], + }) - const execution = { - account: mintingAccount, - to: zora1155.proxyContractAddress, - value: zora1155.mintFee * zora1155.quantity, - data, - } + const execution = { + account: mintingAccount, + to: zora1155.proxyContractAddress, + value: zora1155.mintFee * zora1155.quantity, + data, + } - const mint1155TxHash = isV3 - ? await tokenboundClient.execute(execution) - : await tokenboundClient.executeCall(execution) + const mint1155TxHash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) - const zora1155BalanceInTBA = await getZora1155Balance({ - publicClient, - walletAddress: mintingAccount, - }) + const zora1155BalanceInTBA = await getZora1155Balance({ + publicClient, + walletAddress: mintingAccount, + }) - console.log("1155 Balance", zora1155BalanceInTBA) + console.log("1155 Balance", zora1155BalanceInTBA) - await vi.waitFor(() => { - expect(mint1155TxHash).toMatch(ADDRESS_REGEX) - expect(zora1155BalanceInTBA).toBe(5n) + await vi.waitFor(() => { + expect(mint1155TxHash).toMatch(ADDRESS_REGEX) + expect(zora1155BalanceInTBA).toBe(5n) + }) }) - }) - it("can transferNFT an 1155 with the TBA", async () => { - const transferAmount = 2 + it("can transferNFT an 1155 with the TBA", async () => { + await ensure1155sInTBA() + const transferAmount = 2 - const transferNFTHash = await tokenboundClient.transferNFT({ - account: ZORA721_TBA_ADDRESS, - tokenType: "ERC1155", - tokenContract: zora1155.proxyContractAddress, - tokenId: zora1155.tokenId.toString(), - recipientAddress: ANVIL_USER_1, - amount: transferAmount, - }) + const transferNFTHash = await tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC1155", + tokenContract: zora1155.proxyContractAddress, + tokenId: zora1155.tokenId.toString(), + recipientAddress: ANVIL_USER_1, + amount: transferAmount, + }) - const anvilAccount1_1155Balance = await getZora1155Balance({ - publicClient, - walletAddress: ANVIL_USER_1, - }) + const anvilAccount1_1155Balance = await getZora1155Balance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) - console.log("1155 Balance", anvilAccount1_1155Balance) + console.log("1155 Balance", anvilAccount1_1155Balance) - await vi.waitFor(() => { - expect(transferNFTHash).toMatch(ADDRESS_REGEX) - expect(anvilAccount1_1155Balance).toBe(BigInt(transferAmount)) + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1_1155Balance).toBe(BigInt(transferAmount)) + }) }) }) - v3OnlyIt( - "can verify if a wallet isValidSigner for an owned NFT", - async () => { - console.log("ZORA721_TBA_ADDRESS in isValidSigner", ZORA721_TBA_ADDRESS) - const isValidSigner = await tokenboundClient.isValidSigner({ - account: ZORA721_TBA_ADDRESS, - }) + describe("signing", () => { + v3OnlyIt( + "can verify if a wallet isValidSigner for an owned NFT", + async () => { + await ensureTBA() + console.log( + "ZORA721_TBA_ADDRESS in isValidSigner", + ZORA721_TBA_ADDRESS, + ) + const isValidSigner = await tokenboundClient.isValidSigner({ + account: ZORA721_TBA_ADDRESS, + }) - console.log("isValidSigner?", isValidSigner) + console.log("isValidSigner?", isValidSigner) - await vi.waitFor(() => { - expect(isValidSigner).toBe(true) + await vi.waitFor(() => { + expect(isValidSigner).toBe(true) + }) + }, + ) + + it("can sign a message", async () => { + await ensureTBA() + const signedMessageHash = await tokenboundClient.signMessage({ + message: "Sign me", }) - }, - ) - - // Test signing in viem only. - // Ethers 5/6 don't appear to support signing messages via personal_sign with this testing configuration. - viemOnlyIt("can sign a message", async () => { - const signedMessageHash = await tokenboundClient.signMessage({ - message: "Sign me", - }) - console.log("SIGNED MESSAGE: ", signedMessageHash) + console.log("SIGNED MESSAGE: ", signedMessageHash) - await vi.waitFor(() => { - expect(signedMessageHash).toMatch(ADDRESS_REGEX) + await vi.waitFor(() => { + expect(signedMessageHash).toMatch(ADDRESS_REGEX) + }) }) - }) - // Test signing hex message in viem only. - viemOnlyIt("can sign a hexified message", async () => { - const hexSignedMessageHash = await tokenboundClient.signMessage({ - message: { raw: "0x68656c6c6f20776f726c64" }, - }) + // Test signing a hex message. + it("can sign a hexified message", async () => { + await ensureTBA() + const hexSignedMessageHash = await tokenboundClient.signMessage({ + message: { raw: "0x68656c6c6f20776f726c64" }, + }) - console.log("HEX SIGNED MESSAGE: ", hexSignedMessageHash) + console.log("HEX SIGNED MESSAGE: ", hexSignedMessageHash) - await vi.waitFor(() => { - expect(hexSignedMessageHash).toMatch(ADDRESS_REGEX) + await vi.waitFor(() => { + expect(hexSignedMessageHash).toMatch(ADDRESS_REGEX) + }) }) - }) - // Test signing Uint8Array message as raw in viem only. - viemOnlyIt("can sign a Uint8Array message as raw", async () => { - const uint8ArrayMessage: Uint8Array = new Uint8Array([ - 72, 101, 108, 108, 111, - ]) // "Hello" in ASCII + // Test signing a Uint8Array message as raw. + it("can sign a Uint8Array message as raw", async () => { + await ensureTBA() + const uint8ArrayMessage: Uint8Array = new Uint8Array([ + 72, 101, 108, 108, 111, + ]) // "Hello" in ASCII - const rawUint8Hash = await tokenboundClient.signMessage({ - message: { raw: uint8ArrayMessage }, - }) + const rawUint8Hash = await tokenboundClient.signMessage({ + message: { raw: uint8ArrayMessage }, + }) - await vi.waitFor(() => { - expect(rawUint8Hash).toMatch(ADDRESS_REGEX) + await vi.waitFor(() => { + expect(rawUint8Hash).toMatch(ADDRESS_REGEX) + }) }) - }) - // Test signing ArrayLike message in viem only. - viemOnlyIt( - "throws when viem incorrectly receives an ArrayLike message for signing", - async () => { + // Test signing an ArrayLike message. + it("throws when viem incorrectly receives an ArrayLike message for signing", async () => { + await ensureTBA() vi.spyOn(console, "error") const arrayMessage: ArrayLike = [72, 101, 108, 108, 111] // "Hello" in ASCII await expect(() => tokenboundClient.signMessage({ - message: arrayMessage, + // Intentionally invalid: viem rejects ArrayLike at runtime. + message: arrayMessage as unknown as SignableMessage, }), ).rejects.toThrowError() - }, - ) + }) - // Test signing Uint8Array message in viem only. - viemOnlyIt( - "throws when viem incorrectly receives an Uint8Array message for signing", - async () => { + // Test signing a bare Uint8Array message. + it("throws when viem incorrectly receives an Uint8Array message for signing", async () => { + await ensureTBA() const uint8ArrayMessage: Uint8Array = new Uint8Array([ 72, 101, 108, 108, 111, ]) // "Hello" in ASCII await expect(() => tokenboundClient.signMessage({ - message: uint8ArrayMessage, + // Intentionally invalid: a bare Uint8Array must be { raw }. + message: uint8ArrayMessage as unknown as SignableMessage, }), ).rejects.toThrowError() - }, - ) - - it( - "can transferERC20 with the TBA", - async () => { - const depositEthValue = 0.2 - const depositWeiValue = ethToWei(depositEthValue) - const transferEthValue = 0.1 - const transferWeiValue = ethToWei(transferEthValue) - let wethDepositHash: `0x${string}` - let wethTransferHash: `0x${string}` - - const tbaWETHInitial = await getWETHBalance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) + }) - // Prepare encoded WETH transfer to TBA - const wethTransferCallData = encodeFunctionData({ - abi: wethABI, - functionName: "transfer", - args: [ZORA721_TBA_ADDRESS, depositWeiValue], - }) + it( + "can transferERC20 with the TBA", + async () => { + await ensureTBA() + const depositEthValue = 0.2 + const depositWeiValue = ethToWei(depositEthValue) + const transferEthValue = 0.1 + const transferWeiValue = ethToWei(transferEthValue) + const tbaWETHInitial = await getWETHBalance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + + // Prepare encoded WETH transfer to TBA + const wethTransferCallData = encodeFunctionData({ + abi: wethABI, + functionName: "transfer", + args: [ZORA721_TBA_ADDRESS, depositWeiValue], + }) - if (walletClient) { if (!walletClient.account?.address) { throw new Error("walletClient.account is undefined") } @@ -1075,102 +1205,85 @@ describe.each(ENABLED_TESTS)( }) // Convert ETH to WETH in ANVIL_USER_0 wallet - wethDepositHash = await wethContract.write.deposit({ + const wethDepositHash = await wethContract.write.deposit({ account: ANVIL_USER_0, chain: ANVIL_CONFIG.ACTIVE_CHAIN, value: depositWeiValue, }) // Transfer WETH from ANVIL_USER_0 to TBA - wethTransferHash = await walletClient.sendTransaction({ + const wethTransferHash = await walletClient.sendTransaction({ account: walletClient.account, chain: ANVIL_CONFIG.ACTIVE_CHAIN, to: WETH_CONTRACT_ADDRESS, value: 0n, data: wethTransferCallData, }) - } else if (signer) { - // Convert ETH to WETH in ANVIL_USER_0 wallet - wethDepositHash = await signer - .sendTransaction({ - to: WETH_CONTRACT_ADDRESS, - value: depositWeiValue, - }) - .then((tx: providers.TransactionResponse) => tx.hash) - // Transfer WETH from ANVIL_USER_0 to TBA - wethTransferHash = await signer - .sendTransaction({ - to: WETH_CONTRACT_ADDRESS, - value: BigInt(0), - data: wethTransferCallData, - }) - .then((tx: providers.TransactionResponse) => tx.hash) - } - - const tbaWETHReceived = await getWETHBalance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) + const tbaWETHReceived = await getWETHBalance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) - // Transfer WETH from TBA to ANVIL_USER_1 - const transferredERC20Hash = await tokenboundClient.transferERC20({ - account: ZORA721_TBA_ADDRESS, - amount: transferEthValue, - recipientAddress: ANVIL_USER_1, - erc20tokenAddress: WETH_CONTRACT_ADDRESS, - erc20tokenDecimals: 18, - }) + // Transfer WETH from TBA to ANVIL_USER_1 + const transferredERC20Hash = await tokenboundClient.transferERC20({ + account: ZORA721_TBA_ADDRESS, + amount: transferEthValue, + recipientAddress: ANVIL_USER_1, + erc20tokenAddress: WETH_CONTRACT_ADDRESS, + erc20tokenDecimals: 18, + }) - // Transfer WETH from TBA to jeebay.eth - const ensTransferredERC20Hash = await tokenboundClient.transferERC20({ - account: ZORA721_TBA_ADDRESS, - amount: transferEthValue, - recipientAddress: "jeebay.eth", - erc20tokenAddress: WETH_CONTRACT_ADDRESS, - erc20tokenDecimals: 18, - }) + // Transfer WETH from TBA to jeebay.eth + const ensTransferredERC20Hash = await tokenboundClient.transferERC20({ + account: ZORA721_TBA_ADDRESS, + amount: transferEthValue, + recipientAddress: "jeebay.eth", + erc20tokenAddress: WETH_CONTRACT_ADDRESS, + erc20tokenDecimals: 18, + }) - const tbaWETHFinal = await getWETHBalance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) + const tbaWETHFinal = await getWETHBalance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) - const anvilUser1WETHBalance = await getWETHBalance({ - publicClient, - walletAddress: ANVIL_USER_1, - }) + const anvilUser1WETHBalance = await getWETHBalance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) - const ensWETHBalance = await getWETHBalance({ - publicClient, - walletAddress: "jeebay.eth", - }) + const ensWETHBalance = await getWETHBalance({ + publicClient, + walletAddress: "jeebay.eth", + }) - console.log( - "TBA WETH INITIAL: ", - formatEther(tbaWETHInitial), - "TBA RECEIVED: ", - formatEther(tbaWETHReceived), - "AFTER: ", - formatEther(tbaWETHFinal), - "ANVIL USER 1 BALANCE: ", - formatEther(anvilUser1WETHBalance), - "ENS BALANCE: ", - formatEther(ensWETHBalance), - ) + console.log( + "TBA WETH INITIAL: ", + formatEther(tbaWETHInitial), + "TBA RECEIVED: ", + formatEther(tbaWETHReceived), + "AFTER: ", + formatEther(tbaWETHFinal), + "ANVIL USER 1 BALANCE: ", + formatEther(anvilUser1WETHBalance), + "ENS BALANCE: ", + formatEther(ensWETHBalance), + ) - await vi.waitFor(() => { - expect(wethDepositHash).toMatch(ADDRESS_REGEX) - expect(wethTransferHash).toMatch(ADDRESS_REGEX) - expect(transferredERC20Hash).toMatch(ADDRESS_REGEX) - expect(ensTransferredERC20Hash).toMatch(ADDRESS_REGEX) - expect(tbaWETHReceived).toBe(depositWeiValue) - expect(anvilUser1WETHBalance).toBe(transferWeiValue) - expect(ensWETHBalance).toBe(transferWeiValue) - }) - }, - TIMEOUT, - ) + await vi.waitFor(() => { + expect(wethDepositHash).toMatch(ADDRESS_REGEX) + expect(wethTransferHash).toMatch(ADDRESS_REGEX) + expect(transferredERC20Hash).toMatch(ADDRESS_REGEX) + expect(ensTransferredERC20Hash).toMatch(ADDRESS_REGEX) + expect(tbaWETHReceived).toBe(depositWeiValue) + expect(anvilUser1WETHBalance).toBe(transferWeiValue) + expect(ensWETHBalance).toBe(transferWeiValue) + }) + }, + TIMEOUT, + ) + }) }, ) diff --git a/packages/sdk/src/test/config/setup.ts b/packages/sdk/src/test/config/setup.ts deleted file mode 100644 index df6631e..0000000 --- a/packages/sdk/src/test/config/setup.ts +++ /dev/null @@ -1 +0,0 @@ -import "@testing-library/jest-dom" diff --git a/packages/sdk/src/test/config/shell.ts b/packages/sdk/src/test/config/shell.ts deleted file mode 100644 index a230a72..0000000 --- a/packages/sdk/src/test/config/shell.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const SHELL_COMMANDS = { - // SET_ADDRESS_BYTECODE: 'cast rpc anvil_setCode 0x4e59b44847b379578588920ca78fbf26c0b4956c 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3', - // SET_ADDRESS_BYTECODE: `cast rpc anvil_setCode ${ANVIL_ACCOUNTS[0].address} 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3`, - // DEPLOY_REGISTRY: - // 'forge script --fork-url http://127.0.0.1:8545 6551contracts/script/DeployRegistry.s.sol --broadcast', - // DEPLOY_ACCOUNT_IMPLEMENTATION: `forge create 6551contracts/src/examples/simple/SimpleERC6551Account.sol:SimpleERC6551Account --rpc-url=$RPC_URL --private-key=$PRIVATE_KEY`, -} diff --git a/packages/sdk/src/test/constants/anvil.ts b/packages/sdk/src/test/constants/anvil.ts index 6b51b8e..69828a3 100644 --- a/packages/sdk/src/test/constants/anvil.ts +++ b/packages/sdk/src/test/constants/anvil.ts @@ -1,6 +1,6 @@ +import { getAddress } from "viem" import { foundry } from "viem/chains" import type { AnvilAccount } from "../../types" -import { getAddress } from "viem" export const ANVIL_RPC_URL = foundry.rpcUrls.default.http[0] diff --git a/packages/sdk/src/test/mockWallet.tsx b/packages/sdk/src/test/mockWallet.tsx deleted file mode 100644 index d11912b..0000000 --- a/packages/sdk/src/test/mockWallet.tsx +++ /dev/null @@ -1,46 +0,0 @@ - -import type { default as userEvent } from "@testing-library/user-event" -// import { createPublicClient, WalletClient, PublicClient, createWalletClient, http } from 'viem' -// import { MockConnector } from 'wagmi/connectors/mock' - -// import { getMockWalletClient, getPublicClient } from './utils/clients' - -// import { foundry } from 'viem/chains' - -// type SetupClient = Partial & { -// walletClient?: WalletClient -// } -// export function setupConfig({ -// walletClient = getMockWalletClient() as WalletClient, -// ...config -// }: SetupClient = {}): WagmiConfigProps['config'] { -// return createConfig({ -// connectors: [new MockConnector({ options: { walletClient } })], -// publicClient: getPublicClient({ chainId: foundry.id }) as PublicClient, -// ...config, -// }) -// } - -// type ProvidersProps = { -// children: React.ReactNode -// // config?: WagmiConfigProps['config'] -// config?: WagmiConfig['config'] -// config?: WagmiConfig['config'] -// } -// export function Providers({ children, config = setupConfig() }: ProvidersProps) { -// return {children} -// } - -// const renderWithWagmiConfig = ( -// ui: React.ReactElement, -// options?: RenderOptions -// ): RenderResult => render(ui, { wrapper: Providers, ...options }) - -export * from "@testing-library/react" -// export { renderWithWagmiConfig } - -export type UserEvent = ReturnType -export { default as userEvent } from "@testing-library/user-event" - -export { getMockWalletClient } from "./utils" -export { ADDRESS_REGEX } from "./constants" diff --git a/packages/sdk/src/test/unit/protocol.test.ts b/packages/sdk/src/test/unit/protocol.test.ts new file mode 100644 index 0000000..97ccd6e --- /dev/null +++ b/packages/sdk/src/test/unit/protocol.test.ts @@ -0,0 +1,332 @@ +// Deterministic protocol tests. No network, no anvil: these exercise the +// library-independent layer that both @tokenbound/sdk and @tokenbound/ethers use. + +import { getAddress, isAddress, isHex } from "viem" +import { describe, expect, it } from "vitest" +import { + computeAccount, + deconstructBytecode, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeExecution, + encodeNFTTransfer, + getAccountAddress, + getTokenboundV3Account, + isCustomImplementation, + prepareCreateAccountTx, + resolveDeployment, +} from "../../protocol" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../../protocol/constants" +import { TBVersion } from "../../types" + +const TOKEN_CONTRACT = getAddress("0x7c74dfe39976dc395529c14e54a597809980e01c") +const TOKEN_ID = "1" +const CHAIN_ID = 1 + +describe("resolveDeployment", () => { + it("defaults to the V3 deployment", () => { + const deployment = resolveDeployment({}) + expect(deployment.supportsV3).toBe(true) + expect(deployment.implementationAddress).toBe( + ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS, + ) + expect(deployment.registryAddress).toBe(ERC_6551_DEFAULT.REGISTRY.ADDRESS) + }) + + it("resolves V2 when the version is pinned", () => { + const deployment = resolveDeployment({ version: TBVersion.V2 }) + expect(deployment.supportsV3).toBe(false) + expect(deployment.registryAddress).toBe(ERC_6551_LEGACY_V2.REGISTRY.ADDRESS) + }) + + it("infers V2 from a legacy implementation address", () => { + const deployment = resolveDeployment({ + implementationAddress: ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS, + }) + expect(deployment.supportsV3).toBe(false) + expect(deployment.registryAddress).toBe(ERC_6551_LEGACY_V2.REGISTRY.ADDRESS) + }) + + it("honours a custom registry address when pinned to V2", () => { + const custom = getAddress("0x000000000000000000000000000000000000dEaD") + const deployment = resolveDeployment({ + version: TBVersion.V2, + registryAddress: custom, + }) + expect(deployment.registryAddress).toBe(custom) + }) +}) + +describe("account derivation", () => { + it("derives a V3 account deterministically", () => { + const a = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + resolveDeployment({}), + ) + const b = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + resolveDeployment({}), + ) + expect(isAddress(a)).toBe(true) + expect(a).toBe(b) + }) + + it("matches the standalone V3 derivation function", () => { + const deployment = resolveDeployment({}) + expect( + getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + deployment, + ), + ).toBe( + getTokenboundV3Account( + TOKEN_CONTRACT, + TOKEN_ID, + CHAIN_ID, + deployment.implementationAddress, + deployment.registryAddress, + 0, + ), + ) + }) + + it("matches the standalone V2 derivation function", () => { + const deployment = resolveDeployment({ version: TBVersion.V2 }) + expect( + getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + deployment, + ), + ).toBe( + computeAccount( + TOKEN_CONTRACT, + TOKEN_ID, + CHAIN_ID, + deployment.implementationAddress, + deployment.registryAddress, + 0, + ), + ) + }) + + it("derives a different address for a different salt", () => { + const deployment = resolveDeployment({}) + const base = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + deployment, + ) + const salted = getAccountAddress( + { + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + chainId: CHAIN_ID, + salt: 6551, + }, + deployment, + ) + expect(salted).not.toBe(base) + }) + + it("derives a different address per chain", () => { + const deployment = resolveDeployment({}) + const mainnetAcct = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: 1 }, + deployment, + ) + const zoraAcct = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: 7777777 }, + deployment, + ) + expect(mainnetAcct).not.toBe(zoraAcct) + }) + + it("derives V2 and V3 accounts to different addresses", () => { + const v3 = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + resolveDeployment({}), + ) + const v2 = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + resolveDeployment({ version: TBVersion.V2 }), + ) + expect(v2).not.toBe(v3) + }) +}) + +describe("isCustomImplementation", () => { + it("is false for the canonical deployment", () => { + expect(isCustomImplementation(resolveDeployment({}))).toBe(false) + }) + + it("is true for a third-party implementation", () => { + const deployment = resolveDeployment({ + implementationAddress: getAddress( + "0x000000000000000000000000000000000000bEEF", + ), + }) + expect(isCustomImplementation(deployment)).toBe(true) + }) +}) + +describe("prepareCreateAccountTx", () => { + it("routes standard V3 creation through multicall3", async () => { + const tx = await prepareCreateAccountTx( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + resolveDeployment({}), + ) + expect(isHex(tx.data as string)).toBe(true) + expect(tx.value).toBe(0n) + }) + + it("returns a direct registry call for custom implementations", async () => { + const deployment = resolveDeployment({ + implementationAddress: getAddress( + "0x000000000000000000000000000000000000bEEF", + ), + registryAddress: ERC_6551_DEFAULT.REGISTRY.ADDRESS, + }) + const tx = await prepareCreateAccountTx( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: CHAIN_ID }, + deployment, + ) + expect(getAddress(tx.to as string)).toBe(ERC_6551_DEFAULT.REGISTRY.ADDRESS) + }) + + it("rejects appendedCalls on the legacy V2 implementation", async () => { + await expect( + prepareCreateAccountTx( + { + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + chainId: CHAIN_ID, + appendedCalls: [ + { target: TOKEN_CONTRACT, allowFailure: false, callData: "0x" }, + ], + }, + resolveDeployment({ version: TBVersion.V2 }), + ), + ).rejects.toThrow(/Multicall via appendedCalls is not supported/) + }) +}) + +describe("execution encoding", () => { + const account = getAddress("0x000000000000000000000000000000000000c0de") + + it("encodes a V3 execution targeting the account", () => { + const encoded = encodeExecution({ + account, + to: TOKEN_CONTRACT, + value: 0n, + data: "0x", + }) + expect(encoded.to).toBe(account) + expect(isHex(encoded.data)).toBe(true) + }) + + it("encodes a legacy V2 executeCall", async () => { + const encoded = await encodeExecuteCall({ + account, + to: TOKEN_CONTRACT, + value: 0n, + data: "0x", + }) + expect(encoded.to).toBe(account) + expect(isHex(encoded.data)).toBe(true) + }) + + it("produces different calldata for V2 and V3 executions", async () => { + const v3 = encodeExecution({ + account, + to: TOKEN_CONTRACT, + value: 1n, + data: "0x", + }) + const v2 = await encodeExecuteCall({ + account, + to: TOKEN_CONTRACT, + value: 1n, + data: "0x", + }) + expect(v3.data).not.toBe(v2.data) + }) +}) + +describe("transfer encoding", () => { + const account = getAddress("0x000000000000000000000000000000000000c0de") + const recipient = getAddress("0x02101dfb77fde026414827fdc604ddaf224f0921") + + it("encodes an ERC721 transfer", () => { + const t = encodeNFTTransfer({ + account, + tokenType: "ERC721", + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + recipient, + }) + expect(t.to).toBe(TOKEN_CONTRACT) + expect(t.value).toBe(0n) + expect(isHex(t.data)).toBe(true) + }) + + it("rejects ERC721 transfers with an amount other than 1", () => { + expect(() => + encodeNFTTransfer({ + account, + tokenType: "ERC721", + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + recipient, + amount: 2, + }), + ).toThrow(/ERC721 transfers can only transfer one token at a time/) + }) + + it("encodes an ERC1155 transfer with an amount", () => { + const t = encodeNFTTransfer({ + account, + tokenType: "ERC1155", + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + recipient, + amount: 4, + }) + expect(isHex(t.data)).toBe(true) + }) + + it("encodes an ETH transfer in wei", () => { + const t = encodeETHTransfer({ recipient, amount: 0.1 }) + expect(t.to).toBe(recipient) + expect(t.value).toBe(100000000000000000n) + expect(t.data).toBe("0x") + }) + + it("encodes an ERC-20 transfer", () => { + const t = encodeERC20Transfer({ + recipient, + amount: 1, + erc20tokenAddress: TOKEN_CONTRACT, + erc20tokenDecimals: 18, + }) + expect(t.to).toBe(TOKEN_CONTRACT) + expect(isHex(t.data)).toBe(true) + }) + + it("rejects out-of-range ERC-20 decimals", () => { + expect(() => + encodeERC20Transfer({ + recipient, + amount: 1, + erc20tokenAddress: TOKEN_CONTRACT, + erc20tokenDecimals: 19, + }), + ).toThrow(/Decimal value out of range/) + }) +}) + +describe("deconstructBytecode", () => { + it("returns null for undeployed accounts", () => { + expect(deconstructBytecode(undefined)).toBeNull() + expect(deconstructBytecode("0x")).toBeNull() + }) +}) diff --git a/packages/sdk/src/test/unit/viemExtension.test-d.ts b/packages/sdk/src/test/unit/viemExtension.test-d.ts new file mode 100644 index 0000000..5cec7ed --- /dev/null +++ b/packages/sdk/src/test/unit/viemExtension.test-d.ts @@ -0,0 +1,138 @@ +// Type-level tests for the viem .extend(tokenboundActions()) surface. +// +// These assert on *values* returned by the actions rather than on +// `expectTypeOf(fn).returns`, because the latter erases to `any` and would +// silently pass. Failures here surface as compile errors under +// `vitest --typecheck`. +// +// Async assertions live inside `assertTypes` callbacks that are type-checked +// but never invoked, so no RPC is ever dispatched from this file. + +import { + type Address, + createPublicClient, + createWalletClient, + type Hex, + http, +} from "viem" +import { privateKeyToAccount } from "viem/accounts" +import { mainnet } from "viem/chains" +import { describe, expectTypeOf, it } from "vitest" +import type { CallData, MultiCallTx, TokenboundAccountNFT } from "../../types" +import { tokenboundActions } from "../../viem" + +const account = privateKeyToAccount( + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", +) + +const publicClient = createPublicClient({ + chain: mainnet, + transport: http("http://127.0.0.1:8545"), +}) + +const walletClient = createWalletClient({ + chain: mainnet, + transport: http("http://127.0.0.1:8545"), + account, +}) + +/** Type-checks its body without ever executing it. */ +const assertTypes = (_fn: () => Promise) => {} + +const TOKEN = { + tokenContract: "0x7c74dfe39976dc395529c14e54a597809980e01c", + tokenId: "1", +} as const + +describe("viem extension typing", () => { + it("infers a deterministic Address for getAccount", () => { + const client = publicClient.extend(tokenboundActions()) + const result = client.tokenbound.getAccount(TOKEN) + expectTypeOf(result).toEqualTypeOf
() + }) + + it("infers Hex for wallet write actions", () => { + assertTypes(async () => { + const client = walletClient.extend(tokenboundActions()) + + const executed = await client.tokenbound.execute({ + account: TOKEN.tokenContract, + to: TOKEN.tokenContract, + value: 0n, + data: "0x", + }) + expectTypeOf(executed).toEqualTypeOf() + + const sentEth = await client.tokenbound.transferETH({ + account: TOKEN.tokenContract, + recipientAddress: TOKEN.tokenContract, + amount: 0.1, + }) + expectTypeOf(sentEth).toEqualTypeOf() + + const signed = await client.tokenbound.signMessage({ message: "gm" }) + expectTypeOf(signed).toEqualTypeOf() + }) + }) + + it("infers the createAccount result shape", () => { + assertTypes(async () => { + const client = walletClient.extend(tokenboundActions()) + const created = await client.tokenbound.createAccount(TOKEN) + expectTypeOf(created).toEqualTypeOf<{ account: Address; txHash: Hex }>() + }) + }) + + it("infers prepared-transaction and read shapes", () => { + assertTypes(async () => { + const client = publicClient.extend(tokenboundActions()) + + const prepared = await client.tokenbound.prepareCreateAccount(TOKEN) + expectTypeOf(prepared).toEqualTypeOf() + + const execution = await client.tokenbound.prepareExecution({ + account: TOKEN.tokenContract, + to: TOKEN.tokenContract, + value: 0n, + data: "0x", + }) + expectTypeOf(execution).toEqualTypeOf() + + const deployed = await client.tokenbound.checkAccountDeployment({ + accountAddress: TOKEN.tokenContract, + }) + expectTypeOf(deployed).toEqualTypeOf() + + const nft = await client.tokenbound.getNFT({ + accountAddress: TOKEN.tokenContract, + }) + expectTypeOf(nft).toEqualTypeOf() + }) + }) + + it("preserves viem's own client type inference", () => { + const client = walletClient.extend(tokenboundActions()) + expectTypeOf(client.chain).toEqualTypeOf() + expectTypeOf(client.account).toEqualTypeOf() + }) + + it("narrows a public client to read-only tokenbound actions", () => { + const client = publicClient.extend(tokenboundActions()) + expectTypeOf(client.tokenbound).toHaveProperty("getAccount") + expectTypeOf(client.tokenbound).not.toHaveProperty("execute") + }) + + it("exposes write actions for the wagmi `Address | undefined` shape", () => { + // wagmi's useAccount() returns `Address | undefined`, which is the most + // common way a wallet client is built in an app. It must still get the + // full action surface. + const maybeAddress = undefined as Address | undefined + const client = createWalletClient({ + chain: mainnet, + transport: http("http://127.0.0.1:8545"), + account: maybeAddress, + }).extend(tokenboundActions()) + expectTypeOf(client.tokenbound).toHaveProperty("execute") + expectTypeOf(client.tokenbound).toHaveProperty("transferETH") + }) +}) diff --git a/packages/sdk/src/test/unit/viemExtension.test.ts b/packages/sdk/src/test/unit/viemExtension.test.ts new file mode 100644 index 0000000..2e1587a --- /dev/null +++ b/packages/sdk/src/test/unit/viemExtension.test.ts @@ -0,0 +1,246 @@ +// viem .extend(tokenboundActions()) tests: shape, wiring, deterministic +// behavior and type inference. These run without anvil; the anvil-backed +// integration coverage lives in TestAll.test.ts. + +import { + type Address, + createPublicClient, + createWalletClient, + http, + isAddress, +} from "viem" +import { privateKeyToAccount } from "viem/accounts" +import { mainnet } from "viem/chains" +import { describe, expect, it } from "vitest" +import { + encodeExecuteCall, + getAccountAddress, + resolveDeployment, +} from "../../protocol" +import { TBVersion } from "../../types" +import { tokenboundActions } from "../../viem" +import { getAccount as getAccountAction } from "../../viem/actions" + +const TOKEN_CONTRACT: Address = "0x7c74dfe39976dc395529c14e54a597809980e01c" +const TOKEN_ID = "1" +const RPC = "http://127.0.0.1:8545" + +const account = privateKeyToAccount( + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", +) + +const publicClient = createPublicClient({ + chain: mainnet, + transport: http(RPC), +}) +const walletClient = createWalletClient({ + chain: mainnet, + transport: http(RPC), + account, +}) + +describe("tokenboundActions decorator", () => { + it("namespaces the API under .tokenbound", () => { + const client = publicClient.extend(tokenboundActions()) + expect(client.tokenbound).toBeDefined() + expect(typeof client.tokenbound.getAccount).toBe("function") + }) + + it("preserves the underlying viem client actions", () => { + const client = publicClient.extend(tokenboundActions()) + // The decorator must not shadow viem's own actions. + expect(typeof client.getBlockNumber).toBe("function") + expect(typeof client.readContract).toBe("function") + expect(client.chain?.id).toBe(mainnet.id) + }) + + it("exposes read actions on a public client", () => { + const client = publicClient.extend(tokenboundActions()) + for (const method of [ + "getAccount", + "prepareCreateAccount", + "prepareExecution", + "checkAccountDeployment", + "deconstructBytecode", + "getNFT", + "isValidSigner", + ]) { + expect(typeof (client.tokenbound as never)[method]).toBe("function") + } + }) + + it("exposes write actions on a wallet client", () => { + const client = walletClient.extend(tokenboundActions()) + for (const method of [ + "createAccount", + "execute", + "transferNFT", + "transferETH", + "transferERC20", + "signMessage", + ]) { + expect(typeof (client.tokenbound as never)[method]).toBe("function") + } + }) + + it("derives the same address as the protocol layer", () => { + const client = publicClient.extend(tokenboundActions()) + const viaExtension = client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const viaProtocol = getAccountAddress( + { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID, chainId: mainnet.id }, + resolveDeployment({}), + ) + expect(viaExtension).toBe(viaProtocol) + expect(isAddress(viaExtension)).toBe(true) + }) + + it("derives the same address as the standalone action", () => { + const client = publicClient.extend(tokenboundActions()) + expect( + client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }), + ).toBe( + getAccountAction(publicClient, { + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }), + ) + }) + + it("honours a pinned V2 deployment passed to the decorator", () => { + const v3Client = publicClient.extend(tokenboundActions()) + const v2Client = publicClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + const params = { tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID } + expect(v2Client.tokenbound.getAccount(params)).not.toBe( + v3Client.tokenbound.getAccount(params), + ) + }) + + it("routes prepareExecution through V2 executeCall encoding", async () => { + // On a V2 deployment the extension must fall back to the legacy + // executeCall encoding, exactly as the class API does. + const v2Client = publicClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + const account = v2Client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const args = { + account, + to: TOKEN_CONTRACT, + value: 0n, + data: "0x" as const, + } + + const viaExtension = await v2Client.tokenbound.prepareExecution(args) + const viaProtocol = await encodeExecuteCall(args) + + expect(viaExtension.data).toBe(viaProtocol.data) + expect(viaExtension.to).toBe(account) + }) + + it("encodes V2 and V3 executions differently", async () => { + const v2Client = publicClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + const v3Client = publicClient.extend(tokenboundActions()) + const account = v3Client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + const args = { account, to: TOKEN_CONTRACT, value: 1n, data: "0x" as const } + + const v2 = await v2Client.tokenbound.prepareExecution(args) + const v3 = await v3Client.tokenbound.prepareExecution(args) + + expect(v2.data).not.toBe(v3.data) + }) + + it("rejects isValidSigner on a V2 deployment", async () => { + const v2Client = walletClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + await expect( + v2Client.tokenbound.isValidSigner({ + account: TOKEN_CONTRACT, + }), + ).rejects.toThrow(/not supported using the V2 implementation/) + }) + + it("rejects appendedCalls on a V2 deployment", async () => { + const v2Client = publicClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + await expect( + v2Client.tokenbound.prepareCreateAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + appendedCalls: [ + { target: TOKEN_CONTRACT, allowFailure: false, callData: "0x" }, + ], + }), + ).rejects.toThrow(/Multicall via appendedCalls is not supported/) + }) + + it("derives V2 accounts identically to the protocol layer", () => { + const v2Client = publicClient.extend( + tokenboundActions({ version: TBVersion.V2 }), + ) + expect( + v2Client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }), + ).toBe( + getAccountAddress( + { + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + chainId: mainnet.id, + }, + resolveDeployment({ version: TBVersion.V2 }), + ), + ) + }) + + it("honours a custom salt", () => { + const client = publicClient.extend(tokenboundActions()) + expect( + client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + salt: 6551, + }), + ).not.toBe( + client.tokenbound.getAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }), + ) + }) + + it("prepares a create-account transaction without sending it", async () => { + const client = publicClient.extend(tokenboundActions()) + const tx = await client.tokenbound.prepareCreateAccount({ + tokenContract: TOKEN_CONTRACT, + tokenId: TOKEN_ID, + }) + expect(tx.data).toMatch(/^0x/) + }) + + it("composes with other decorators", () => { + const client = publicClient + .extend(tokenboundActions()) + .extend(() => ({ customAction: () => "ok" as const })) + expect(client.tokenbound).toBeDefined() + expect(client.customAction()).toBe("ok") + }) +}) diff --git a/packages/sdk/src/test/utils/clients.ts b/packages/sdk/src/test/utils/clients.ts index 64e4568..568bc96 100644 --- a/packages/sdk/src/test/utils/clients.ts +++ b/packages/sdk/src/test/utils/clients.ts @@ -1,23 +1,7 @@ -import { - createPublicClient, - type PublicClient, - http, - type Chain, -} from "viem" -// import { chainIdToChain } from '../../utils' -import { ANVIL_RPC_URL, } from "../constants" - -export const getPublicClient = ({ - // chainId = foundry.id, - chain, -}: { - // chainId?: number - chain: Chain -}): PublicClient => { - // const chain = chainIdToChain(chainId) - - // if (!chain) throw new Error(`Chain ${chain.name} not found`) +import { type Chain, createPublicClient, http, type PublicClient } from "viem" +import { ANVIL_RPC_URL } from "../constants" +export const getPublicClient = ({ chain }: { chain: Chain }): PublicClient => { return createPublicClient({ transport: http(ANVIL_RPC_URL), chain, diff --git a/packages/sdk/src/test/utils/debug.ts b/packages/sdk/src/test/utils/debug.ts index 26f39cf..281df57 100644 --- a/packages/sdk/src/test/utils/debug.ts +++ b/packages/sdk/src/test/utils/debug.ts @@ -10,7 +10,10 @@ import type { PublicClient } from "viem" export async function debugTransaction({ publicClient, hash, -}: { publicClient: PublicClient; hash: `0x${string}` }) { +}: { + publicClient: PublicClient + hash: `0x${string}` +}) { console.log("DEBUGGING TRANSACTION: ", hash) const transactionReceipt = await publicClient.getTransactionReceipt({ hash, diff --git a/packages/sdk/src/test/utils/getAnvilLogs.ts b/packages/sdk/src/test/utils/getAnvilLogs.ts deleted file mode 100644 index b638b65..0000000 --- a/packages/sdk/src/test/utils/getAnvilLogs.ts +++ /dev/null @@ -1,10 +0,0 @@ -export async function getAnvilLogs(url: string, id: number): Promise { - const response = await fetch(new URL(`${id}/logs`, url), { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }) - - return response.json() -} diff --git a/packages/sdk/src/test/utils/getWETHBalance.ts b/packages/sdk/src/test/utils/getWETHBalance.ts index cd2ae6c..1542de8 100644 --- a/packages/sdk/src/test/utils/getWETHBalance.ts +++ b/packages/sdk/src/test/utils/getWETHBalance.ts @@ -1,7 +1,7 @@ -import { type PublicClient, erc20Abi } from "viem" -import { WETH_CONTRACT_ADDRESS } from "../constants" -import { resolvePossibleENS } from "../../utils" +import { erc20Abi, type PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" +import { WETH_CONTRACT_ADDRESS } from "../constants" export async function getWETHBalance({ publicClient, diff --git a/packages/sdk/src/test/utils/getZora1155Balance.ts b/packages/sdk/src/test/utils/getZora1155Balance.ts index 5added2..43ee857 100644 --- a/packages/sdk/src/test/utils/getZora1155Balance.ts +++ b/packages/sdk/src/test/utils/getZora1155Balance.ts @@ -1,8 +1,8 @@ import type { PublicClient } from "viem" +import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" import { zora1155 } from "../config" import { zora1155ABI } from "../wagmi-cli-hooks/generated" -import { resolvePossibleENS } from "../../utils" -import type { PossibleENSAddress } from "../../types" export async function getZora1155Balance({ publicClient, diff --git a/packages/sdk/src/test/utils/getZora721Balance.ts b/packages/sdk/src/test/utils/getZora721Balance.ts index 5e2df2b..f56f145 100644 --- a/packages/sdk/src/test/utils/getZora721Balance.ts +++ b/packages/sdk/src/test/utils/getZora721Balance.ts @@ -1,8 +1,8 @@ -import type { PublicClient, } from "viem" +import type { PublicClient } from "viem" +import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" import { zora721 } from "../config" import { zora721DropABI } from "../wagmi-cli-hooks/generated" -import { resolvePossibleENS } from "../../utils" -import type { PossibleENSAddress } from "../../types" export async function getZora721Balance({ publicClient, diff --git a/packages/sdk/src/test/utils/index.ts b/packages/sdk/src/test/utils/index.ts index 3bff077..097a8b8 100644 --- a/packages/sdk/src/test/utils/index.ts +++ b/packages/sdk/src/test/utils/index.ts @@ -1,8 +1,6 @@ export * from "./clients" export * from "./debug" -export * from "./shellCommand" export * from "./ethToWei" -export * from "./getAnvilLogs" export * from "./getWETHBalance" -export * from "./getZora1155Balance" export * from "./getZora721Balance" +export * from "./getZora1155Balance" diff --git a/packages/sdk/src/test/utils/shellCommand.ts b/packages/sdk/src/test/utils/shellCommand.ts deleted file mode 100644 index 5b1a5b3..0000000 --- a/packages/sdk/src/test/utils/shellCommand.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { exec } from "node:child_process" // Node.js child_process module - -/** - * Executes a shell command and returns the output as a promise. - * - * @param cmd - The shell command to be executed. - * @returns A promise that resolves with the command output (stdout or stderr). - * @throws Will reject the promise with an error if the command execution fails. - * - * @example - * ```typescript - * shellCommand('ls -l').then(console.log); - * ``` - */ -export function shellCommand(cmd: string): Promise { - return new Promise((resolve, reject) => { - exec(cmd, (error, stdout, stderr) => { - if (error) { - console.warn(`Error executing command: ${cmd}`) - reject(error) - return - } - resolve(stdout || stderr) - }) - }) -} diff --git a/packages/sdk/src/types/abstractEthersSigner.ts b/packages/sdk/src/types/abstractEthersSigner.ts deleted file mode 100644 index 2771d2b..0000000 --- a/packages/sdk/src/types/abstractEthersSigner.ts +++ /dev/null @@ -1,7 +0,0 @@ -// To determine whether the signer is an Ethers signer without first importing the Ethers package, -// we check for the existence of the _isSigner property on the signer object. -// This type assures that there is at least some degree of type safety on the Ethers implementation of the TokenboundClient. - -export type AbstractEthersSigner = { - readonly _isSigner: boolean -} & Record diff --git a/packages/sdk/src/types/abstractEthersTransactionResponse.ts b/packages/sdk/src/types/abstractEthersTransactionResponse.ts deleted file mode 100644 index b07c76f..0000000 --- a/packages/sdk/src/types/abstractEthersTransactionResponse.ts +++ /dev/null @@ -1,7 +0,0 @@ -// We check for the existence of the hash as loose verification that a response is -// an Ethers TransactionResponse without first importing the Ethers package. -// This type assures that there is at least some degree of type safety on the Ethers implementation of the TokenboundClient. - -export type AbstractEthersTransactionResponse = { - hash: string -} & Record diff --git a/packages/sdk/src/types/index.ts b/packages/sdk/src/types/index.ts index a315f55..606f2e8 100644 --- a/packages/sdk/src/types/index.ts +++ b/packages/sdk/src/types/index.ts @@ -1,12 +1,9 @@ -export * from "./abstractEthersSigner" -export * from "./abstractEthersTransactionResponse" export * from "./addresses" export * from "./anvilAccount" export * from "./callData" export * from "./contractABIPair" -export * from "./operations" export * from "./erc6551Bytecode" -export * from "./messages" export * from "./multicall" +export * from "./operations" export * from "./params" export * from "./prettify" diff --git a/packages/sdk/src/types/messages.ts b/packages/sdk/src/types/messages.ts deleted file mode 100644 index 1c8e91a..0000000 --- a/packages/sdk/src/types/messages.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { SignableMessage } from "viem" -import type { Prettify } from "./prettify" - -export type Bytes = ArrayLike -export type Ethers5SignableMessage = Bytes | string -export type Ethers6SignableMessage = string | Uint8Array - -export type EthersSignableMessage = - | Ethers5SignableMessage - | Ethers6SignableMessage - -export type UniversalSignableMessage = Prettify< - EthersSignableMessage | SignableMessage -> // SignableMessage is string | { raw: Hex | ByteArray } // where ByteArray = Uint8Array diff --git a/packages/sdk/src/types/params.ts b/packages/sdk/src/types/params.ts index 3167afd..7074180 100644 --- a/packages/sdk/src/types/params.ts +++ b/packages/sdk/src/types/params.ts @@ -1,8 +1,8 @@ -import type { WalletClient, PublicClient, Chain } from "viem" -import type { Prettify } from "./prettify" -import type { UniversalSignableMessage, CallOperation, Call3 } from "." +import type { Chain, PublicClient, SignableMessage, WalletClient } from "viem" +import type { ERC_6551_LEGACY_V2 } from "../protocol/constants" +import type { Call3, CallOperation } from "." import type { PossibleENSAddress } from "./addresses" -import type { ERC_6551_LEGACY_V2 } from "../constants" +import type { Prettify } from "./prettify" export const NFTTokenType = { ERC721: "ERC721", @@ -64,9 +64,12 @@ type ImplementationAddress = | typeof ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS export type TokenboundClientOptions = Prettify<{ - chainId?: number - chain?: Chain - signer?: any + /** + * The viem Chain to operate on. Required: the SDK no longer maps a bare + * chainId to a Chain, because doing so pulled every viem chain into + * consumer bundles. Import the chain you need from `viem/chains`. + */ + chain: Chain walletClient?: WalletClient publicClient?: PublicClient publicClientRPCUrl?: string @@ -137,5 +140,5 @@ export type BytecodeParams = Prettify<{ }> export type SignMessageParams = Prettify<{ - message: UniversalSignableMessage + message: SignableMessage }> diff --git a/packages/sdk/src/utils/chainIdToChain.testDISABLED.ts b/packages/sdk/src/utils/chainIdToChain.testDISABLED.ts deleted file mode 100644 index cda4b77..0000000 --- a/packages/sdk/src/utils/chainIdToChain.testDISABLED.ts +++ /dev/null @@ -1,18 +0,0 @@ -// import { chainIdToChain } from './chainIdToChain' -// import { test, expect } from "vitest" - -// test("chainIdToChain", () => { - -// const mainnetChain = chainIdToChain(1) -// const goerliChain = chainIdToChain(5) -// const polygonChain = chainIdToChain(137) -// const mumbaiChain = chainIdToChain(80001) -// const sepoliaChain = chainIdToChain(11155111) - -// expect(mainnetChain.id).toEqual(1) -// expect(goerliChain.id).toEqual(5) -// expect(polygonChain.id).toEqual(137) -// expect(mumbaiChain.id).toEqual(80001) -// expect(sepoliaChain.id).toEqual(11155111) - -// }) diff --git a/packages/sdk/src/utils/chainIdToChain.ts b/packages/sdk/src/utils/chainIdToChain.ts deleted file mode 100644 index b9e1f1d..0000000 --- a/packages/sdk/src/utils/chainIdToChain.ts +++ /dev/null @@ -1,54 +0,0 @@ -import type { Chain } from "viem" -import { - mainnet, - goerli, - polygon, - polygonMumbai, - sepolia, - optimism, - arbitrum, - optimismGoerli, - base, - baseGoerli, - baseSepolia, - lineaTestnet, - linea, - gnosis, - zora, - zoraTestnet, -} from "viem/chains" - -const enabledChains = { - mainnet, - goerli, - optimismGoerli, - polygon, - polygonMumbai, - sepolia, - optimism, - arbitrum, - base, - gnosis, - baseGoerli, - baseSepolia, - lineaTestnet, - linea, - zora, - zoraTestnet, -} - -/** - * Gets the chain object for the given chain id. - * @param chainId - Chain id of the target EVM chain. - * @returns Viem's chain object. - */ - -export function chainIdToChain(chainId: number): Chain { - for (const chain of Object.values(enabledChains)) { - if (chain.id === chainId) { - return chain - } - } - - throw new Error(`Chain with id ${chainId} not found`) -} diff --git a/packages/sdk/src/utils/getImplementationName.ts b/packages/sdk/src/utils/getImplementationName.ts index 272c29d..4e4c2bf 100644 --- a/packages/sdk/src/utils/getImplementationName.ts +++ b/packages/sdk/src/utils/getImplementationName.ts @@ -1,4 +1,4 @@ -import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../constants" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../protocol/constants" export function getImplementationName( implementationAddress?: `0x${string}`, diff --git a/packages/sdk/src/utils/index.ts b/packages/sdk/src/utils/index.ts index b1dceab..6461d3c 100644 --- a/packages/sdk/src/utils/index.ts +++ b/packages/sdk/src/utils/index.ts @@ -1,7 +1,4 @@ export * from "./addressToUint8Array" -export * from "./chainIdToChain" export * from "./getImplementationName" -export * from "./messageTypeguards" -export * from "./normalizeEthersMessage" export * from "./resolvePossibleENS" export * from "./segmentBytecode" diff --git a/packages/sdk/src/utils/messageTypeguards.ts b/packages/sdk/src/utils/messageTypeguards.ts deleted file mode 100644 index 1572caf..0000000 --- a/packages/sdk/src/utils/messageTypeguards.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { SignableMessage } from "viem" -import type { - Ethers5SignableMessage, - Ethers6SignableMessage, - UniversalSignableMessage, -} from "../types" - -export function isEthers5SignableMessage( - message: UniversalSignableMessage, -): message is Ethers5SignableMessage { - return ( - Array.isArray(message) || - typeof message === "string" || - ("length" in message && "byteLength" in message === false) - ) -} - -export function isEthers6SignableMessage( - message: UniversalSignableMessage, -): message is Ethers6SignableMessage { - return typeof message === "string" || message instanceof Uint8Array -} - -export function isViemSignableMessage( - message: UniversalSignableMessage, -): message is SignableMessage { - return typeof message === "string" || "raw" in message -} diff --git a/packages/sdk/src/utils/normalizeEthersMessage.ts b/packages/sdk/src/utils/normalizeEthersMessage.ts deleted file mode 100644 index 3af71b0..0000000 --- a/packages/sdk/src/utils/normalizeEthersMessage.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { Bytes } from "../types" - -// The types Bytes | string in Ethers 5 and string | Uint8Array in Ethers 6 are somewhat compatible but not entirely. -// This function normalizes the message type to Uint8Array so we can sign using the AbstractEthersSigner without knowing the Ethers version. - -export function normalizeMessage( - message: Bytes | string | Uint8Array, -): string | Uint8Array { - if (typeof message === "string") { - return message - } - - if (message instanceof Uint8Array) { - return message - } - - // Convert ArrayLike to Uint8Array - return new Uint8Array(Array.from(message)) -} diff --git a/packages/sdk/src/utils/resolvePossibleENS.ts b/packages/sdk/src/utils/resolvePossibleENS.ts index e031e09..fde66dc 100644 --- a/packages/sdk/src/utils/resolvePossibleENS.ts +++ b/packages/sdk/src/utils/resolvePossibleENS.ts @@ -1,16 +1,20 @@ +import { type Client, getAddress } from "viem" +import { getEnsAddress } from "viem/actions" import { normalize } from "viem/ens" import type { PossibleENSAddress } from "../types" -import { type PublicClient, getAddress } from "viem" +/** + * Resolves a `.eth` name to an address, or normalizes an address that is + * already hex. Accepts any viem Client so wallet clients can resolve ENS + * without being cast to a PublicClient. + */ export async function resolvePossibleENS( - publicClient: PublicClient, + client: Client, possibleENSAddress: PossibleENSAddress, ): Promise<`0x${string}`> { const isENS = possibleENSAddress.endsWith(".eth") const address = isENS - ? await publicClient.getEnsAddress({ - name: normalize(possibleENSAddress), - }) + ? await getEnsAddress(client, { name: normalize(possibleENSAddress) }) : getAddress(possibleENSAddress) if (!address) { diff --git a/packages/sdk/src/viem/actions.ts b/packages/sdk/src/viem/actions.ts new file mode 100644 index 0000000..2bed325 --- /dev/null +++ b/packages/sdk/src/viem/actions.ts @@ -0,0 +1,452 @@ +// Standalone viem actions. +// +// Each action takes an explicit viem client plus parameters, and delegates all +// encoding/derivation to the library-independent protocol layer. The +// `tokenboundActions()` decorator in ./tokenboundActions.ts binds these to a +// client, so there is exactly one implementation of each operation. + +import type { + Account, + Address, + Chain, + Client, + Hex, + PublicClient, + SignableMessage, + Transport, + WalletClient, +} from "viem" + +/** + * The minimum client shape a write action needs: a viem Client that carries an + * Account. Accepting this rather than the full `WalletClient` lets the same + * functions serve both `createWalletClient(...)` results and decorated clients. + */ +export type TokenboundWalletClient< + chain extends Chain | undefined = Chain | undefined, + account extends Account | undefined = Account | undefined, +> = Client + +import { + getCode, + readContract, + sendTransaction, + signMessage as viemSignMessage, +} from "viem/actions" + +import { + deconstructBytecode as deconstructBytecodeFromHex, + encodeERC20Transfer, + encodeETHTransfer, + encodeNFTTransfer, + getAccountAddress, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + VALID_SIGNER_MAGIC_VALUE, +} from "../protocol" +import { ERC_6551_DEFAULT } from "../protocol/constants" +import { encodeCrossChainCall } from "../protocol/functions" +import type { + Call3, + CallData, + MultiCallTx, + NFTTokenType, + SegmentedERC6551Bytecode, + TBImplementationVersion, + TokenboundAccountNFT, +} from "../types" +import type { PossibleENSAddress } from "../types/addresses" +import { CALL_OPERATIONS } from "../types/operations" +import type { Prettify } from "../types/prettify" +import { resolvePossibleENS } from "../utils" + +/** Options that pin the actions to a specific ERC-6551 deployment. */ +export type TokenboundConfig = { + implementationAddress?: Address + registryAddress?: Address + version?: TBImplementationVersion +} + +type TokenType = (typeof NFTTokenType)[keyof typeof NFTTokenType] + +export type GetAccountActionParams = { + tokenContract: Address + tokenId: string + chainId?: number + salt?: number +} + +export type PrepareCreateAccountActionParams = Prettify< + GetAccountActionParams & { + appendedCalls?: Call3[] + } +> + +export type ExecuteActionParams = { + account: Address + to: Address + value: bigint + data: Hex + chainId?: number +} + +export type TransferNFTActionParams = { + account: Address + tokenType: TokenType + tokenContract: Address + tokenId: string + recipientAddress: PossibleENSAddress + amount?: number + chainId?: number +} + +export type TransferETHActionParams = { + account: Address + recipientAddress: PossibleENSAddress + amount: number + chainId?: number +} + +export type TransferERC20ActionParams = { + account: Address + recipientAddress: PossibleENSAddress + amount: number + erc20tokenAddress: Address + erc20tokenDecimals: number + chainId?: number +} + +/** Resolves the chain id a client is pointed at. */ +function clientChainId(client: Client): number { + const chainId = client.chain?.id + if (chainId === undefined) { + throw new Error( + "Unable to determine chainId. Provide a chain on the viem client.", + ) + } + return chainId +} + +/** + * Derives a tokenbound account address. Purely deterministic — no network access. + */ +export function getAccount( + client: Client, + params: GetAccountActionParams, + config: TokenboundConfig = {}, +): Address { + const deployment = resolveDeployment(config) + return getAccountAddress( + { + tokenContract: params.tokenContract, + tokenId: params.tokenId, + chainId: params.chainId ?? clientChainId(client), + salt: params.salt, + }, + deployment, + ) +} + +/** + * Builds the transaction that creates a tokenbound account, without sending it. + */ +export async function prepareCreateAccount( + client: Client, + params: PrepareCreateAccountActionParams, + config: TokenboundConfig = {}, +): Promise { + const deployment = resolveDeployment(config) + return await prepareCreateAccountTx( + { + tokenContract: params.tokenContract, + tokenId: params.tokenId, + chainId: params.chainId ?? clientChainId(client), + salt: params.salt, + appendedCalls: params.appendedCalls, + }, + deployment, + ) +} + +/** + * Creates a tokenbound account and returns both the derived address and the + * transaction hash. + */ +export async function createAccount< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: PrepareCreateAccountActionParams, + config: TokenboundConfig = {}, +): Promise<{ account: Address; txHash: Hex }> { + const deployment = resolveDeployment(config) + const chainId = params.chainId ?? clientChainId(client) + + const derived = getAccountAddress( + { + tokenContract: params.tokenContract, + tokenId: params.tokenId, + chainId, + salt: params.salt, + }, + deployment, + ) + + const tx = await prepareCreateAccountTx( + { ...params, chainId, salt: params.salt }, + deployment, + ) + + const txHash = await sendTx(client, tx) + + return { account: derived, txHash } +} + +/** + * Encodes an execution against a tokenbound account, handling cross-chain + * encoding when the destination chain differs from the client's chain. + */ +export async function prepareExecution( + client: Client, + params: ExecuteActionParams, + config: TokenboundConfig = {}, +): Promise { + const deployment = resolveDeployment(config) + const { account, to, value, data } = params + const originChainId = clientChainId(client) + const destinationChainId = params.chainId ?? originChainId + const operation = CALL_OPERATIONS.CALL + + if (!deployment.supportsV3) { + const { encodeExecuteCall } = await import("../protocol/core") + return await encodeExecuteCall({ account, to, value, data }) + } + + let executionArgs: unknown[] = [to, value, data, operation] + let executionValue = 0n + + if (originChainId !== destinationChainId) { + const { + to: crossChainTo, + value: crossChainValue, + data: crossChainData, + } = await encodeCrossChainCall({ + publicClient: client as PublicClient, + account, + to, + value, + data, + originChainId, + destinationChainId, + }) + + executionArgs = [crossChainTo, crossChainValue, crossChainData, operation] + executionValue = crossChainValue + } + + const { encodeFunctionData } = await import("viem") + + return { + to: account, + value: executionValue, + data: encodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "execute", + args: executionArgs, + }), + } +} + +/** Executes a call from a tokenbound account. */ +export async function execute< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: ExecuteActionParams, + config: TokenboundConfig = {}, +): Promise { + const prepared = await prepareExecution(client, params, config) + return await sendTx(client, prepared) +} + +/** Transfers an ERC721/ERC1155 out of a tokenbound account. */ +export async function transferNFT< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: TransferNFTActionParams, + config: TokenboundConfig = {}, +): Promise { + const recipient = await resolvePossibleENS(client, params.recipientAddress) + + const transfer = encodeNFTTransfer({ + account: params.account, + tokenType: params.tokenType, + tokenContract: params.tokenContract, + tokenId: params.tokenId, + recipient, + amount: params.amount, + }) + + return await execute( + client, + { account: params.account, ...transfer, chainId: params.chainId }, + config, + ) +} + +/** Transfers ETH out of a tokenbound account. `amount` is in decimal ETH. */ +export async function transferETH< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: TransferETHActionParams, + config: TokenboundConfig = {}, +): Promise { + const recipient = await resolvePossibleENS(client, params.recipientAddress) + + const transfer = encodeETHTransfer({ recipient, amount: params.amount }) + + return await execute( + client, + { account: params.account, ...transfer, chainId: params.chainId }, + config, + ) +} + +/** Transfers an ERC-20 out of a tokenbound account. `amount` is in decimal units. */ +export async function transferERC20< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: TransferERC20ActionParams, + config: TokenboundConfig = {}, +): Promise { + const recipient = await resolvePossibleENS(client, params.recipientAddress) + + const transfer = encodeERC20Transfer({ + recipient, + amount: params.amount, + erc20tokenAddress: params.erc20tokenAddress, + erc20tokenDecimals: params.erc20tokenDecimals, + }) + + return await execute( + client, + { account: params.account, ...transfer, chainId: params.chainId }, + config, + ) +} + +/** Returns true when a tokenbound account has been deployed on-chain. */ +export async function checkAccountDeployment( + client: Client, + params: { accountAddress: Address }, +): Promise { + const bytecode = await getCode(client, { address: params.accountAddress }) + return bytecode ? bytecode.length > 2 : false +} + +/** Splits a deployed account's bytecode into its ERC-6551 components. */ +export async function deconstructBytecode( + client: Client, + params: { accountAddress: Address }, +): Promise { + const bytecode = await getCode(client, { address: params.accountAddress }) + return deconstructBytecodeFromHex(bytecode) +} + +/** Returns the NFT that owns a tokenbound account. */ +export async function getNFT( + client: Client, + params: { accountAddress: Address }, +): Promise { + const deconstructed = await deconstructBytecode(client, params) + if (!deconstructed) { + throw new Error( + "The tokenbound account has not been deployed at this address", + ) + } + const { chainId, tokenContract, tokenId } = deconstructed + return { tokenContract, tokenId, chainId } +} + +/** Checks whether the client's account is a valid signer for a tokenbound account. */ +export async function isValidSigner( + client: Client, + params: { account: Address; signerAddress?: Address }, + config: TokenboundConfig = {}, +): Promise { + const deployment = resolveDeployment(config) + + if (!deployment.supportsV3) { + throw new Error( + "isValidSigner is not supported using the V2 implementation", + ) + } + + const signerAddress = + params.signerAddress ?? + (client as WalletClient).account?.address ?? + (client.account as Account | undefined)?.address + + if (!signerAddress) { + throw new Error("No signer address available.") + } + + const { numberToHex } = await import("viem") + + const result = await readContract(client, { + address: params.account, + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "isValidSigner", + args: [signerAddress, numberToHex(0, { size: 32 })], + }) + + return result === VALID_SIGNER_MAGIC_VALUE +} + +/** Signs a message with the client's account. */ +export async function signMessage< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + params: { message: SignableMessage }, +): Promise { + const signerAccount = client.account + if (!signerAccount) { + throw new Error("No account available on the wallet client.") + } + return await viemSignMessage(client, { + account: signerAccount, + message: params.message, + }) +} + +/** Sends a prepared transaction, filling in chain/account from the client. */ +async function sendTx< + chain extends Chain | undefined, + account extends Account | undefined, +>( + client: TokenboundWalletClient, + tx: CallData | MultiCallTx, +): Promise { + const signerAccount = client.account + if (!signerAccount) { + throw new Error("No account available on the wallet client.") + } + return await sendTransaction(client, { + ...tx, + account: signerAccount, + chain: client.chain, + } as Parameters[1]) +} + +export type { ResolvedDeployment } diff --git a/packages/sdk/src/viem/index.ts b/packages/sdk/src/viem/index.ts new file mode 100644 index 0000000..1925091 --- /dev/null +++ b/packages/sdk/src/viem/index.ts @@ -0,0 +1,31 @@ +// viem-native Tokenbound API: standalone actions plus the `.extend()` decorator. + +export { + checkAccountDeployment, + createAccount, + deconstructBytecode, + type ExecuteActionParams, + execute, + type GetAccountActionParams, + getAccount, + getNFT, + isValidSigner, + type PrepareCreateAccountActionParams, + prepareCreateAccount, + prepareExecution, + signMessage, + type TokenboundConfig, + type TokenboundWalletClient, + type TransferERC20ActionParams, + type TransferETHActionParams, + type TransferNFTActionParams, + transferERC20, + transferETH, + transferNFT, +} from "./actions" +export { + type TokenboundActions, + type TokenboundPublicActions, + type TokenboundWalletActions, + tokenboundActions, +} from "./tokenboundActions" diff --git a/packages/sdk/src/viem/tokenboundActions.ts b/packages/sdk/src/viem/tokenboundActions.ts new file mode 100644 index 0000000..bef6c2d --- /dev/null +++ b/packages/sdk/src/viem/tokenboundActions.ts @@ -0,0 +1,155 @@ +// Idiomatic viem client decorator. +// +// Usage: +// const client = createWalletClient({ ... }).extend(tokenboundActions()) +// await client.tokenbound.getAccount({ tokenContract, tokenId }) +// +// Everything is namespaced under `.tokenbound` so the decorator can never +// collide with viem's own actions or with other decorators. Write actions are +// only present in the type when the client is a WalletClient, so public-only +// clients get a correctly narrowed surface. + +import type { + Account, + Address, + Chain, + Client, + Hex, + SignableMessage, +} from "viem" +import type { + CallData, + MultiCallTx, + SegmentedERC6551Bytecode, + TokenboundAccountNFT, +} from "../types" +import { + checkAccountDeployment, + createAccount, + deconstructBytecode, + type ExecuteActionParams, + execute, + type GetAccountActionParams, + getAccount, + getNFT, + isValidSigner, + type PrepareCreateAccountActionParams, + prepareCreateAccount, + prepareExecution, + signMessage, + type TokenboundConfig, + type TokenboundWalletClient, + type TransferERC20ActionParams, + type TransferETHActionParams, + type TransferNFTActionParams, + transferERC20, + transferETH, + transferNFT, +} from "./actions" + +/** Actions available on any client (public or wallet). */ +export type TokenboundPublicActions = { + /** Derives a tokenbound account address. Deterministic, no network access. */ + getAccount: (params: GetAccountActionParams) => Address + /** Builds the account-creation transaction without sending it. */ + prepareCreateAccount: ( + params: PrepareCreateAccountActionParams, + ) => Promise + /** Encodes an execution against a tokenbound account without sending it. */ + prepareExecution: (params: ExecuteActionParams) => Promise + /** Returns true when the account has been deployed on-chain. */ + checkAccountDeployment: (params: { + accountAddress: Address + }) => Promise + /** Splits a deployed account's bytecode into its ERC-6551 components. */ + deconstructBytecode: (params: { + accountAddress: Address + }) => Promise + /** Returns the NFT that owns a tokenbound account. */ + getNFT: (params: { accountAddress: Address }) => Promise + /** Checks whether an address is a valid signer for a tokenbound account. */ + isValidSigner: (params: { + account: Address + signerAddress?: Address + }) => Promise +} + +/** Additional actions available only when the client can sign/send. */ +export type TokenboundWalletActions = { + /** Creates a tokenbound account, returning its address and the tx hash. */ + createAccount: ( + params: PrepareCreateAccountActionParams, + ) => Promise<{ account: Address; txHash: Hex }> + /** Executes a call from a tokenbound account. */ + execute: (params: ExecuteActionParams) => Promise + /** Transfers an ERC721/ERC1155 out of a tokenbound account. */ + transferNFT: (params: TransferNFTActionParams) => Promise + /** Transfers ETH out of a tokenbound account. */ + transferETH: (params: TransferETHActionParams) => Promise + /** Transfers an ERC-20 out of a tokenbound account. */ + transferERC20: (params: TransferERC20ActionParams) => Promise + /** Signs a message with the client's account. */ + signMessage: (params: { message: SignableMessage }) => Promise +} + +export type TokenboundActions = TokenboundPublicActions & + TokenboundWalletActions + +/** + * Creates a viem client decorator exposing the Tokenbound API under + * `client.tokenbound`. + * + * Wallet clients (those carrying an `account`) receive the full surface; + * clients without an account are typed with the read-only subset. + * + * @param config Optionally pins the actions to a specific ERC-6551 deployment + * (custom implementation/registry address, or the legacy V2 version). + */ +export function tokenboundActions(config: TokenboundConfig = {}) { + // The client parameter is intentionally structural rather than + // `Client`: a client built with a union transport + // (e.g. `custom(...) | http()`) fails to infer against the stricter form and + // collapses the whole intersection to `never`. + // + // Write actions are exposed when the client's `account` can be an Account — + // including the common wagmi shape where the connected address is + // `Address | undefined`. A PublicClient, whose `account` is exactly + // `undefined`, is narrowed to the read-only set. + return < + client extends { account?: Account | undefined; chain?: Chain | undefined }, + >( + client: client, + ): { + tokenbound: [NonNullable] extends [never] + ? TokenboundPublicActions + : TokenboundActions + } => { + const viemClient = client as unknown as Client + const walletClient = client as unknown as TokenboundWalletClient + + const actions: TokenboundActions = { + getAccount: (params) => getAccount(viemClient, params, config), + prepareCreateAccount: (params) => + prepareCreateAccount(viemClient, params, config), + prepareExecution: (params) => + prepareExecution(viemClient, params, config), + checkAccountDeployment: (params) => + checkAccountDeployment(viemClient, params), + deconstructBytecode: (params) => deconstructBytecode(viemClient, params), + getNFT: (params) => getNFT(viemClient, params), + isValidSigner: (params) => isValidSigner(viemClient, params, config), + createAccount: (params) => createAccount(walletClient, params, config), + execute: (params) => execute(walletClient, params, config), + transferNFT: (params) => transferNFT(walletClient, params, config), + transferETH: (params) => transferETH(walletClient, params, config), + transferERC20: (params) => transferERC20(walletClient, params, config), + signMessage: (params) => signMessage(walletClient, params), + } + + return { tokenbound: actions } as { + tokenbound: [NonNullable] extends [never] + ? TokenboundPublicActions + : TokenboundActions + } + } +} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 3d7a21a..8fd83bf 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -4,7 +4,7 @@ "useDefineForClassFields": true, "module": "ESNext", "lib": ["ESNext", "DOM"], - "moduleResolution": "Node", + "moduleResolution": "Bundler", "strict": true, "jsx": "preserve", "resolveJsonModule": true, diff --git a/packages/sdk/tsconfig.test.json b/packages/sdk/tsconfig.test.json new file mode 100644 index 0000000..6ba6fed --- /dev/null +++ b/packages/sdk/tsconfig.test.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noUnusedLocals": false, + "noUnusedParameters": false, + "types": ["vitest/globals", "vite/client"] + }, + "include": ["src"], + "exclude": [] +} diff --git a/packages/sdk/vite.config.ts b/packages/sdk/vite.config.ts index e0b985a..e2ecee5 100644 --- a/packages/sdk/vite.config.ts +++ b/packages/sdk/vite.config.ts @@ -1,25 +1,47 @@ import { resolve } from "node:path" import { type PluginOption, defineConfig } from "vite" -import { visualizer } from "rollup-plugin-visualizer" import dts from "vite-plugin-dts" +// Bundle analysis is opt-in: `ANALYZE=true pnpm build`. +// Output is written outside dist/ so it can never be published. +const analyzePlugins = async (): Promise => { + if (!process.env.ANALYZE) return [] + const { visualizer } = await import("rollup-plugin-visualizer") + return [ + visualizer({ + open: true, + template: "treemap", + filename: "./analysis/stats.html", + gzipSize: true, + brotliSize: true, + }) as PluginOption, + ] +} + // https://vitejs.dev/config/ -export default defineConfig({ +export default defineConfig(async () => ({ build: { lib: { - // Could also be a dictionary or array of multiple entry points - entry: resolve(__dirname, "src/index.ts"), + entry: { + index: resolve(__dirname, "src/index.ts"), + viem: resolve(__dirname, "src/viem/index.ts"), + protocol: resolve(__dirname, "src/protocol/index.ts"), + }, name: "tokenbound-sdk", - // the proper extensions will be added - fileName: "tokenbound-sdk", + formats: ["es", "cjs"], }, + sourcemap: true, rollupOptions: { - // make sure to externalize deps that shouldn't be bundled - // into your library - external: ["viem"], + // Externalize deps that shouldn't be bundled into the library. + external: [ + "viem", + "viem/ens", + "viem/chains", + "viem/actions", + "viem/accounts", + "@layerzerolabs/lz-v2-utilities", + ], output: { - // Provide global variables to use in the UMD build - // for externalized deps globals: { viem: "viem", }, @@ -27,18 +49,19 @@ export default defineConfig({ }, }, plugins: [ - dts(), - visualizer({ - // Run 'pnpm build' to generate a stats.html file, which will automatically open - // in your default browser. This lets us visualize bundle sizes and dependencies. - open: true, - template: "treemap", - filename: "./dist/stats.html", - gzipSize: true, - brotliSize: true, - }) as PluginOption, + dts({ + // Tests must never produce declarations in dist. + exclude: [ + "src/test/**", + "src/tests/**", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.testDISABLED.ts", + ], + }), + ...(await analyzePlugins()), ], optimizeDeps: { exclude: ["**/__test__/**", "**/*.test.ts", "**/*.spec.ts", "./test/**/"], }, -}) +})) diff --git a/packages/sdk/vitest.config.ts b/packages/sdk/vitest.config.ts index 49397a8..f1c4a1c 100644 --- a/packages/sdk/vitest.config.ts +++ b/packages/sdk/vitest.config.ts @@ -5,9 +5,14 @@ export default defineConfig({ test: { coverage: { reporter: ["text", "json", "html"], + // Coverage output must never land inside published artifacts. + reportsDirectory: "./coverage", }, - // environment: 'jsdom', environment: "node", + // TestAll.test.ts drives a real Anvil fork on a fixed port. Running it in + // parallel with the other files contends for that node, so serialize. + fileParallelism: false, + sequence: { concurrent: false }, exclude: [ "**/.{idea,git,cache,output,temp}/**", "**/cypress/**", @@ -16,7 +21,12 @@ export default defineConfig({ "**/6551contracts/**", "./test/pages/**", ], + // Type-level assertions (expectTypeOf) are only enforced when this is on. + typecheck: { + enabled: true, + include: ["src/test/**/*.test-d.ts"], + tsconfig: "./tsconfig.test.json", + }, globals: true, - setupFiles: "./src/test/config/setup.ts", }, }) diff --git a/packages/sdk/wagmi.config.ts b/packages/sdk/wagmi.config.ts index 70622d2..20394e8 100644 --- a/packages/sdk/wagmi.config.ts +++ b/packages/sdk/wagmi.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "@wagmi/cli" import { etherscan } from "@wagmi/cli/plugins" import { mainnet, goerli } from "viem/chains" -import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./src/constants" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./src/protocol/constants" export default defineConfig({ out: "src/test/wagmi-cli-hooks/generated.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e4a537..754dd25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -9,38 +9,38 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.5.13 + version: 2.5.13 '@changesets/cli': specifier: ^2.26.2 - version: 2.27.1 + version: 2.31.1(@types/node@26.3.0) husky: specifier: ^8.0.3 version: 8.0.3 typescript: specifier: ^5.6.3 - version: 5.6.3 + version: 5.9.3 examples/vite-wagmi-ethers: dependencies: '@rainbow-me/rainbowkit': - specifier: 2.2.0 - version: 2.2.0(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20) + specifier: ^2.2.11 + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 - version: 5.59.15(react@18.3.1) - '@tokenbound/sdk': + version: 5.102.4(react@18.3.1) + '@tokenbound/ethers': specifier: workspace:^ - version: link:../../packages/sdk + version: link:../../packages/ethers buffer: specifier: ^6.0.3 version: 6.0.3 connectkit: - specifier: 1.8.2 - version: 1.8.2(@babel/core@7.24.5)(@tanstack/react-query@5.59.15)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20) + specifier: ^1.9.2 + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.8.0 + version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) process: specifier: ^0.11.10 version: 0.11.10 @@ -54,51 +54,51 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: - specifier: ^2.12.20 - version: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + specifier: ^2.19.5 + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.5.13 + version: 2.5.13 '@types/react': specifier: ^18.2.21 - version: 18.3.2 + version: 18.3.31 '@types/react-dom': specifier: ^18.2.7 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.0.4 - version: 4.2.1(vite@4.5.3) + version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: ^5.4.21 + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi-ethers-rainbowkit: dependencies: '@rainbow-me/rainbowkit': - specifier: ^2.2.0 - version: 2.2.0(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20) + specifier: ^2.2.11 + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) '@tanstack/react-query': specifier: ^5.59.15 - version: 5.59.15(react@18.3.1) - '@tokenbound/sdk': + version: 5.102.4(react@18.3.1) + '@tokenbound/ethers': specifier: workspace:^ - version: link:../../packages/sdk + version: link:../../packages/ethers '@wagmi/core': specifier: ^2.13.9 - version: 2.13.9(@types/react@18.3.2)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + version: 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) buffer: specifier: ^6.0.3 version: 6.0.3 ethers: - specifier: ^5.7.2 - version: 5.7.2 + specifier: ^5.8.0 + version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) process: specifier: ^0.11.10 version: 0.11.10 @@ -112,48 +112,48 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) wagmi: - specifier: ^2.12.20 - version: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + specifier: ^2.19.5 + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.5.13 + version: 2.5.13 '@types/react': specifier: ^18.2.21 - version: 18.3.2 + version: 18.3.31 '@types/react-dom': specifier: ^18.2.7 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.0.4 - version: 4.2.1(vite@4.5.3) + version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: ^5.4.21 + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi-ethers6: dependencies: '@tanstack/react-query': specifier: ^5.59.15 - version: 5.59.15(react@18.3.1) - '@tokenbound/sdk': + version: 5.102.4(react@18.3.1) + '@tokenbound/ethers': specifier: workspace:^ - version: link:../../packages/sdk + version: link:../../packages/ethers buffer: specifier: ^6.0.3 version: 6.0.3 connectkit: - specifier: ^1.8.2 - version: 1.8.2(@babel/core@7.24.5)(@tanstack/react-query@5.59.15)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20) + specifier: ^1.9.2 + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: - specifier: ^6.13.4 - version: 6.13.4 + specifier: ^6.17.0 + version: 6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) process: specifier: ^0.11.10 version: 0.11.10 @@ -167,48 +167,45 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: - specifier: ^2.12.20 - version: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + specifier: ^2.19.5 + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.5.13 + version: 2.5.13 '@types/react': specifier: ^18.2.21 - version: 18.3.2 + version: 18.3.31 '@types/react-dom': specifier: ^18.2.7 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.0.4 - version: 4.2.1(vite@4.5.3) + version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: ^5.4.21 + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi-viem: dependencies: '@rainbow-me/rainbowkit': - specifier: 2.2.0 - version: 2.2.0(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20) + specifier: ^2.2.11 + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 - version: 5.59.15(react@18.3.1) + version: 5.102.4(react@18.3.1) '@tokenbound/sdk': specifier: workspace:^ version: link:../../packages/sdk buffer: specifier: ^6.0.3 version: 6.0.3 - ethers: - specifier: ^5.7.2 - version: 5.7.2 process: specifier: ^0.11.10 version: 0.11.10 @@ -222,9146 +219,10247 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: - specifier: ^2.12.20 - version: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + specifier: ^2.19.5 + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.5.13 + version: 2.5.13 '@types/react': specifier: ^18.2.21 - version: 18.3.2 + version: 18.3.31 '@types/react-dom': specifier: ^18.2.7 - version: 18.3.0 + version: 18.3.7(@types/react@18.3.31) '@vitejs/plugin-react': specifier: ^4.0.4 - version: 4.2.1(vite@4.5.3) + version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.9.3 + vite: + specifier: ^5.4.21 + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) + + packages/ethers: + dependencies: + '@tokenbound/sdk': + specifier: workspace:^ + version: link:../sdk + devDependencies: + '@biomejs/biome': + specifier: 2.5.13 + version: 2.5.13 + '@viem/anvil': + specifier: ^0.0.10 + version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ethers: + specifier: ^5.8.0 + version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ethers6: + specifier: npm:ethers@^6.17.0 + version: ethers@6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + typescript: + specifier: ^5.6.3 + version: 5.9.3 + viem: + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) vite: specifier: ^4.4.9 - version: 4.5.3 + version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) + vite-plugin-dts: + specifier: ^3.9.0 + version: 3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)) + vitest: + specifier: ^1.6.1 + version: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) packages/sdk: dependencies: '@layerzerolabs/lz-v2-utilities': - specifier: ^2.3.7 - version: 2.3.7 + specifier: ^3.0.168 + version: 3.0.168 viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^2.56.5 + version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 - '@tanstack/react-query': - specifier: ^5.59.15 - version: 5.59.15(react@18.3.1) - '@testing-library/dom': - specifier: ^10.1.0 - version: 10.1.0 - '@testing-library/jest-dom': - specifier: ^6.4.2 - version: 6.4.5(vitest@1.6.0) - '@testing-library/react': - specifier: ^15.0.4 - version: 15.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1) - '@testing-library/user-event': - specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.1.0) - '@tokenbound/sdk': - specifier: workspace:^ - version: 'link:' - '@types/react': - specifier: ^18.3.11 - version: 18.3.11 - '@types/testing-library__jest-dom': - specifier: ^5.14.9 - version: 5.14.9 + specifier: 2.5.13 + version: 2.5.13 '@viem/anvil': specifier: ^0.0.10 - version: 0.0.10 - '@vitest/coverage-c8': - specifier: ^0.33.0 - version: 0.33.0(vitest@1.6.0) + version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@vitest/coverage-v8': + specifier: ^1.6.1 + version: 1.6.1(vitest@1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0)) '@wagmi/cli': - specifier: ^2.1.16 - version: 2.1.16(typescript@5.4.5) - ethers: - specifier: ^5.7.2 - version: 5.7.2 - ethers6: - specifier: npm:ethers@^6.12.1 - version: /ethers@6.12.1 - forge-std: - specifier: 1.1.2 - version: 1.1.2 - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) + specifier: ^2.10.0 + version: 2.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) rollup-plugin-visualizer: specifier: ^5.12.0 - version: 5.12.0 + version: 5.14.0(rolldown@1.2.5)(rollup@4.63.0) typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.9.3 vite: specifier: ^4.4.9 - version: 4.5.3 + version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) vite-plugin-dts: specifier: ^3.9.0 - version: 3.9.1(typescript@5.4.5)(vite@4.5.3) + version: 3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)) vitest: specifier: ^1.6.0 - version: 1.6.0(jsdom@24.0.0) - wagmi: - specifier: ^2.12.20 - version: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.11)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + version: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) packages: - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true - - /@adraffy/ens-normalize@1.10.1: - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + '@aave/account@0.2.1': + resolution: {integrity: sha512-na1slTE+dY6I5G9jX/Zi4ryvuPjy7xfUtsnHYIGYOnGEJtT0I53DU7C2w16isA6Civf+/XPJ+m6RdtOaf+Qoig==} + peerDependencies: + react: 17.x || 18.x || 19.x + react-dom: 17.x || 18.x || 19.x + viem: 2.x + wagmi: 2.x + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + viem: + optional: true + wagmi: + optional: true - /@adraffy/ens-normalize@1.11.0: - resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} + '@adraffy/ens-normalize@1.11.1': + resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - /@babel/code-frame@7.24.2: - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.5 - picocolors: 1.0.1 - /@babel/compat-data@7.24.4: - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5(supports-color@5.5.0) - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - /@babel/generator@7.24.5: - resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - semver: 6.3.1 - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.5): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 - semver: 6.3.1 - - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@5.5.0) - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-member-expression-to-functions@7.24.5: - resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-module-imports@7.24.3: - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.5): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.24.5 + '@babel/core': ^7.0.0-0 - /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.24.5 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/core': ^7.0.0-0 - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-split-export-declaration@7.24.5: - resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.24.5: - resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} - engines: {node: '>=6.9.0'} + '@base-org/account@2.4.0': + resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@babel/helper-wrap-function@7.24.5: - resolution: {integrity: sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@biomejs/biome@2.5.13': + resolution: {integrity: sha512-+SEC/mFk1a+5mvUANZgbZTaiZXs1nj4iMhL/PHiqDT5TPUEPFIlliEtkKKZB4N862yylHC3UI+/Sj2I0HJEqhA==} + engines: {node: '>=14.21.3'} + hasBin: true - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5(supports-color@5.5.0) - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color + '@biomejs/cli-darwin-arm64@2.5.13': + resolution: {integrity: sha512-nYSuDJ6zgVqZUkAkJkvhXxsF2PYIrUk/g638K4voCXz7foI9f7b6C2/7+oAihsHQlivZNMUrm/y8ywlcHQtZOw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] - /@babel/highlight@7.24.5: - resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@biomejs/cli-darwin-x64@2.5.13': + resolution: {integrity: sha512-KVy1ceEDuJ3AzFxjT9kkxbVy+UANw1pjEMUS6lvKfxjJ+fmkRvc7sQn1Xo6ETgseEI7wUQoV03KSga3XfE8YRQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] - /@babel/parser@7.24.5: - resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} - engines: {node: '>=6.0.0'} + '@biomejs/cli-linux-arm64-musl@2.5.13': + resolution: {integrity: sha512-CH32xpep3dNS5EVJpAHlYchkBYznxyVZQrx0b6YYYlPL9u9ZeD2NtqiK/6s64+HFS2a7hGnryLlqqZAOh8ax5g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.5.13': + resolution: {integrity: sha512-VlNMtoxOqs0dUR6drxxHr18SNUvI7xxAuHZlH4s/dstYSf3g6RaqVgo8JRnhcOhKz9afWrvtJTboNG1JuYlIDQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.5.13': + resolution: {integrity: sha512-F3pmwl+VHoUuVJN/tbNLKeLt0SVK3EIyN1jXlMcNyQGYRQQTVqXF+GgkP0/CjGXFN87e/mv0sBfUnWqWza5PKQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.5.13': + resolution: {integrity: sha512-Fi6gIxbUaJ3ZCIXeG3ggIBPF76O2DjDN67WrPX/ODRv54GeXPm2gbEPC96Yb0yrJoiH0Eax1JLx1Pi0XbsNFZQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.5.13': + resolution: {integrity: sha512-+WD13qshXrr0Icv4BfsAdzm8Fs3TL+nZ59zEQxsYNd8lcgZJ0A5+OrlwsL1PipVCmWeRpxgIPD6DAcEd7smkCQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.5.13': + resolution: {integrity: sha512-VOofU/nW761XWzUeUNE8zzYNyPrxuMuNFMizL0qz7J75yeV8N7WFheUlk1/K6dOkaFpH9wJ+lDKlwjAbw0346w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} + + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.31.1': + resolution: {integrity: sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w==} hasBin: true - dependencies: - '@babel/types': 7.24.5 - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} - /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.24.5): - resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} - /@babel/plugin-proposal-export-default-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.24.5): - resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.5): - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} - /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.24.5): - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + '@coinbase/cdp-sdk@1.55.0': + resolution: {integrity: sha512-5PbUg3n3Jk9nm8nEStskRv6jTrVZKkgwxMFjW+i/xUDDzK1fXksKwXdjgUiHB1hf0FZx1LiYBosrh4IULxFyPA==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@x402/core': ^2.21.0 + '@x402/evm': ^2.21.0 + '@x402/extensions': ^2.21.0 + '@x402/svm': ^2.21.0 + peerDependenciesMeta: + '@x402/core': + optional: true + '@x402/evm': + optional: true + '@x402/extensions': + optional: true + '@x402/svm': + optional: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@coinbase/wallet-sdk@3.9.3': + resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@coinbase/wallet-sdk@4.3.6': + resolution: {integrity: sha512-4q8BNG1ViL4mSAAvPAtpwlOs1gpC+67eQtgIwNvT3xyeyFFd+guwkc8bcX5rTmQhXpqnhzC4f0obACbP9CqMSA==} - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} - /@babel/plugin-syntax-export-default-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@csstools/css-tokenizer': ^3.0.4 - /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} - /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - engines: {node: '>=6.9.0'} + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@noble/ciphers': ^1.0.0 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] - /@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.5) + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] - /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.5): - resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) - '@babel/helper-split-export-declaration': 7.24.5 - globals: 11.12.0 - - /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iIYPIWt3dUmUKKE10s3W+jsQ3icFkw0JyRVyY1B7G4yK/nngAOHLVx8xlhA6b/Jzl/Y0nis8gjqhqKtRDQqHWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - /@babel/plugin-transform-for-of@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.5): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - - /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-object-super@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/types': 7.24.5 + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - regenerator-transform: 0.15.2 + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.5): - resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.5 + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - /@babel/preset-env@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.5) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-class-static-block': 7.24.4(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-object-rest-spread': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typeof-symbol': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.24.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.5) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.5) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.5) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.1 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - /@babel/preset-flow@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-sWCV2G9pcqZf+JHyv/RyqEIpFypxdCSxWIxQjpdaQxenNog7cN1pr76hg8u0Fz8Qgg0H4ETkGcJnXL8d4j0PPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.5): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 - esutils: 2.0.3 + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - /@babel/preset-typescript@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - /@babel/register@7.23.7(@babel/core@7.24.5): - resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - /@babel/traverse@7.24.5(supports-color@5.5.0): - resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - /@babel/types@7.24.5: - resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.24.5 - to-fast-properties: 2.0.0 - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@biomejs/biome@1.9.4: - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} - engines: {node: '>=14.21.3'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - dev: true - - /@biomejs/cli-darwin-arm64@1.9.4: - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-darwin-x64@1.9.4: - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-arm64-musl@1.9.4: - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - /@biomejs/cli-linux-arm64@1.9.4: - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - /@biomejs/cli-linux-x64-musl@1.9.4: - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} - engines: {node: '>=14.21.3'} + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + os: [win32] - /@biomejs/cli-linux-x64@1.9.4: - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} - engines: {node: '>=14.21.3'} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-win32-arm64@1.9.4: - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@biomejs/cli-win32-x64@1.9.4: - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} - engines: {node: '>=14.21.3'} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/config': 3.0.0 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.6.2 - dev: true - - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.6.2 - dev: true - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - dependencies: - '@changesets/types': 6.0.0 - dev: true + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} hasBin: true - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 - '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 - ansi-colors: 4.1.3 - chalk: 2.4.2 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - meow: 6.1.1 - outdent: 0.5.0 - p-limit: 2.3.0 - preferred-pm: 3.1.3 - resolve-from: 5.0.0 - semver: 7.6.2 - spawndamnit: 2.0.0 - term-size: 2.2.1 - tty-table: 4.2.3 - dev: true - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/logger': 0.1.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.5 - dev: true + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - dependencies: - extendable-error: 0.1.7 - dev: true + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} - dependencies: - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - chalk: 2.4.2 - fs-extra: 7.0.1 - semver: 7.6.2 - dev: true - - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 - '@changesets/pre': 2.0.0 - '@changesets/read': 0.6.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - dev: true + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: true + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 - dev: true + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - dependencies: - chalk: 2.4.2 - dev: true + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} - dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 - dev: true + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - dev: true + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/git': 3.0.0 - '@changesets/logger': 0.1.0 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 - dev: true + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: true + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/types': 6.0.0 - fs-extra: 7.0.1 - human-id: 1.0.2 - prettier: 2.8.8 - dev: true + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} - /@coinbase/wallet-sdk@3.9.3: - resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} - dependencies: - bn.js: 5.2.1 - buffer: 6.0.3 - clsx: 1.2.1 - eth-block-tracker: 7.1.0 - eth-json-rpc-filters: 6.0.1 - eventemitter3: 5.0.1 - keccak: 3.0.4 - preact: 10.21.0 - sha.js: 2.4.11 - transitivePeerDependencies: - - supports-color + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} - /@coinbase/wallet-sdk@4.0.4: - resolution: {integrity: sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==} - dependencies: - buffer: 6.0.3 - clsx: 1.2.1 - eventemitter3: 5.0.1 - keccak: 3.0.4 - preact: 10.21.0 - sha.js: 2.4.11 + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true - dependencies: - '@emotion/memoize': 0.7.4 - dev: false - optional: true + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false - optional: true + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} - /@emotion/stylis@0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} - /@esbuild/android-arm64@0.19.12: - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} - /@esbuild/android-arm@0.19.12: - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@gemini-wallet/core@0.3.2': + resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} + peerDependencies: + viem: '>=2.0.0' - /@esbuild/darwin-arm64@0.19.12: - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + engines: {node: '>=8'} - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /@esbuild/darwin-x64@0.19.12: - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - /@esbuild/freebsd-arm64@0.19.12: - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@layerzerolabs/lz-v2-utilities@3.0.168': + resolution: {integrity: sha512-5gb5QH3q+JIOkwuJnmv3hWidwLE7ySC0G4IYCL9pwl80bkdkuY9TwfG3KqWri2F5mCzRYs6xx7vaYP5zFqY7yA==} - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@lit-labs/ssr-dom-shim@1.6.0': + resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - /@esbuild/linux-arm64@0.19.12: - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} + + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} + + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} + + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} + + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} + + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} + + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} + + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + + '@metamask/safe-event-emitter@3.1.3': + resolution: {integrity: sha512-Pnl74ukgoOkSItBRmZ9nnhdBbRtBI1ZvpeYjKNgxjVzDWa/AtruKZc+7LjfZ0iO8iYqh7Ts3bPs2Gu7M2hSf7g==} + engines: {node: '>=12.0.0'} + + '@metamask/scure-bip39@2.1.1': + resolution: {integrity: sha512-1K8aBsAqr6+8jWhguVl06n8e+zjV9sUnys+5PLyVU4mb8LbulQ60F6cq7iQys3xX/yCwKt1+7c7j2nuTEpW+ZQ==} + engines: {node: ^16.20 || ^18.16 || >=20} + + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} + + '@metamask/sdk-communication-layer@0.33.1': + resolution: {integrity: sha512-0bI9hkysxcfbZ/lk0T2+aKVo1j0ynQVTuB3sJ5ssPWlz+Z3VwveCkP1O7EVu1tsVVCb0YV5WxK9zmURu2FIiaA==} + peerDependencies: + cross-fetch: ^4.0.0 + eciesjs: '*' + eventemitter2: ^6.4.9 + readable-stream: ^3.6.2 + socket.io-client: ^4.5.1 + + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} + + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} + + '@metamask/superstruct@3.4.1': + resolution: {integrity: sha512-caTaaBUcwBGbUNf3r0uT48upX4nECRbKhQ9pPOfW4sIkfcIUUDV4S9DZxq/5fuNPVt5KWpyd5xIIz0sP+iWLlg==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@11.12.1': + resolution: {integrity: sha512-X97J5AEcaKDTIAfKb4X93ZTLfvOahzDVadlveQW+7OZ7yhXjMxXoFmhX2d9UKv48iS2Dxq9kbGJ1lUfphu9ebQ==} + engines: {node: ^18.18 || ^20.14 || >=22} + + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} + + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.0.0'} + + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} + + '@microsoft/api-extractor-model@7.28.13': + resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + + '@microsoft/api-extractor@7.43.0': + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} + + '@motionone/dom@10.12.0': + resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} + + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} + + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} + + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} + + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/types@0.146.0': + resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + + '@paulmillr/qr@0.2.1': + resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} + deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' + + '@rainbow-me/rainbowkit@2.2.11': + resolution: {integrity: sha512-FHPsRHMBpuHHhuyKktAR13O9agmsUUunDnVEP4hG1dSZ2JojXLUSWyLG28VbGIJakHYylkNguiLFnqM/BM8ERA==} + engines: {node: '>=12.4'} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + react-dom: '>=18' + viem: 2.x + wagmi: ^2.9.0 + + '@reown/appkit-common@1.7.8': + resolution: {integrity: sha512-ridIhc/x6JOp7KbDdwGKY4zwf8/iK8EYBl+HtWrruutSLwZyVi5P8WaZa+8iajL6LcDcDF7LoyLwMTym7SRuwQ==} + + '@reown/appkit-controllers@1.7.8': + resolution: {integrity: sha512-IdXlJlivrlj6m63VsGLsjtPHHsTWvKGVzWIP1fXZHVqmK+rZCBDjCi9j267Rb9/nYRGHWBtlFQhO8dK35WfeDA==} + + '@reown/appkit-pay@1.7.8': + resolution: {integrity: sha512-OSGQ+QJkXx0FEEjlpQqIhT8zGJKOoHzVnyy/0QFrl3WrQTjCzg0L6+i91Ad5Iy1zb6V5JjqtfIFpRVRWN4M3pw==} + + '@reown/appkit-polyfills@1.7.8': + resolution: {integrity: sha512-W/kq786dcHHAuJ3IV2prRLEgD/2iOey4ueMHf1sIFjhhCGMynMkhsOhQMUH0tzodPqUgAC494z4bpIDYjwWXaA==} + + '@reown/appkit-scaffold-ui@1.7.8': + resolution: {integrity: sha512-RCeHhAwOrIgcvHwYlNWMcIDibdI91waaoEYBGw71inE0kDB8uZbE7tE6DAXJmDkvl0qPh+DqlC4QbJLF1FVYdQ==} + + '@reown/appkit-ui@1.7.8': + resolution: {integrity: sha512-1hjCKjf6FLMFzrulhl0Y9Vb9Fu4royE+SXCPSWh4VhZhWqlzUFc7kutnZKx8XZFVQH4pbBvY62SpRC93gqoHow==} + + '@reown/appkit-utils@1.7.8': + resolution: {integrity: sha512-8X7UvmE8GiaoitCwNoB86pttHgQtzy4ryHZM9kQpvjQ0ULpiER44t1qpVLXNM4X35O0v18W0Dk60DnYRMH2WRw==} + peerDependencies: + valtio: 1.13.2 + + '@reown/appkit-wallet@1.7.8': + resolution: {integrity: sha512-kspz32EwHIOT/eg/ZQbFPxgXq0B/olDOj3YMu7gvLEFz4xyOFd/wgzxxAXkp5LbG4Cp++s/elh79rVNmVFdB9A==} + + '@reown/appkit@1.7.8': + resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} + + '@rolldown/binding-android-arm-eabi@1.2.5': + resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + os: [android] - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + '@rolldown/binding-android-arm64@1.2.5': + resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.5': + resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.5': + resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.5': + resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] + '@rolldown/binding-linux-arm64-gnu@1.2.5': + resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] + '@rolldown/binding-linux-arm64-musl@1.2.5': + resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] + '@rolldown/binding-linux-s390x-gnu@1.2.5': + resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] + '@rolldown/binding-linux-x64-gnu@1.2.5': + resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] + '@rolldown/binding-linux-x64-musl@1.2.5': + resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] + '@rolldown/binding-openharmony-arm64@1.2.5': + resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.5': + resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.5': + resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.63.0': + resolution: {integrity: sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.63.0': + resolution: {integrity: sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.63.0': + resolution: {integrity: sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.63.0': + resolution: {integrity: sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.63.0': + resolution: {integrity: sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.63.0': + resolution: {integrity: sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} + cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] + '@rollup/rollup-linux-arm-musleabihf@4.63.0': + resolution: {integrity: sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==} + cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] + '@rollup/rollup-linux-arm64-gnu@4.63.0': + resolution: {integrity: sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==} + cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] + '@rollup/rollup-linux-arm64-musl@4.63.0': + resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} + cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] + '@rollup/rollup-linux-loong64-gnu@4.63.0': + resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} + cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] + '@rollup/rollup-linux-loong64-musl@4.63.0': + resolution: {integrity: sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==} + cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@rollup/rollup-linux-ppc64-gnu@4.63.0': + resolution: {integrity: sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] + '@rollup/rollup-linux-ppc64-musl@4.63.0': + resolution: {integrity: sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==} + cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + '@rollup/rollup-linux-riscv64-gnu@4.63.0': + resolution: {integrity: sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@rollup/rollup-linux-riscv64-musl@4.63.0': + resolution: {integrity: sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + '@rollup/rollup-linux-s390x-gnu@4.63.0': + resolution: {integrity: sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] + '@rollup/rollup-linux-x64-gnu@4.63.0': + resolution: {integrity: sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==} + cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} + '@rollup/rollup-linux-x64-musl@4.63.0': + resolution: {integrity: sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.12: - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@rollup/rollup-openbsd-x64@4.63.0': + resolution: {integrity: sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@rollup/rollup-openharmony-arm64@4.63.0': + resolution: {integrity: sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==} cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + os: [openharmony] - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@rollup/rollup-win32-arm64-msvc@4.63.0': + resolution: {integrity: sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@rollup/rollup-win32-ia32-msvc@4.63.0': + resolution: {integrity: sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} + '@rollup/rollup-win32-x64-gnu@4.63.0': + resolution: {integrity: sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.19.12: - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + '@rollup/rollup-win32-x64-msvc@4.63.0': + resolution: {integrity: sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@rushstack/node-core-library@4.0.2': + resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - /@ethereumjs/common@3.2.0: - resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} - dependencies: - '@ethereumjs/util': 8.1.0 - crc-32: 1.2.2 + '@rushstack/rig-package@0.5.2': + resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true + '@rushstack/terminal@0.10.0': + resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true - /@ethereumjs/tx@4.2.0: - resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} - engines: {node: '>=14'} - dependencies: - '@ethereumjs/common': 3.2.0 - '@ethereumjs/rlp': 4.0.1 - '@ethereumjs/util': 8.1.0 - ethereum-cryptography: 2.1.3 + '@rushstack/ts-command-line@4.19.1': + resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - /@ethereumjs/util@8.1.0: - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 - micro-ftch: 0.3.1 + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} - /@ethersproject/abi@5.7.0: - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - /@ethersproject/abstract-provider@5.7.0: - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - - /@ethersproject/abstract-signer@5.7.0: - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - - /@ethersproject/address@5.7.0: - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - - /@ethersproject/base64@5.7.0: - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - - /@ethersproject/basex@5.7.0: - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - - /@ethersproject/bignumber@5.7.0: - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - - /@ethersproject/bytes@5.7.0: - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 - - /@ethersproject/constants@5.7.0: - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - - /@ethersproject/contracts@5.7.0: - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - - /@ethersproject/hash@5.7.0: - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - /@ethersproject/hdnode@5.7.0: - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - /@ethersproject/json-wallets@5.7.0: - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - /@ethersproject/keccak256@5.7.0: - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 + '@safe-global/safe-gateway-typescript-sdk@3.23.1': + resolution: {integrity: sha512-6ORQfwtEJYpalCeVO21L4XXGSdbEMfyp2hEv6cP82afKXSwvse6d3sdelgaPWUxHIsFRkWvHDdzh8IyyKHZKxw==} + engines: {node: '>=16'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - /@ethersproject/logger@5.7.0: - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - /@ethersproject/networks@5.7.1: - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - dependencies: - '@ethersproject/logger': 5.7.0 - - /@ethersproject/pbkdf2@5.7.0: - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - - /@ethersproject/properties@5.7.0: - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - dependencies: - '@ethersproject/logger': 5.7.0 - - /@ethersproject/providers@5.7.2: - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - /@ethersproject/sha2@5.7.0: - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - /@ethersproject/signing-key@5.7.0: - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 + '@scure/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - /@ethersproject/solidity@5.7.0: - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - - /@ethersproject/strings@5.7.0: - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - /@ethersproject/transactions@5.7.0: - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - - /@ethersproject/units@5.7.0: - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - /@ethersproject/wallet@5.7.0: - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - /@ethersproject/web@5.7.1: - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - /@ethersproject/wordlists@5.7.0: - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - /@hapi/hoek@9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - /@hapi/topo@5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - - /@isaacs/ttlcache@1.4.1: - resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} - engines: {node: '>=12'} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - /@jest/create-cache-key-function@29.7.0: - resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 + '@scure/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - jest-mock: 29.7.0 + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.7.5 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 - /@jest/types@26.6.2: - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.7.5 - '@types/yargs': 15.0.19 - chalk: 4.1.2 + '@solana/accounts@5.5.1': + resolution: {integrity: sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.7.5 - '@types/yargs': 17.0.32 - chalk: 4.1.2 + '@solana/addresses@5.5.1': + resolution: {integrity: sha512-5xoah3Q9G30HQghu/9BiHLb5pzlPKRC3zydQDmE3O9H//WfayxTFppsUDCL6FjYUHqj/wzK6CWHySglc2RkpdA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + '@solana/assertions@5.5.1': + resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jridgewell/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@solana/codecs-core@5.5.1': + resolution: {integrity: sha512-TgBt//bbKBct0t6/MpA8ElaOA3sa8eYVvR7LGslCZ84WiAwwjCY0lW/lOYsFHJQzwREMdUyuEyy5YWBKtdh8Rw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@solana/codecs-data-structures@5.5.1': + resolution: {integrity: sha512-97bJWGyUY9WvBz3mX1UV3YPWGDTez6btCfD0ip3UVEXJbItVuUiOkzcO5iFDUtQT5riKT6xC+Mzl+0nO76gd0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + '@solana/codecs-numbers@5.5.1': + resolution: {integrity: sha512-rllMIZAHqmtvC0HO/dc/21wDuWaD0B8Ryv8o+YtsICQBuiL/0U4AGwH7Pi5GNFySYk0/crSuwfIqQFtmxNSPFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@solana/codecs-strings@5.5.1': + resolution: {integrity: sha512-7klX4AhfHYA+uKKC/nxRGP2MntbYQCR3N6+v7bk1W/rSxYuhNmt+FN8aoThSZtWIKwN6BEyR1167ka8Co1+E7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@solana/codecs@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@layerzerolabs/evm-sdks-core@2.3.7: - resolution: {integrity: sha512-X3+3D9i6L7YEAj9PFjx9wKUYL+mW/hpvn/M8Oz9WxumHTx3M+sITAewRs9Pd0//S5HtXckmitxj1v8a4QhW6WA==} - dependencies: - ethers: 5.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + '@solana/errors@5.5.1': + resolution: {integrity: sha512-vFO3p+S7HoyyrcAectnXbdsMfwUzY2zYFUc2DEe5BwpiE9J1IAxPBGjOWO6hL1bbYdBrlmjNx8DXCslqS+Kcmg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@layerzerolabs/lz-evm-sdk-v2@2.3.7: - resolution: {integrity: sha512-eCvn6geBBNTrUbeFdKeU9r1NqQQjnjZjgnGpyS5L5Muy3fP/lbShZT1FEDa0KScc2MXC3np/wani/+TQltbu4g==} - dependencies: - '@layerzerolabs/evm-sdks-core': 2.3.7 - ethers: 5.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@layerzerolabs/lz-v2-utilities@2.3.7: - resolution: {integrity: sha512-GkPmPKGqnNAYag7AGAfNv2zKOim7lb/DzXorVun370xFL0383043hfi8DP59KrelE9vwMPUYqFKB9omUeXXLCg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@layerzerolabs/lz-evm-sdk-v2': 2.3.7 - '@solana/web3.js': 1.91.8 - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + '@solana/fast-stable-stringify@5.5.1': + resolution: {integrity: sha512-Ni7s2FN33zTzhTFgRjEbOVFO+UAmK8qi3Iu0/GRFYK4jN696OjKHnboSQH/EacQ+yGqS54bfxf409wU5dsLLCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@lit-labs/ssr-dom-shim@1.2.0: - resolution: {integrity: sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==} + '@solana/functional@5.5.1': + resolution: {integrity: sha512-tTHoJcEQq3gQx5qsdsDJ0LEJeFzwNpXD80xApW9o/PPoCNimI3SALkZl+zNW8VnxRrV3l3yYvfHWBKe/X3WG3w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@lit/reactive-element@1.6.3: - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 + '@solana/instruction-plans@5.5.1': + resolution: {integrity: sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - dependencies: - '@babel/runtime': 7.24.5 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: true + '@solana/instructions@5.5.1': + resolution: {integrity: sha512-h0G1CG6S+gUUSt0eo6rOtsaXRBwCq1+Js2a+Ps9Bzk9q7YHNFA75/X0NWugWLgC92waRp66hrjMTiYYnLBoWOQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - dependencies: - '@babel/runtime': 7.24.5 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 - dev: true + '@solana/keys@5.5.1': + resolution: {integrity: sha512-KRD61cL7CRL+b4r/eB9dEoVxIf/2EJ1Pm1DmRYhtSUAJD2dJ5Xw8QFuehobOGm9URqQ7gaQl+Fkc1qvDlsWqKg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/eth-json-rpc-provider@1.0.1: - resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/json-rpc-engine': 7.3.3 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 5.0.2 - transitivePeerDependencies: - - supports-color + '@solana/kit@5.5.1': + resolution: {integrity: sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/json-rpc-engine@7.3.3: - resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} - engines: {node: '>=16.0.0'} - dependencies: - '@metamask/rpc-errors': 6.2.1 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 - transitivePeerDependencies: - - supports-color + '@solana/nominal-types@5.5.1': + resolution: {integrity: sha512-I1ImR+kfrLFxN5z22UDiTWLdRZeKtU0J/pkWkO8qm/8WxveiwdIv4hooi8pb6JnlR4mSrWhq0pCIOxDYrL9GIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/json-rpc-engine@8.0.2: - resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} - engines: {node: '>=16.0.0'} - dependencies: - '@metamask/rpc-errors': 6.2.1 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 - transitivePeerDependencies: - - supports-color + '@solana/offchain-messages@5.5.1': + resolution: {integrity: sha512-g+xHH95prTU+KujtbOzj8wn+C7ZNoiLhf3hj6nYq3MTyxOXtBEysguc97jJveUZG0K97aIKG6xVUlMutg5yxhw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/json-rpc-middleware-stream@7.0.2: - resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} - engines: {node: '>=16.0.0'} - dependencies: - '@metamask/json-rpc-engine': 8.0.2 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 - readable-stream: 3.6.2 - transitivePeerDependencies: - - supports-color + '@solana/options@5.5.1': + resolution: {integrity: sha512-eo971c9iLNLmk+yOFyo7yKIJzJ/zou6uKpy6mBuyb/thKtS/haiKIc3VLhyTXty3OH2PW8yOlORJnv4DexJB8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/object-multiplex@2.0.0: - resolution: {integrity: sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==} - engines: {node: ^16.20 || ^18.16 || >=20} - dependencies: - once: 1.4.0 - readable-stream: 3.6.2 + '@solana/plugin-core@5.5.1': + resolution: {integrity: sha512-VUZl30lDQFJeiSyNfzU1EjYt2QZvoBFKEwjn1lilUJw7KgqD5z7mbV7diJhT+dLFs36i0OsjXvq5kSygn8YJ3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/onboarding@1.0.1: - resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} - dependencies: - bowser: 2.11.0 + '@solana/programs@5.5.1': + resolution: {integrity: sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/providers@16.1.0: - resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} - engines: {node: ^18.18 || >=20} - dependencies: - '@metamask/json-rpc-engine': 8.0.2 - '@metamask/json-rpc-middleware-stream': 7.0.2 - '@metamask/object-multiplex': 2.0.0 - '@metamask/rpc-errors': 6.2.1 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 8.4.0 - detect-browser: 5.3.0 - extension-port-stream: 3.0.0 - fast-deep-equal: 3.1.3 - is-stream: 2.0.1 - readable-stream: 3.6.2 - webextension-polyfill: 0.10.0 - transitivePeerDependencies: - - supports-color + '@solana/promises@5.5.1': + resolution: {integrity: sha512-T9lfuUYkGykJmppEcssNiCf6yiYQxJkhiLPP+pyAc2z84/7r3UVIb2tNJk4A9sucS66pzJnVHZKcZVGUUp6wzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/rpc-errors@6.2.1: - resolution: {integrity: sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==} - engines: {node: '>=16.0.0'} - dependencies: - '@metamask/utils': 8.4.0 - fast-safe-stringify: 2.1.1 - transitivePeerDependencies: - - supports-color + '@solana/rpc-api@5.5.1': + resolution: {integrity: sha512-XWOQQPhKl06Vj0xi3RYHAc6oEQd8B82okYJ04K7N0Vvy3J4PN2cxeK7klwkjgavdcN9EVkYCChm2ADAtnztKnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/safe-event-emitter@2.0.0: - resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + '@solana/rpc-parsed-types@5.5.1': + resolution: {integrity: sha512-HEi3G2nZqGEsa3vX6U0FrXLaqnUCg4SKIUrOe8CezD+cSFbRTOn3rCLrUmJrhVyXlHoQVaRO9mmeovk31jWxJg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/safe-event-emitter@3.1.1: - resolution: {integrity: sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==} - engines: {node: '>=12.0.0'} + '@solana/rpc-spec-types@5.5.1': + resolution: {integrity: sha512-6OFKtRpIEJQs8Jb2C4OO8KyP2h2Hy1MFhatMAoXA+0Ik8S3H+CicIuMZvGZ91mIu/tXicuOOsNNLu3HAkrakrw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/sdk-communication-layer@0.30.0(cross-fetch@4.0.0)(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5): - resolution: {integrity: sha512-q5nbdYkAf76MsZxi1l5MJEAyd8sY9jLRapC8a7x1Q1BNV4rzQeFeux/d0mJ/jTR2LAwbnLZs2rL226AM75oK4w==} + '@solana/rpc-spec@5.5.1': + resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} + engines: {node: '>=20.18.0'} peerDependencies: - cross-fetch: ^4.0.0 - eciesjs: ^0.3.16 - eventemitter2: ^6.4.7 - readable-stream: ^3.6.2 - socket.io-client: ^4.5.1 - dependencies: - bufferutil: 4.0.8 - cross-fetch: 4.0.0 - date-fns: 2.30.0 - debug: 4.3.4(supports-color@5.5.0) - eciesjs: 0.3.18 - eventemitter2: 6.4.9 - readable-stream: 3.6.2 - socket.io-client: 4.7.5 - utf-8-validate: 5.0.10 - uuid: 8.3.2 - transitivePeerDependencies: - - supports-color + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/sdk-install-modal-web@0.30.0(i18next@23.11.5)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1): - resolution: {integrity: sha512-1gT533Huja9tK3cmttvcpZirRAtWJ7vnYH+lnNRKEj2xIP335Df2cOwS+zqNC4GlRCZw7A3IsTjIzlKoxBY1uQ==} + '@solana/rpc-subscriptions-api@5.5.1': + resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} + engines: {node: '>=20.18.0'} peerDependencies: - i18next: 23.11.5 - react: ^18.2.0 - react-dom: ^18.2.0 - react-native: '*' + typescript: ^5.0.0 peerDependenciesMeta: - react: + typescript: optional: true - react-dom: + + '@solana/rpc-subscriptions-channel-websocket@5.5.1': + resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - react-native: + + '@solana/rpc-subscriptions-spec@5.5.1': + resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - dependencies: - i18next: 23.11.5 - qr-code-styling: 1.6.0-rc.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5)(@types/react@18.3.11)(react@18.3.1) - /@metamask/sdk@0.30.0(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1): - resolution: {integrity: sha512-w+M5/Gfk9RRqvnCI5foKppH1dO79fu06defXxU6GfwKDZRhPbx0wgtFhQoTSWDlYOguC3MOM/PI1YCFREeAfsA==} + '@solana/rpc-subscriptions@5.5.1': + resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} + engines: {node: '>=20.18.0'} peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 + typescript: ^5.0.0 peerDependenciesMeta: - react: + typescript: optional: true - react-dom: + + '@solana/rpc-transformers@5.5.1': + resolution: {integrity: sha512-OsWqLCQdcrRJKvHiMmwFhp9noNZ4FARuMkHT5us3ustDLXaxOjF0gfqZLnMkulSLcKt7TGXqMhBV+HCo7z5M8Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - dependencies: - '@metamask/onboarding': 1.0.1 - '@metamask/providers': 16.1.0 - '@metamask/sdk-communication-layer': 0.30.0(cross-fetch@4.0.0)(eciesjs@0.3.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.7.5) - '@metamask/sdk-install-modal-web': 0.30.0(i18next@23.11.5)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1) - '@types/dom-screen-wake-lock': 1.0.3 - '@types/uuid': 10.0.0 - bowser: 2.11.0 - cross-fetch: 4.0.0 - debug: 4.3.4(supports-color@5.5.0) - eciesjs: 0.3.18 - eth-rpc-errors: 4.0.3 - eventemitter2: 6.4.9 - i18next: 23.11.5 - i18next-browser-languagedetector: 7.1.0 - obj-multiplex: 1.0.0 - pump: 3.0.0 - qrcode-terminal-nooctal: 0.12.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-native-webview: 11.26.1(react-native@0.74.1)(react@18.3.1) - readable-stream: 3.6.2 - rollup-plugin-visualizer: 5.12.0 - socket.io-client: 4.7.5 - util: 0.12.5 - uuid: 8.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - react-native - - rollup - - supports-color - - utf-8-validate - /@metamask/utils@5.0.2: - resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} - engines: {node: '>=14.0.0'} - dependencies: - '@ethereumjs/tx': 4.2.0 - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@5.5.0) - semver: 7.6.2 - superstruct: 1.0.4 - transitivePeerDependencies: - - supports-color + '@solana/rpc-transport-http@5.5.1': + resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@metamask/utils@8.4.0: - resolution: {integrity: sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==} - engines: {node: '>=16.0.0'} - dependencies: - '@ethereumjs/tx': 4.2.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 - '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@5.5.0) - pony-cause: 2.1.11 - semver: 7.6.2 - superstruct: 1.0.4 - uuid: 9.0.1 - transitivePeerDependencies: - - supports-color + '@solana/rpc-types@5.5.1': + resolution: {integrity: sha512-bibTFQ7PbHJJjGJPmfYC2I+/5CRFS4O2p9WwbFraX1Keeel+nRrt/NBXIy8veP5AEn2sVJIyJPpWBRpCx1oATA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@microsoft/api-extractor-model@7.28.13: - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2 - transitivePeerDependencies: - - '@types/node' - dev: true + '@solana/rpc@5.5.1': + resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@microsoft/api-extractor@7.43.0: - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} - hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.13 - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2 - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0 - '@rushstack/ts-command-line': 4.19.1 - lodash: 4.17.21 - minimatch: 3.0.8 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - dev: true + '@solana/signers@5.5.1': + resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@microsoft/tsdoc-config@0.16.2: - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true + '@solana/subscribable@5.5.1': + resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true + '@solana/sysvars@5.5.1': + resolution: {integrity: sha512-k3Quq87Mm+geGUu1GWv6knPk0ALsfY6EKSJGw9xUJDHzY/RkYSBnh0RiOrUhtFm2TDNjOailg8/m0VHmi3reFA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@motionone/animation@10.17.0: - resolution: {integrity: sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==} - dependencies: - '@motionone/easing': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.7.0 + '@solana/transaction-confirmation@5.5.1': + resolution: {integrity: sha512-j4mKlYPHEyu+OD7MBt3jRoX4ScFgkhZC6H65on4Fux6LMScgivPJlwnKoZMnsgxFgWds0pl+BYzSiALDsXlYtw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@motionone/dom@10.12.0: - resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} - dependencies: - '@motionone/animation': 10.17.0 - '@motionone/generators': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - hey-listen: 1.0.8 - tslib: 2.7.0 - dev: false + '@solana/transaction-messages@5.5.1': + resolution: {integrity: sha512-aXyhMCEaAp3M/4fP0akwBBQkFPr4pfwoC5CLDq999r/FUwDax2RE/h4Ic7h2Xk+JdcUwsb+rLq85Y52hq84XvQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@motionone/dom@10.17.0: - resolution: {integrity: sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==} - dependencies: - '@motionone/animation': 10.17.0 - '@motionone/generators': 10.17.0 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - hey-listen: 1.0.8 - tslib: 2.7.0 + '@solana/transactions@5.5.1': + resolution: {integrity: sha512-8hHtDxtqalZ157pnx6p8k10D7J/KY/biLzfgh9R09VNLLY3Fqi7kJvJCr7M2ik3oRll56pxhraAGCC9yIT6eOA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true - /@motionone/easing@10.17.0: - resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} - dependencies: - '@motionone/utils': 10.17.0 - tslib: 2.7.0 + '@tanstack/query-core@5.102.4': + resolution: {integrity: sha512-6eXkL+KFyVAZdpKoThCjPQQylZK8/ZOMYTJEVoPtHLkLs2PYks6vUiim9qzgvFXakSkRIAZwAZTeZLIJmpgRpQ==} - /@motionone/generators@10.17.0: - resolution: {integrity: sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==} - dependencies: - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - tslib: 2.7.0 + '@tanstack/react-query@5.102.4': + resolution: {integrity: sha512-Cn6X2eqFHjCtA/sfM/3eiT6/YmcPqo30twNHUlqkfz9LBqRzdt8GN/mFMWXn/qTacYUo3d4nycMzn3LWZmJ7MQ==} + peerDependencies: + react: ^18 || ^19 - /@motionone/svelte@10.16.4: - resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - dependencies: - '@motionone/dom': 10.17.0 - tslib: 2.7.0 + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - /@motionone/types@10.17.0: - resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - /@motionone/utils@10.17.0: - resolution: {integrity: sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==} - dependencies: - '@motionone/types': 10.17.0 - hey-listen: 1.0.8 - tslib: 2.7.0 + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - /@motionone/vue@10.16.4: - resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} - deprecated: Motion One for Vue is deprecated. Use Oku Motion instead https://oku-ui.com/motion - dependencies: - '@motionone/dom': 10.17.0 - tslib: 2.7.0 + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - dependencies: - '@noble/hashes': 1.3.2 + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} - /@noble/curves@1.6.0: - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} - engines: {node: ^14.21.3 || >=16} - dependencies: - '@noble/hashes': 1.5.0 + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - /@noble/hashes@1.5.0: - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + '@types/node@26.3.0': + resolution: {integrity: sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==} - /@parcel/watcher-android-arm64@2.4.1: - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - /@parcel/watcher-darwin-arm64@2.4.1: - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 - /@parcel/watcher-darwin-x64@2.4.1: - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} - /@parcel/watcher-freebsd-x64@2.4.1: - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - /@parcel/watcher-linux-arm-glibc@2.4.1: - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true + '@vanilla-extract/css@1.20.1': + resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==} - /@parcel/watcher-linux-arm64-glibc@2.4.1: - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true + '@vanilla-extract/dynamic@2.1.5': + resolution: {integrity: sha512-QGIFGb1qyXQkbzx6X6i3+3LMc/iv/ZMBttMBL+Wm/DetQd36KsKsFg5CtH3qy+1hCA/5w93mEIIAiL4fkM8ycw==} - /@parcel/watcher-linux-arm64-musl@2.4.1: - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} - /@parcel/watcher-linux-x64-glibc@2.4.1: - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true + '@vanilla-extract/sprinkles@1.6.5': + resolution: {integrity: sha512-HOYidLONR/SeGk8NBAeI64I4gYdsMX9vJmniL13ZcLVwawyK0s2GUENEAcGA+GYLIoeyQB61UqmhqPodJry7zA==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 - /@parcel/watcher-linux-x64-musl@2.4.1: - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true + '@viem/anvil@0.0.10': + resolution: {integrity: sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==} - /@parcel/watcher-wasm@2.4.1: - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} - engines: {node: '>= 10.0.0'} - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.5 - bundledDependencies: - - napi-wasm + '@vitejs/plugin-react@4.7.0': + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - /@parcel/watcher-win32-arm64@2.4.1: - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true + '@vitest/coverage-v8@1.6.1': + resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==} + peerDependencies: + vitest: 1.6.1 - /@parcel/watcher-win32-ia32@2.4.1: - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} - /@parcel/watcher-win32-x64@2.4.1: - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} - /@parcel/watcher@2.4.1: - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.5 - node-addon-api: 7.1.0 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - - /@rainbow-me/rainbowkit@2.2.0(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20): - resolution: {integrity: sha512-N0wQ39UN6Soi6/ujk9lVy5KY2oY6me/dqMPe5BYWlZIKbpBc2De3cl9phSLPw+/rncL3Cp1r6kRZuMe0b+mP9Q==} - engines: {node: '>=12.4'} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: '>=18' - react-dom: '>=18' - viem: 2.x - wagmi: ^2.9.0 - dependencies: - '@tanstack/react-query': 5.59.15(react@18.3.1) - '@vanilla-extract/css': 1.15.5 - '@vanilla-extract/dynamic': 2.1.2 - '@vanilla-extract/sprinkles': 1.6.3(@vanilla-extract/css@1.15.5) - clsx: 2.1.1 - qrcode: 1.5.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.6.0(@types/react@18.3.2)(react@18.3.1) - ua-parser-js: 1.0.37 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - wagmi: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - transitivePeerDependencies: - - '@types/react' - - babel-plugin-macros - dev: false + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} - /@react-native-community/cli-clean@13.6.6: - resolution: {integrity: sha512-cBwJTwl0NyeA4nyMxbhkWZhxtILYkbU3TW3k8AXLg+iGphe0zikYMGB3T+haTvTc6alTyEFwPbimk9bGIqkjAQ==} - dependencies: - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - execa: 5.1.1 - fast-glob: 3.3.2 - transitivePeerDependencies: - - encoding + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - /@react-native-community/cli-config@13.6.6: - resolution: {integrity: sha512-mbG425zCKr8JZhv/j11382arezwS/70juWMsn8j2lmrGTrP1cUdW0MF15CCIFtJsqyK3Qs+FTmqttRpq81QfSg==} - dependencies: - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - cosmiconfig: 5.2.1 - deepmerge: 4.3.1 - fast-glob: 3.3.2 - joi: 17.13.1 - transitivePeerDependencies: - - encoding + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - /@react-native-community/cli-debugger-ui@13.6.6: - resolution: {integrity: sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g==} - dependencies: - serve-static: 1.15.0 - transitivePeerDependencies: - - supports-color + '@volar/language-core@1.11.1': + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - /@react-native-community/cli-doctor@13.6.6: - resolution: {integrity: sha512-TWZb5g6EmQe2Ua2TEWNmyaEayvlWH4GmdD9ZC+p8EpKFpB1NpDGMK6sXbpb42TDvwZg5s4TDRplK0PBEA/SVDg==} - dependencies: - '@react-native-community/cli-config': 13.6.6 - '@react-native-community/cli-platform-android': 13.6.6 - '@react-native-community/cli-platform-apple': 13.6.6 - '@react-native-community/cli-platform-ios': 13.6.6 - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - command-exists: 1.2.9 - deepmerge: 4.3.1 - envinfo: 7.13.0 - execa: 5.1.1 - hermes-profile-transformer: 0.0.6 - node-stream-zip: 1.15.0 - ora: 5.4.1 - semver: 7.6.2 - strip-ansi: 5.2.0 - wcwidth: 1.0.1 - yaml: 2.4.2 - transitivePeerDependencies: - - encoding + '@volar/source-map@1.11.1': + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - /@react-native-community/cli-hermes@13.6.6: - resolution: {integrity: sha512-La5Ie+NGaRl3klei6WxKoOxmCUSGGxpOk6vU5pEGf0/O7ky+Ay0io+zXYUZqlNMi/cGpO7ZUijakBYOB/uyuFg==} - dependencies: - '@react-native-community/cli-platform-android': 13.6.6 - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - hermes-profile-transformer: 0.0.6 - transitivePeerDependencies: - - encoding + '@volar/typescript@1.11.1': + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - /@react-native-community/cli-platform-android@13.6.6: - resolution: {integrity: sha512-/tMwkBeNxh84syiSwNlYtmUz/Ppc+HfKtdopL/5RB+fd3SV1/5/NPNjMlyLNgFKnpxvKCInQ7dnl6jGHJjeHjg==} - dependencies: - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 - logkitty: 0.7.1 - transitivePeerDependencies: - - encoding + '@vue/compiler-core@3.5.42': + resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} - /@react-native-community/cli-platform-apple@13.6.6: - resolution: {integrity: sha512-bOmSSwoqNNT3AmCRZXEMYKz1Jf1l2F86Nhs7qBcXdY/sGiJ+Flng564LOqvdAlVLTbkgz47KjNKCS2pP4Jg0Mg==} - dependencies: - '@react-native-community/cli-tools': 13.6.6 - chalk: 4.1.2 - execa: 5.1.1 - fast-glob: 3.3.2 - fast-xml-parser: 4.3.6 - ora: 5.4.1 - transitivePeerDependencies: - - encoding + '@vue/compiler-dom@3.5.42': + resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} - /@react-native-community/cli-platform-ios@13.6.6: - resolution: {integrity: sha512-vjDnRwhlSN5ryqKTas6/DPkxuouuyFBAqAROH4FR1cspTbn6v78JTZKDmtQy9JMMo7N5vZj1kASU5vbFep9IOQ==} - dependencies: - '@react-native-community/cli-platform-apple': 13.6.6 - transitivePeerDependencies: - - encoding + '@vue/language-core@1.8.27': + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - /@react-native-community/cli-server-api@13.6.6: - resolution: {integrity: sha512-ZtCXxoFlM7oDv3iZ3wsrT3SamhtUJuIkX2WePLPlN5bcbq7zimbPm2lHyicNJtpcGQ5ymsgpUWPCNZsWQhXBqQ==} - dependencies: - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-tools': 13.6.6 - compression: 1.7.4 - connect: 3.7.0 - errorhandler: 1.5.1 - nocache: 3.0.4 - pretty-format: 26.6.2 - serve-static: 1.15.0 - ws: 6.2.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + '@vue/shared@3.5.42': + resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} - /@react-native-community/cli-tools@13.6.6: - resolution: {integrity: sha512-ptOnn4AJczY5njvbdK91k4hcYazDnGtEPrqIwEI+k/CTBHNdb27Rsm2OZ7ye6f7otLBqF8gj/hK6QzJs8CEMgw==} - dependencies: - appdirsjs: 1.2.7 - chalk: 4.1.2 - execa: 5.1.1 - find-up: 5.0.0 - mime: 2.6.0 - node-fetch: 2.7.0 - open: 6.4.0 - ora: 5.4.1 - semver: 7.6.2 - shell-quote: 1.8.1 - sudo-prompt: 9.2.1 - transitivePeerDependencies: - - encoding + '@wagmi/cli@2.10.0': + resolution: {integrity: sha512-2tYt6Bp1q26mWexH+XE6dMpPB5/Gp/3OVtE2SeeJ/gNHKLZmVF/TuoZR75mpJKTpofyvpz/fnuMCkUxzbc/kRw==} + hasBin: true + peerDependencies: + typescript: '>=5.7.3' + peerDependenciesMeta: + typescript: + optional: true - /@react-native-community/cli-types@13.6.6: - resolution: {integrity: sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug==} - dependencies: - joi: 17.13.1 + '@wagmi/connectors@6.2.0': + resolution: {integrity: sha512-2NfkbqhNWdjfibb4abRMrn7u6rPjEGolMfApXss6HCDVt9AW2oVC6k8Q5FouzpJezElxLJSagWz9FW1zaRlanA==} + peerDependencies: + '@wagmi/core': 2.22.1 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true - /@react-native-community/cli@13.6.6: - resolution: {integrity: sha512-IqclB7VQ84ye8Fcs89HOpOscY4284VZg2pojHNl8H0Lzd4DadXJWQoxC7zWm8v2f8eyeX2kdhxp2ETD5tceIgA==} - engines: {node: '>=18'} - hasBin: true - dependencies: - '@react-native-community/cli-clean': 13.6.6 - '@react-native-community/cli-config': 13.6.6 - '@react-native-community/cli-debugger-ui': 13.6.6 - '@react-native-community/cli-doctor': 13.6.6 - '@react-native-community/cli-hermes': 13.6.6 - '@react-native-community/cli-server-api': 13.6.6 - '@react-native-community/cli-tools': 13.6.6 - '@react-native-community/cli-types': 13.6.6 - chalk: 4.1.2 - commander: 9.5.0 - deepmerge: 4.3.1 - execa: 5.1.1 - find-up: 4.1.0 - fs-extra: 8.1.0 - graceful-fs: 4.2.11 - prompts: 2.4.2 - semver: 7.6.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + '@wagmi/core@2.22.1': + resolution: {integrity: sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true - /@react-native/assets-registry@0.74.83: - resolution: {integrity: sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==} + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} engines: {node: '>=18'} - /@react-native/babel-plugin-codegen@0.74.83(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA==} + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} engines: {node: '>=18'} - dependencies: - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5) - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color - /@react-native/babel-preset@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-KJuu3XyVh3qgyUer+rEqh9a/JoUxsDOzkJNfRpDyXiAyjDRoVch60X/Xa/NcEQ93iCVHAWs0yQ+XGNGIBCYE6g==} - engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-export-default-from': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.24.5) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-private-property-in-object': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-runtime': 7.24.3(@babel/core@7.24.5) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.24.5) - '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.24.5) - '@babel/template': 7.24.0 - '@react-native/babel-plugin-codegen': 0.74.83(@babel/preset-env@7.24.5) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.24.5) - react-refresh: 0.14.2 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - /@react-native/codegen@0.74.83(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-GgvgHS3Aa2J8/mp1uC/zU8HuTh8ZT5jz7a4mVMWPw7+rGyv70Ba8uOVBq6UH2Q08o617IATYc+0HfyzAfm4n0w==} - engines: {node: '>=18'} - peerDependencies: - '@babel/preset-env': ^7.1.6 - dependencies: - '@babel/parser': 7.24.5 - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - glob: 7.2.3 - hermes-parser: 0.19.1 - invariant: 2.2.4 - jscodeshift: 0.14.0(@babel/preset-env@7.24.5) - mkdirp: 0.5.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color + '@walletconnect/ethereum-provider@2.21.1': + resolution: {integrity: sha512-SSlIG6QEVxClgl1s0LMk4xr2wg4eT3Zn/Hb81IocyqNSGfXpjtawWxKxiC5/9Z95f1INyBD6MctJbL/R1oBwIw==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - /@react-native/community-cli-plugin@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-7GAFjFOg1mFSj8bnFNQS4u8u7+QtrEeflUIDVZGEfBZQ3wMNI5ycBzbBGycsZYiq00Xvoc6eKFC7kvIaqeJpUQ==} - engines: {node: '>=18'} - dependencies: - '@react-native-community/cli-server-api': 13.6.6 - '@react-native-community/cli-tools': 13.6.6 - '@react-native/dev-middleware': 0.74.83 - '@react-native/metro-babel-transformer': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5) - chalk: 4.1.2 - execa: 5.1.1 - metro: 0.80.9 - metro-config: 0.80.9 - metro-core: 0.80.9 - node-fetch: 2.7.0 - querystring: 0.2.1 - readline: 1.3.0 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} - /@react-native/debugger-frontend@0.74.83: - resolution: {integrity: sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA==} - engines: {node: '>=18'} + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} - /@react-native/dev-middleware@0.74.83: - resolution: {integrity: sha512-UH8iriqnf7N4Hpi20D7M2FdvSANwTVStwFCSD7VMU9agJX88Yk0D1T6Meh2RMhUu4kY2bv8sTkNRm7LmxvZqgA==} - engines: {node: '>=18'} - dependencies: - '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.74.83 - '@rnx-kit/chromium-edge-launcher': 1.0.0 - chrome-launcher: 0.15.2 - connect: 3.7.0 - debug: 2.6.9 - node-fetch: 2.7.0 - nullthrows: 1.1.1 - open: 7.4.2 - selfsigned: 2.4.1 - serve-static: 1.15.0 - temp-dir: 2.0.0 - ws: 6.2.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} - /@react-native/gradle-plugin@0.74.83: - resolution: {integrity: sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ==} - engines: {node: '>=18'} + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} - /@react-native/js-polyfills@0.74.83: - resolution: {integrity: sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw==} - engines: {node: '>=18'} + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} - /@react-native/metro-babel-transformer@0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-hGdx5N8diu8y+GW/ED39vTZa9Jx1di2ZZ0aapbhH4egN1agIAusj5jXTccfNBwwWF93aJ5oVbRzfteZgjbutKg==} - engines: {node: '>=18'} - peerDependencies: - '@babel/core': '*' - dependencies: - '@babel/core': 7.24.5 - '@react-native/babel-preset': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5) - hermes-parser: 0.19.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} - /@react-native/normalize-colors@0.74.83: - resolution: {integrity: sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==} + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} - /@react-native/virtualized-lists@0.74.83(@types/react@18.3.11)(react-native@0.74.1)(react@18.3.1): - resolution: {integrity: sha512-rmaLeE34rj7py4FxTod7iMTC7BAsm+HrGA8WxYmEJeyTV7WSaxAkosKoYBz8038mOiwnG9VwA/7FrB6bEQvn1A==} - engines: {node: '>=18'} + '@walletconnect/keyvaluestorage@1.1.1': + resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} peerDependencies: - '@types/react': ^18.2.6 - react: '*' - react-native: '*' + '@react-native-async-storage/async-storage': 1.x peerDependenciesMeta: - '@types/react': + '@react-native-async-storage/async-storage': optional: true - dependencies: - '@types/react': 18.3.11 - invariant: 2.2.4 - nullthrows: 1.1.1 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5)(@types/react@18.3.11)(react@18.3.1) - /@rnx-kit/chromium-edge-launcher@1.0.0: - resolution: {integrity: sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==} - engines: {node: '>=14.15'} - dependencies: - '@types/node': 18.19.33 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 1.0.4 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - /@rollup/pluginutils@5.1.0: - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - dev: true + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - /@rollup/rollup-android-arm-eabi@4.17.2: - resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} - /@rollup/rollup-android-arm64@4.17.2: - resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - /@rollup/rollup-darwin-arm64@4.17.2: - resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@walletconnect/sign-client@2.21.0': + resolution: {integrity: sha512-z7h+PeLa5Au2R591d/8ZlziE0stJvdzP9jNFzFolf2RG/OiXulgFKum8PrIyXy+Rg2q95U9nRVUF9fWcn78yBA==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - /@rollup/rollup-darwin-x64@4.17.2: - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - /@rollup/rollup-linux-arm-gnueabihf@4.17.2: - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - /@rollup/rollup-linux-arm-musleabihf@4.17.2: - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} - /@rollup/rollup-linux-arm64-gnu@4.17.2: - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} - /@rollup/rollup-linux-arm64-musl@4.17.2: - resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/universal-provider@2.21.0': + resolution: {integrity: sha512-mtUQvewt+X0VBQay/xOJBvxsB3Xsm1lTwFjZ6WUwSOTR1X+FNb71hSApnV5kbsdDIpYPXeQUbGt2se1n5E5UBg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: - resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' - /@rollup/rollup-linux-riscv64-gnu@4.17.2: - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} - /@rollup/rollup-linux-s390x-gnu@4.17.2: - resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} - /@rollup/rollup-linux-x64-gnu@4.17.2: - resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.17.2: - resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.17.2: - resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} - /@rollup/rollup-win32-ia32-msvc@4.17.2: - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@walletconnect/window-metadata@1.0.1': + resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - /@rollup/rollup-win32-x64-msvc@4.17.2: - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true - /@rushstack/node-core-library@4.0.2: - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: - '@types/node': '*' + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 peerDependenciesMeta: - '@types/node': + typescript: + optional: true + zod: optional: true - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - /@rushstack/rig-package@0.5.2: - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true + abitype@1.2.3: + resolution: {integrity: sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true - /@rushstack/terminal@0.10.0: - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + abitype@1.3.0: + resolution: {integrity: sha512-fk6Te+bojIFrMvMZrnOO+SxCB+RUksTGOzq/60ZRvs1L+BVzvi2bqt9L3W/17ZLdZsyM1FuYf65P5nlmoiH1Bg==} peerDependencies: - '@types/node': '*' + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 peerDependenciesMeta: - '@types/node': + typescript: + optional: true + zod: optional: true - dependencies: - '@rushstack/node-core-library': 4.0.2 - supports-color: 8.1.1 - dev: true - /@rushstack/ts-command-line@4.19.1: - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - dependencies: - '@rushstack/terminal': 0.10.0 - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - dev: true + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} - /@safe-global/safe-apps-provider@0.18.3(typescript@5.4.5): - resolution: {integrity: sha512-f/0cNv3S4v7p8rowAjj0hDCg8Q8P/wBjp5twkNWeBdvd0RDr7BuRBPPk74LCqmjQ82P+1ltLlkmVFSmxTIT7XQ==} - dependencies: - '@safe-global/safe-apps-sdk': 9.1.0(typescript@5.4.5) - events: 3.3.0 - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true - /@safe-global/safe-apps-sdk@9.1.0(typescript@5.4.5): - resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - dependencies: - '@safe-global/safe-gateway-typescript-sdk': 3.21.1 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - transitivePeerDependencies: - - bufferutil - - typescript - - utf-8-validate - - zod + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - /@safe-global/safe-gateway-typescript-sdk@3.21.1: - resolution: {integrity: sha512-7nakIjcRSs6781LkizYpIfXh1DYlkUDqyALciqz/BjFU/S97sVjZdL4cuKsG9NEarytE+f6p0Qbq2Bo1aocVUA==} - engines: {node: '>=16'} + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - /@scure/base@1.1.9: - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} - /@scure/bip32@1.3.3: - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} - dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.9 + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - /@scure/bip32@1.5.0: - resolution: {integrity: sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==} - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.9 + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - /@scure/bip39@1.4.0: - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - /@sideway/address@4.1.5: - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - dependencies: - '@hapi/hoek': 9.3.0 + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.1 + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - /@socket.io/component-emitter@3.1.2: - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - /@solana/buffer-layout@4.0.1: - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - dependencies: - buffer: 6.0.3 - dev: false - - /@solana/web3.js@1.91.8: - resolution: {integrity: sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==} - dependencies: - '@babel/runtime': 7.24.5 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@solana/buffer-layout': 4.0.1 - agentkeepalive: 4.5.0 - bigint-buffer: 1.1.5 - bn.js: 5.2.1 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.0 - node-fetch: 2.7.0 - rpc-websockets: 7.11.0 - superstruct: 0.14.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - dev: false + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /@stablelib/aead@1.0.1: - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} - /@stablelib/binary@1.0.1: - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - dependencies: - '@stablelib/int': 1.0.1 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} - /@stablelib/bytes@1.0.1: - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x - /@stablelib/chacha20poly1305@1.0.1: - resolution: {integrity: sha512-MmViqnqHd1ymwjOQfghRKw2R/jMIGT3wySN7cthjXCBdO+qErNPUBnRzqNpnvIwg7JBCg3LdeCZZO4de/yEhVA==} - dependencies: - '@stablelib/aead': 1.0.1 - '@stablelib/binary': 1.0.1 - '@stablelib/chacha': 1.0.1 - '@stablelib/constant-time': 1.0.1 - '@stablelib/poly1305': 1.0.1 - '@stablelib/wipe': 1.0.1 + axios@1.16.0: + resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} - /@stablelib/chacha@1.0.1: - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 + babel-plugin-styled-components@2.3.0: + resolution: {integrity: sha512-nP/y6PbBqS/qtKROnJCgpGo8hYUzlBAVXN1QAjSBANL6vZiQXPQN7FYW/nUwoxY7nZhBEGm9T5tjL9gbzwulDw==} + peerDependencies: + '@babel/core': ^7.0.0 + styled-components: '>= 2' - /@stablelib/constant-time@1.0.1: - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /@stablelib/ed25519@1.0.3: - resolution: {integrity: sha512-puIMWaX9QlRsbhxfDc5i+mNPMY+0TmQEskunY1rZEBPi1acBCVQAhnsk/1Hk50DGPtVsZtAWQg4NHGlVaO9Hqg==} - dependencies: - '@stablelib/random': 1.0.2 - '@stablelib/sha512': 1.0.1 - '@stablelib/wipe': 1.0.1 + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - /@stablelib/hash@1.0.1: - resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - /@stablelib/hkdf@1.0.1: - resolution: {integrity: sha512-SBEHYE16ZXlHuaW5RcGk533YlBj4grMeg5TooN80W3NpcHRtLZLLXvKyX0qcRFxf+BGDobJLnwkvgEwHIDBR6g==} - dependencies: - '@stablelib/hash': 1.0.1 - '@stablelib/hmac': 1.0.1 - '@stablelib/wipe': 1.0.1 + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /@stablelib/hmac@1.0.1: - resolution: {integrity: sha512-V2APD9NSnhVpV/QMYgCVMIYKiYG6LSqw1S65wxVoirhU/51ACio6D4yDVSwMzuTJXWZoVHbDdINioBwKy5kVmA==} - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 + baseline-browser-mapping@2.11.23: + resolution: {integrity: sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==} + engines: {node: '>=6.0.0'} + hasBin: true - /@stablelib/int@1.0.1: - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - /@stablelib/keyagreement@1.0.1: - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} - dependencies: - '@stablelib/bytes': 1.0.1 + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} - /@stablelib/poly1305@1.0.1: - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} - /@stablelib/random@1.0.2: - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 + bn.js@4.12.5: + resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} - /@stablelib/sha256@1.0.1: - resolution: {integrity: sha512-GIIH3e6KH+91FqGV42Kcj71Uefd/QEe7Dy42sBTeqppXV95ggCcxLTk39bEr+lZfJmp+ghsR07J++ORkRELsBQ==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 + bn.js@5.2.5: + resolution: {integrity: sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==} - /@stablelib/sha512@1.0.1: - resolution: {integrity: sha512-13gl/iawHV9zvDKciLo1fQ8Bgn2Pvf7OV6amaRVKiq3pjQ3UmEpXxWiAfV8tYjUpeZroBxtyrwtdooQT/i3hzw==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/hash': 1.0.1 - '@stablelib/wipe': 1.0.1 + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - /@stablelib/wipe@1.0.1: - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - /@stablelib/x25519@1.0.3: - resolution: {integrity: sha512-KnTbKmUhPhHavzobclVJQG5kuivH+qDLpe84iRqX3CLrKp881cF160JvXJ+hjn1aMyCwYOKeIZefIH/P5cJoRw==} - dependencies: - '@stablelib/keyagreement': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/wipe': 1.0.1 + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - /@tanstack/query-core@5.59.13: - resolution: {integrity: sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - /@tanstack/react-query@5.59.15(react@18.3.1): - resolution: {integrity: sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==} - peerDependencies: - react: ^18 || ^19 - dependencies: - '@tanstack/query-core': 5.59.13 - react: 18.3.1 + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - /@testing-library/dom@10.1.0: - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} - engines: {node: '>=18'} - dependencies: - '@babel/code-frame': 7.24.2 - '@babel/runtime': 7.24.5 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - dev: true - - /@testing-library/jest-dom@6.4.5(vitest@1.6.0): - resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.5 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - vitest: 1.6.0(jsdom@24.0.0) - dev: true + browserslist@4.28.9: + resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true - /@testing-library/react@15.0.7(@types/react@18.3.11)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} - engines: {node: '>=18'} - peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.5 - '@testing-library/dom': 10.1.0 - '@types/react': 18.3.11 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - /@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0): - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - dependencies: - '@testing-library/dom': 10.1.0 - dev: true + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 - dev: true + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.24.5 - dev: true + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - dev: true + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - dependencies: - '@babel/types': 7.24.5 - dev: true + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - dependencies: - '@types/node': 22.7.5 - dev: false + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - /@types/dom-screen-wake-lock@1.0.3: - resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - dependencies: - '@types/node': 22.7.5 + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - dev: true + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - /@types/node@18.19.33: - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} - dependencies: - undici-types: 5.26.5 + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} - /@types/node@22.7.5: - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - dependencies: - undici-types: 6.19.8 + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - dependencies: - '@types/react': 18.3.11 - dev: true + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /@types/react@18.3.11: - resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - /@types/react@18.3.2: - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} - /@types/secp256k1@4.0.6: - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - dependencies: - '@types/node': 22.7.5 + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /@types/testing-library__jest-dom@5.14.9: - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - dependencies: - '@types/jest': 29.5.12 - dev: true + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + connectkit@1.9.2: + resolution: {integrity: sha512-ZaYdL2UgHdcVy5j7Cn5C6KUtA5Ev3LEc3mPAzEoH3V3hdu3CdC8jgFTFsgInTXXpsdNpwTEEDPnP245ok7wOYg==} + engines: {node: '>=12.4'} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: 17.x || 18.x + react-dom: 17.x || 18.x + viem: 2.x + wagmi: 2.x - /@types/uuid@10.0.0: - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - dependencies: - '@types/node': 22.7.5 - dev: false + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - dependencies: - '@types/yargs-parser': 21.0.3 - - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - - /@vanilla-extract/css@1.15.5: - resolution: {integrity: sha512-N1nQebRWnXvlcmu9fXKVUs145EVwmWtMD95bpiEKtvehHDpUhmO1l2bauS7FGYKbi3dU1IurJbGpQhBclTr1ng==} - dependencies: - '@emotion/hash': 0.9.1 - '@vanilla-extract/private': 1.0.6 - css-what: 6.1.0 - cssesc: 3.0.0 - csstype: 3.1.3 - dedent: 1.5.3 - deep-object-diff: 1.1.9 - deepmerge: 4.3.1 - lru-cache: 10.4.3 - media-query-parser: 2.0.2 - modern-ahocorasick: 1.0.1 - picocolors: 1.0.1 - transitivePeerDependencies: - - babel-plugin-macros - dev: false - - /@vanilla-extract/dynamic@2.1.2: - resolution: {integrity: sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==} - dependencies: - '@vanilla-extract/private': 1.0.6 - dev: false - - /@vanilla-extract/private@1.0.6: - resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} - dev: false - - /@vanilla-extract/sprinkles@1.6.3(@vanilla-extract/css@1.15.5): - resolution: {integrity: sha512-oCHlQeYOBIJIA2yWy2GnY5wE2A7hGHDyJplJo4lb+KEIBcJWRnDJDg8ywDwQS5VfWJrBBO3drzYZPFpWQjAMiQ==} - peerDependencies: - '@vanilla-extract/css': ^1.0.0 - dependencies: - '@vanilla-extract/css': 1.15.5 - dev: false - - /@viem/anvil@0.0.10: - resolution: {integrity: sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==} - dependencies: - execa: 7.2.0 - get-port: 6.1.2 - http-proxy: 1.18.1 - ws: 8.17.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - dev: true - - /@vitejs/plugin-react@4.2.1(vite@4.5.3): - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 4.5.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@vitest/coverage-c8@0.33.0(vitest@1.6.0): - resolution: {integrity: sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==} - deprecated: v8 coverage is moved to @vitest/coverage-v8 package - peerDependencies: - vitest: '>=0.30.0 <1' - dependencies: - '@ampproject/remapping': 2.3.0 - c8: 7.14.0 - magic-string: 0.30.10 - picocolors: 1.0.1 - std-env: 3.7.0 - vitest: 1.6.0(jsdom@24.0.0) - dev: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true - /@vitest/expect@1.6.0: - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} - dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 - dev: true + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - /@vitest/runner@1.6.0: - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} - dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.2 - dev: true + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} - /@vitest/snapshot@1.6.0: - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} - dependencies: - magic-string: 0.30.10 - pathe: 1.1.2 - pretty-format: 29.7.0 - dev: true + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - dependencies: - tinyspy: 2.2.1 - dev: true + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - /@vitest/utils@1.6.0: - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - /@volar/typescript@1.11.1: - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - dev: true + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} - /@vue/compiler-core@3.4.27: - resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} - dependencies: - '@babel/parser': 7.24.5 - '@vue/shared': 3.4.27 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - dev: true + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} + engines: {node: '>=18'} - /@vue/compiler-dom@3.4.27: - resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} - dependencies: - '@vue/compiler-core': 3.4.27 - '@vue/shared': 3.4.27 - dev: true + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - /@vue/language-core@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + cuer@0.0.3: + resolution: {integrity: sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==} peerDependencies: - typescript: '*' + react: '>=18' + react-dom: '>=18' + typescript: '>=5.4.0' peerDependenciesMeta: typescript: optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 - computeds: 0.0.1 - minimatch: 9.0.4 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.4.5 - vue-template-compiler: 2.7.16 - dev: true - /@vue/shared@3.4.27: - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - dev: true + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} - /@wagmi/cli@2.1.16(typescript@5.4.5): - resolution: {integrity: sha512-uERiNCAwThM6Vwgyrimlf+X8tOF0EjDnir6NHqCoumTquJ1/nlKBvpe0CHD3aDx2RQCOWCqhkUIImtN9yk3Oag==} - hasBin: true - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - abitype: 1.0.6(typescript@5.4.5)(zod@3.23.8) - bundle-require: 4.2.1(esbuild@0.19.12) - cac: 6.7.14 - change-case: 5.4.4 - chokidar: 3.6.0 - dedent: 0.7.0 - dotenv: 16.4.5 - dotenv-expand: 10.0.0 - esbuild: 0.19.12 - execa: 8.0.1 - fdir: 6.4.2(picomatch@3.0.1) - find-up: 6.3.0 - fs-extra: 11.2.0 - ora: 6.3.1 - pathe: 1.1.2 - picocolors: 1.0.1 - picomatch: 3.0.1 - prettier: 3.3.3 - typescript: 5.4.5 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - zod: 3.23.8 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} - /@wagmi/connectors@5.2.2(@types/react@18.3.11)(@wagmi/core@2.13.9)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-G9+0tLWLiG+CyZzI6cqV5mgUnLkYFtdN+kTD7RHesquwRXY6hzTAjCJL19gBuAKzrTXUhaNcxuIYszsRV+/qFA==} - peerDependencies: - '@wagmi/core': 2.13.9 - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@coinbase/wallet-sdk': 4.0.4 - '@metamask/sdk': 0.30.0(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1) - '@safe-global/safe-apps-provider': 0.18.3(typescript@5.4.5) - '@safe-global/safe-apps-sdk': 9.1.0(typescript@5.4.5) - '@wagmi/core': 2.13.9(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - '@walletconnect/ethereum-provider': 2.17.0(@types/react@18.3.11)(react@18.3.1) - '@walletconnect/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) - cbw-sdk: /@coinbase/wallet-sdk@3.9.3 - typescript: 5.4.5 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - react-dom - - react-native - - rollup - - supports-color - - uWebSockets.js - - utf-8-validate - - zod - dev: true + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - /@wagmi/connectors@5.2.2(@types/react@18.3.2)(@wagmi/core@2.13.9)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-G9+0tLWLiG+CyZzI6cqV5mgUnLkYFtdN+kTD7RHesquwRXY6hzTAjCJL19gBuAKzrTXUhaNcxuIYszsRV+/qFA==} + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: - '@wagmi/core': 2.13.9 - typescript: '>=5.0.4' - viem: 2.x + supports-color: '*' peerDependenciesMeta: - typescript: + supports-color: optional: true - dependencies: - '@coinbase/wallet-sdk': 4.0.4 - '@metamask/sdk': 0.30.0(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1) - '@safe-global/safe-apps-provider': 0.18.3(typescript@5.4.5) - '@safe-global/safe-apps-sdk': 9.1.0(typescript@5.4.5) - '@wagmi/core': 2.13.9(@types/react@18.3.2)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - '@walletconnect/ethereum-provider': 2.17.0(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/modal': 2.7.0(@types/react@18.3.2)(react@18.3.1) - cbw-sdk: /@coinbase/wallet-sdk@3.9.3 - typescript: 5.4.5 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - react-dom - - react-native - - rollup - - supports-color - - uWebSockets.js - - utf-8-validate - - zod - dev: false - /@wagmi/core@2.13.9(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-l5pGU97ANyCj48D/pffNkw5AB1R7K2X0vEgCGyHMo21u/Pj/SHvoA35VPta/kqOSZzELXpLxBbOZD4yw7FyCxQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x + supports-color: '*' peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: + supports-color: optional: true - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.4.5) - typescript: 5.4.5 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.11)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - react - dev: true - /@wagmi/core@2.13.9(@types/react@18.3.2)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-l5pGU97ANyCj48D/pffNkw5AB1R7K2X0vEgCGyHMo21u/Pj/SHvoA35VPta/kqOSZzELXpLxBbOZD4yw7FyCxQ==} + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x + babel-plugin-macros: ^3.1.0 peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: + babel-plugin-macros: optional: true - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.4.5) - typescript: 5.4.5 - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - zustand: 4.4.1(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - immer - - react - dev: false - /@walletconnect/core@2.17.0: - resolution: {integrity: sha512-On+uSaCfWdsMIQsECwWHZBmUXfrnqmv6B8SXRRuTJgd8tUpEvBkLQH4X7XkSm3zW6ozEkQTCagZ2ox2YPn3kbw==} - engines: {node: '>=18'} - 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.14 - '@walletconnect/keyvaluestorage': 1.1.1 - '@walletconnect/logger': 2.1.2 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.0.4 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.17.0 - '@walletconnect/utils': 2.17.0 - events: 3.3.0 - lodash.isequal: 4.5.0 - uint8arrays: 3.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - ioredis - - uWebSockets.js - - utf-8-validate + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} - /@walletconnect/environment@1.0.1: - resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - dependencies: - tslib: 1.14.1 + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - /@walletconnect/ethereum-provider@2.17.0(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==} - dependencies: - '@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/modal': 2.7.0(@types/react@18.3.11)(react@18.3.1) - '@walletconnect/sign-client': 2.17.0 - '@walletconnect/types': 2.17.0 - '@walletconnect/universal-provider': 2.17.0 - '@walletconnect/utils': 2.17.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - uWebSockets.js - - utf-8-validate - dev: true + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - /@walletconnect/ethereum-provider@2.17.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-b+KTAXOb6JjoxkwpgYQQKPUcTwENGmdEdZoIDLeRicUmZTn/IQKfkMoC2frClB4YxkyoVMtj1oMV2JAax+yu9A==} - dependencies: - '@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/modal': 2.7.0(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/sign-client': 2.17.0 - '@walletconnect/types': 2.17.0 - '@walletconnect/universal-provider': 2.17.0 - '@walletconnect/utils': 2.17.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@types/react' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - react - - uWebSockets.js - - utf-8-validate - dev: false + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - /@walletconnect/events@1.0.1: - resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} - /@walletconnect/heartbeat@1.2.2: - resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} - dependencies: - '@walletconnect/events': 1.0.1 - '@walletconnect/time': 1.0.2 - events: 3.3.0 + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - /@walletconnect/jsonrpc-http-connection@1.0.8: - resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - cross-fetch: 3.1.8 - events: 3.3.0 - transitivePeerDependencies: - - encoding + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - /@walletconnect/jsonrpc-provider@1.0.14: - resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' - /@walletconnect/jsonrpc-types@1.0.4: - resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} - dependencies: - events: 3.3.0 - keyvaluestorage-interface: 1.0.0 + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - /@walletconnect/jsonrpc-utils@1.0.8: - resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} - dependencies: - '@walletconnect/environment': 1.0.1 - '@walletconnect/jsonrpc-types': 1.0.4 - tslib: 1.14.1 + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - /@walletconnect/jsonrpc-ws-connection@1.0.14: - resolution: {integrity: sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA==} - dependencies: - '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/safe-json': 1.0.2 - events: 3.3.0 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} - /@walletconnect/keyvaluestorage@1.1.1: - resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} - peerDependencies: - '@react-native-async-storage/async-storage': 1.x - peerDependenciesMeta: - '@react-native-async-storage/async-storage': - optional: true - dependencies: - '@walletconnect/safe-json': 1.0.2 - idb-keyval: 6.2.1 - unstorage: 1.10.2(idb-keyval@6.2.1) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/kv' - - ioredis - - uWebSockets.js + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} - /@walletconnect/logger@2.1.2: - resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - /@walletconnect/modal-core@2.7.0(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - dependencies: - valtio: 1.11.2(@types/react@18.3.11)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - dev: true + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - /@walletconnect/modal-core@2.7.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-oyMIfdlNdpyKF2kTJowTixZSo0PGlCJRdssUN/EZdA6H6v03hZnf09JnwpljZNfir2M65Dvjm/15nGrDQnlxSA==} - dependencies: - valtio: 1.11.2(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - dev: false + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /@walletconnect/modal-ui@2.7.0(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - dev: true + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - /@walletconnect/modal-ui@2.7.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-gERYvU7D7K1ANCN/8vUgsE0d2hnRemfAFZ2novm9aZBg7TEd/4EgB+AqbJ+1dc7GhOL6dazckVq78TgccHb7mQ==} - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.2)(react@18.3.1) - lit: 2.8.0 - motion: 10.16.2 - qrcode: 1.5.3 - transitivePeerDependencies: - - '@types/react' - - react - dev: false + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} - /@walletconnect/modal@2.7.0(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.11)(react@18.3.1) - '@walletconnect/modal-ui': 2.7.0(@types/react@18.3.11)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - dev: true + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} - /@walletconnect/modal@2.7.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-RQVt58oJ+rwqnPcIvRFeMGKuXb9qkgSmwz4noF8JZGUym3gUAzVs+uW2NQ1Owm9XOJAV+sANrtJ+VoVq1ftElw==} - dependencies: - '@walletconnect/modal-core': 2.7.0(@types/react@18.3.2)(react@18.3.1) - '@walletconnect/modal-ui': 2.7.0(@types/react@18.3.2)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - dev: false + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} - /@walletconnect/relay-api@1.0.11: - resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} - /@walletconnect/relay-auth@1.0.4: - resolution: {integrity: sha512-kKJcS6+WxYq5kshpPaxGHdwf5y98ZwbfuS4EE/NkQzqrDFm5Cj+dP8LofzWvjrrLkZq7Afy7WrQMXdLy8Sx7HQ==} - dependencies: - '@stablelib/ed25519': 1.0.3 - '@stablelib/random': 1.0.2 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - tslib: 1.14.1 - uint8arrays: 3.1.1 + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - /@walletconnect/safe-json@1.0.2: - resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - dependencies: - tslib: 1.14.1 + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} - /@walletconnect/sign-client@2.17.0: - resolution: {integrity: sha512-sErYwvSSHQolNXni47L3Bm10ptJc1s1YoJvJd34s5E9h9+d3rj7PrhbiW9X82deN+Dm5oA8X9tC4xty1yIBrVg==} - dependencies: - '@walletconnect/core': 2.17.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.17.0 - '@walletconnect/utils': 2.17.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - ioredis - - uWebSockets.js - - utf-8-validate + electron-to-chromium@1.5.427: + resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==} - /@walletconnect/time@1.0.2: - resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - dependencies: - tslib: 1.14.1 + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - /@walletconnect/types@2.17.0: - resolution: {integrity: sha512-i1pn9URpvt9bcjRDkabuAmpA9K7mzyKoLJlbsAujRVX7pfaG7wur7u9Jz0bk1HxvuABL5LHNncTnVKSXKQ5jZA==} - 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 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - ioredis - - uWebSockets.js + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /@walletconnect/universal-provider@2.17.0: - resolution: {integrity: sha512-d3V5Be7AqLrvzcdMZSBS8DmGDRdqnyLk1DWmRKAGgR6ieUWykhhUKlvfeoZtvJrIXrY7rUGYpH1X41UtFkW5Pw==} - dependencies: - '@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/logger': 2.1.2 - '@walletconnect/sign-client': 2.17.0 - '@walletconnect/types': 2.17.0 - '@walletconnect/utils': 2.17.0 - events: 3.3.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - bufferutil - - encoding - - ioredis - - uWebSockets.js - - utf-8-validate + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - /@walletconnect/utils@2.17.0: - resolution: {integrity: sha512-1aeQvjwsXy4Yh9G6g2eGmXrEl+BzkNjHRdCrGdMYqFTFa8ROEJfTGsSH3pLsNDlOY94CoBUvJvM55q/PMoN/FQ==} - dependencies: - '@stablelib/chacha20poly1305': 1.0.1 - '@stablelib/hkdf': 1.0.1 - '@stablelib/random': 1.0.2 - '@stablelib/sha256': 1.0.1 - '@stablelib/x25519': 1.0.3 - '@walletconnect/relay-api': 1.0.11 - '@walletconnect/relay-auth': 1.0.4 - '@walletconnect/safe-json': 1.0.2 - '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.17.0 - '@walletconnect/window-getters': 1.0.1 - '@walletconnect/window-metadata': 1.0.1 - detect-browser: 5.3.0 - elliptic: 6.5.7 - query-string: 7.1.3 - uint8arrays: 3.1.0 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@upstash/redis' - - '@vercel/kv' - - ioredis - - uWebSockets.js + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - /@walletconnect/window-getters@1.0.1: - resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} - dependencies: - tslib: 1.14.1 - - /@walletconnect/window-metadata@1.0.1: - resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - dependencies: - '@walletconnect/window-getters': 1.0.1 - tslib: 1.14.1 + engine.io-client@6.6.6: + resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: false + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} - /abitype@1.0.6(typescript@5.4.5)(zod@3.23.8): - resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.4.5 - zod: 3.23.8 + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - /accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} - /aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - dependencies: - humanize-ms: 1.2.1 - dev: false + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true - /anser@1.4.10: - resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - dev: true - /ansi-fragments@0.2.1: - resolution: {integrity: sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==} - dependencies: - colorette: 1.4.0 - slice-ansi: 2.1.0 - strip-ansi: 5.2.0 - - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} - /appdirsjs@1.2.7: - resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true + ethers@6.17.0: + resolution: {integrity: sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==} + engines: {node: '>=14.0.0'} - /array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: true + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: true + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - /arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: true + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.7.0 + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} - /astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} - /async-mutex@0.2.6: - resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - dependencies: - tslib: 2.7.0 + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - /babel-core@7.0.0-bridge.0(@babel/core@7.24.5): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5): - resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - /babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.24.5): - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - core-js-compat: 3.37.1 - transitivePeerDependencies: - - supports-color + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.5): - resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.5) - transitivePeerDependencies: - - supports-color + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} - /babel-plugin-styled-components@2.1.4(@babel/core@7.24.5)(styled-components@5.3.11): - resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} peerDependencies: - styled-components: '>= 2' - dependencies: - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.11(@babel/core@7.24.5)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - '@babel/core' - dev: false + debug: '*' + peerDependenciesMeta: + debug: + optional: true - /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.24.5): - resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} - dependencies: - '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.5) - transitivePeerDependencies: - - '@babel/core' + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false + framer-motion@6.5.1: + resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} + peerDependencies: + react: '>=16.8 || ^17.0.0 || ^18.0.0' + react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + framesync@6.0.1: + resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - dependencies: - is-windows: 1.0.2 - dev: true + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} - /bigint-buffer@1.1.5: - resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} - engines: {node: '>= 10.0.0'} - requiresBuild: true - dependencies: - bindings: 1.5.0 - dev: false + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - /borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - dev: false + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + get-port@6.1.2: + resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - dependencies: - wcwidth: 1.0.1 - dev: true + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001618 - electron-to-chromium: 1.4.767 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.9 - dev: false + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.1 + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - /bundle-require@4.2.1(esbuild@0.19.12): - resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.19.12 - load-tsconfig: 0.2.5 - dev: true + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} - /c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + hono@4.13.7: + resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} + engines: {node: '>=16.9.0'} - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} - /caniuse-lite@1.0.30001618: - resolution: {integrity: sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - /chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 + human-id@4.2.1: + resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} + hasBin: true - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} - /change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - dev: true + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} - /chrome-launcher@0.15.2: - resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} - engines: {node: '>=12.13.0'} - hasBin: true - dependencies: - '@types/node': 22.7.5 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - transitivePeerDependencies: - - supports-color + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + idb-keyval@6.3.0: + resolution: {integrity: sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - dependencies: - consola: 3.2.3 + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: true + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} - dependencies: - execa: 8.0.1 - is-wsl: 3.1.0 - is64bit: 2.0.0 + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - /colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} - /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} - /compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - /connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /connectkit@1.8.2(@babel/core@7.24.5)(@tanstack/react-query@5.59.15)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1)(viem@2.21.32)(wagmi@2.12.20): - resolution: {integrity: sha512-Za6jR5RtCimzSFqAH1OgUYES96ThTei6d/TvKWNU3GeZPPnwVojtfhFn9wUOam81RknxylvVpG727BPmjguzbA==} - engines: {node: '>=12.4'} + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: 17.x || 18.x - react-dom: 17.x || 18.x - viem: 2.x - wagmi: 2.x - dependencies: - '@tanstack/react-query': 5.59.15(react@18.3.1) - buffer: 6.0.3 - detect-browser: 5.3.0 - framer-motion: 6.5.1(react-dom@18.3.1)(react@18.3.1) - qrcode: 1.5.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-state: 1.1.5(react-dom@18.3.1)(react@18.3.1) - react-use-measure: 2.1.1(react-dom@18.3.1)(react@18.3.1) - resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.24.5)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) - wagmi: 2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - transitivePeerDependencies: - - '@babel/core' - - react-is - dev: false + ws: '*' - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} - /cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - dependencies: - browserslist: 4.23.0 + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} - /cosmiconfig@5.2.1: - resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} - engines: {node: '>=4'} - dependencies: - import-fresh: 2.0.0 - is-directory: 0.3.1 - js-yaml: 3.14.1 - parse-json: 4.0.0 + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} + hasBin: true + + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true - /crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + jsdom@24.1.3: + resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + engines: {node: '>=18'} peerDependencies: - uWebSockets.js: '*' + canvas: ^2.11.2 peerDependenciesMeta: - uWebSockets.js: + canvas: optional: true - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false - - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - dev: false + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + json-rpc-engine@6.1.0: + resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} + engines: {node: '>=10.0.0'} + + json-rpc-random-id@1.0.1: + resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true - dev: false - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 - dev: true + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - /data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - dev: true + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - /data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - /data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - /data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.24.5 + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: false + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - /debug@4.3.4(supports-color@5.5.0): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 5.5.0 + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + lit-html@3.3.3: + resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} - /dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: false + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - /deep-object-diff@1.1.9: - resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - dev: false + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - dev: true + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - /defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} - /delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - dev: false + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} - /denodeify@1.2.1: - resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} - /destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - /detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: false + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} - /dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - /duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - /eciesjs@0.3.18: - resolution: {integrity: sha512-RQhegEtLSyIiGJmFTZfvCTHER/fymipXFVx6OwSRYD6hOuy+6Kjpk0dGvIfP9kxn/smBpxQy71uxpGO406ITCw==} - dependencies: - '@types/secp256k1': 4.0.6 - futoin-hkdf: 1.5.3 - secp256k1: 5.0.0 + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true - /electron-to-chromium@1.4.767: - resolution: {integrity: sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - /elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - /elliptic@6.5.7: - resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true - /engine.io-client@6.5.3: - resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@5.5.0) - engine.io-parser: 5.2.2 - ws: 8.11.0 - xmlhttprequest-ssl: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} - /engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} - engines: {node: '>=10.0.0'} + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - dev: true + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true - /envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 + node-releases@2.0.55: + resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} + engines: {node: '>=18'} - /errorhandler@1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - /es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: true - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + nwsapi@2.2.27: + resolution: {integrity: sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==} - /es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - dev: true + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} - /es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: true + on-exit-leak-free@0.2.0: + resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - dependencies: - es6-promise: 4.2.8 - dev: false + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} + + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + ox@0.14.44: + resolution: {integrity: sha512-O54qXXHEk4ySamMSyBpI0AeBegS5frxU6+LA6Jb9Sf6kMOxcTNaxYmwZfpOu22DIQsdKfgQxHq8EsAGaoBQScA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - /esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@3.0.2: + resolution: {integrity: sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==} + engines: {node: '>=10'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + + pino-abstract-transport@0.5.0: + resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + + pino-std-serializers@4.0.0: + resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + + pino@7.11.0: + resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - dev: true - - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + popmotion@11.0.3: + resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} + + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - dev: true - - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + peerDependencies: + '@tanstack/react-query': '>=5.59.0' + '@wagmi/core': '>=2.16.3' + expo-auth-session: '>=7.0.8' + expo-crypto: '>=15.0.7' + expo-web-browser: '>=15.0.8' + react: '>=18' + react-native: '>=0.81.4' + typescript: '>=5.4.0' + viem: '>=2.37.0' + wagmi: '>=2.0.0' + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + expo-auth-session: + optional: true + expo-crypto: + optional: true + expo-web-browser: + optional: true + react: + optional: true + react-native: + optional: true + typescript: + optional: true + wagmi: + optional: true + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qr@0.7.0: + resolution: {integrity: sha512-/VrrACmOAwZVipuRITwfEwOL5oAMEHH5PTmBWaGtlTom2Thxaa+rhmna4zU9PRN2uLw2wdccbkHOLGZb1Q9SdA==} + engines: {node: '>= 20.19.0'} + + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} hasBin: true - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-is@19.3.0: + resolution: {integrity: sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==} + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true - /eth-block-tracker@7.1.0: - resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/eth-json-rpc-provider': 1.0.1 - '@metamask/safe-event-emitter': 3.1.1 - '@metamask/utils': 5.0.2 - json-rpc-random-id: 1.0.1 - pify: 3.0.0 - transitivePeerDependencies: - - supports-color + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - /eth-json-rpc-filters@6.0.1: - resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} - engines: {node: '>=14.0.0'} - dependencies: - '@metamask/safe-event-emitter': 3.1.1 - async-mutex: 0.2.6 - eth-query: 2.1.2 - json-rpc-engine: 6.1.0 - pify: 5.0.0 + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true - /eth-query@2.1.2: - resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - dependencies: - json-rpc-random-id: 1.0.1 - xtend: 4.0.2 + react-transition-state@1.1.5: + resolution: {integrity: sha512-ITY2mZqc2dWG2eitJkYNdcSFW8aKeOlkL2A/vowRrLL8GH3J6Re/SpD/BLvQzrVOTqjsP0b5S9N10vgNNzwMUQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + react-use-measure@2.1.7: + resolution: {integrity: sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==} + peerDependencies: + react: '>=16.13' + react-dom: '>=16.13' + peerDependenciesMeta: + react-dom: + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + + real-require@0.1.0: + resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + engines: {node: '>= 12.13.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rolldown@1.2.5: + resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-visualizer@5.14.0: + resolution: {integrity: sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + rolldown: 1.x + rollup: 2.x || 3.x || 4.x + peerDependenciesMeta: + rolldown: + optional: true + rollup: + optional: true + + rollup@3.30.0: + resolution: {integrity: sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.63.0: + resolution: {integrity: sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + sha.js@2.4.12: + resolution: {integrity: sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==} + engines: {node: '>= 0.10'} + hasBin: true + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + socket.io-client@4.8.3: + resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} + engines: {node: '>=10.0.0'} + + sonic-boom@2.8.0: + resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + style-value-types@5.0.0: + resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} + + styled-components@5.3.11: + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + thread-stream@0.15.2: + resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + to-buffer@1.2.2: + resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} + engines: {node: '>= 0.4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-is-frozen@0.1.2: + resolution: {integrity: sha512-RwKDW2p3iyWn4UbaxpP2+VxwqXh0jpvdxsYpZ5j/MLLiQOfbsV5shpgQiw93+KMYQPcteeMQ289MaAFzs3G9pw==} + + ua-parser-js@2.0.10: + resolution: {integrity: sha512-t+3Ktbq0Ies2vaSezfOaWiolH4OigQIO1dk+1xDpOydB1COVPocVYOrEV5rqZ0kFY9XYG1v9LutCyMgYBpABcw==} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + uint8arrays@3.1.0: + resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@7.29.1: + resolution: {integrity: sha512-2xO3p6gANwOmhSFwNy2MMYISbHTtM+K3bY0bqpD1gOGpUPIe+yFXCobxbz0s2jm7E0faMxIFcZUcCKa+N6Ozlg==} + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + validator@13.15.35: + resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} + engines: {node: '>= 0.10'} + + valtio@1.13.2: + resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=16.8' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + + viem@2.23.2: + resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.56.5: + resolution: {integrity: sha512-GuEf/oee0PHgy4D6JIA8u0rY1g+sM5nF+p7HyMHO3vjlHC5G/ljfrgnUOnrES9m5Ny/P3RwWCHjDuN2T6HUWzQ==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-node@1.6.1: + resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-plugin-dts@3.9.1: + resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.1: + resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.1 + '@vitest/ui': 1.6.1 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + wagmi@2.19.5: + resolution: {integrity: sha512-RQUfKMv6U+EcSNNGiPbdkDtJwtuFxZWLmvDiQmjjBgkuPulUwDJsKhi7gjynzJdsx2yDqhHCXkKsbbfbIsHfcQ==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.21.3: + resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zustand@5.0.0: + resolution: {integrity: sha512-LE+VcmbartOPM+auOjCCLQOsQ05zUTp8RkgwRzefUk+2jISdMMFnxvyTjA4YNWr5ZGXYbVsEMZosttuxUBkojQ==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@aave/account@0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + + '@adraffy/ens-normalize@1.11.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@asamuzakjp/css-color@3.2.0': + dependencies: + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + lru-cache: 10.4.3 + optional: true + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@5.5.0) + '@babel/types': 7.29.8 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.8': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.8 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.9 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7(supports-color@5.5.0)': + dependencies: + '@babel/traverse': 7.29.8(supports-color@5.5.0) + '@babel/types': 7.29.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@babel/traverse@7.29.8(supports-color@5.5.0)': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@coinbase/cdp-sdk': 1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@coinbase/cdp-sdk': 1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) + preact: 10.24.2 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@2.5.13': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.13 + '@biomejs/cli-darwin-x64': 2.5.13 + '@biomejs/cli-linux-arm64': 2.5.13 + '@biomejs/cli-linux-arm64-musl': 2.5.13 + '@biomejs/cli-linux-x64': 2.5.13 + '@biomejs/cli-linux-x64-musl': 2.5.13 + '@biomejs/cli-win32-arm64': 2.5.13 + '@biomejs/cli-win32-x64': 2.5.13 + + '@biomejs/cli-darwin-arm64@2.5.13': + optional: true + + '@biomejs/cli-darwin-x64@2.5.13': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.5.13': + optional: true + + '@biomejs/cli-linux-arm64@2.5.13': + optional: true + + '@biomejs/cli-linux-x64-musl@2.5.13': + optional: true + + '@biomejs/cli-linux-x64@2.5.13': + optional: true + + '@biomejs/cli-win32-arm64@2.5.13': + optional: true + + '@biomejs/cli-win32-x64@2.5.13': + optional: true + + '@changesets/apply-release-plan@7.1.1': + dependencies: + '@changesets/config': 3.1.4 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.8.5 + + '@changesets/assemble-release-plan@6.0.10': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.8.5 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.31.1(@types/node@26.3.0)': + dependencies: + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@26.3.0) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.8.5 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.4': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.4': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.8.5 + + '@changesets/get-release-plan@4.0.16': + dependencies: + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.3.2 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.2.1 + prettier: 2.8.8 + + '@coinbase/cdp-sdk@1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) + axios: 1.16.0 + axios-retry: 4.5.0(axios@1.16.0) + bs58: 6.0.0 + jose: 6.2.12 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@coinbase/wallet-sdk@3.9.3': + dependencies: + bn.js: 5.2.5 + buffer: 6.0.3 + clsx: 1.2.1 + eth-block-tracker: 7.1.0 + eth-json-rpc-filters: 6.0.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.24.2 + sha.js: 2.4.12 + transitivePeerDependencies: + - supports-color + + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) + preact: 10.24.2 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) + preact: 10.24.2 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@csstools/color-helpers@5.1.0': + optional: true + + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + optional: true + + '@csstools/css-tokenizer@3.0.4': + optional: true + + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@0.8.8': + dependencies: + '@emotion/memoize': 0.7.4 + optional: true + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.7.4': + optional: true + + '@emotion/memoize@0.9.0': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@ethereumjs/common@3.2.0': + dependencies: + '@ethereumjs/util': 8.1.0 + crc-32: 1.2.2 + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/tx@4.2.0': + dependencies: + '@ethereumjs/common': 3.2.0 + '@ethereumjs/rlp': 4.0.1 + '@ethereumjs/util': 8.1.0 + ethereum-cryptography: 2.2.1 + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@ethersproject/abi@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/abstract-provider@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + + '@ethersproject/abstract-signer@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/address@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + + '@ethersproject/base64@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + + '@ethersproject/basex@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + + '@ethersproject/bignumber@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.5 + + '@ethersproject/bytes@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/constants@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + + '@ethersproject/contracts@5.8.0': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + + '@ethersproject/hash@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/hdnode@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/json-wallets@5.8.0': + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.8.0': {} + + '@ethersproject/networks@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/pbkdf2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + + '@ethersproject/properties@5.8.0': + dependencies: + '@ethersproject/logger': 5.8.0 + + '@ethersproject/providers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/rlp@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/sha2@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.5 + elliptic: 6.6.1 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/strings@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/transactions@5.8.0': + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + + '@ethersproject/units@5.8.0': + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + + '@ethersproject/wallet@5.8.0': + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + + '@ethersproject/web@5.8.0': + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@ethersproject/wordlists@5.8.0': + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + + '@gemini-wallet/core@0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@gemini-wallet/core@0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + '@inquirer/external-editor@1.0.3(@types/node@26.3.0)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 26.3.0 + + '@istanbuljs/schema@0.1.6': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.12 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@layerzerolabs/lz-v2-utilities@3.0.168': + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/solidity': 5.8.0 + bs58: 5.0.0 + tiny-invariant: 1.3.3 + + '@lit-labs/ssr-dom-shim@1.6.0': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.29.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.29.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@metamask/eth-json-rpc-provider@1.0.1': + dependencies: + '@metamask/json-rpc-engine': 7.3.3 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 5.0.2 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@7.3.3': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-engine@8.0.2': + dependencies: + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0 + transitivePeerDependencies: + - supports-color + + '@metamask/json-rpc-middleware-stream@7.0.2': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@metamask/object-multiplex@2.1.0': + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + + '@metamask/onboarding@1.0.1': + dependencies: + bowser: 2.14.1 + + '@metamask/providers@16.1.0': + dependencies: + '@metamask/json-rpc-engine': 8.0.2 + '@metamask/json-rpc-middleware-stream': 7.0.2 + '@metamask/object-multiplex': 2.1.0 + '@metamask/rpc-errors': 6.4.0 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 8.5.0 + detect-browser: 5.3.0 + extension-port-stream: 3.0.0 + fast-deep-equal: 3.1.3 + is-stream: 2.0.1 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@6.4.0': + dependencies: + '@metamask/utils': 9.3.0 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/rpc-errors@7.0.2': + dependencies: + '@metamask/utils': 11.12.1 + fast-safe-stringify: 2.1.1 + transitivePeerDependencies: + - supports-color + + '@metamask/safe-event-emitter@2.0.0': {} + + '@metamask/safe-event-emitter@3.1.3': {} + + '@metamask/scure-bip39@2.1.1': + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.9 + + '@metamask/sdk-analytics@0.0.5': + dependencies: + openapi-fetch: 0.13.8 + + '@metamask/sdk-communication-layer@0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))': + dependencies: + '@metamask/sdk-analytics': 0.0.5 + bufferutil: 4.1.0 + cross-fetch: 4.1.0 + date-fns: 2.30.0 + debug: 4.3.4 + eciesjs: 0.4.18 + eventemitter2: 6.4.9 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + uuid: 8.3.2 + transitivePeerDependencies: + - supports-color + + '@metamask/sdk-install-modal-web@0.32.1': + dependencies: + '@paulmillr/qr': 0.2.1 + + '@metamask/sdk@0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.29.7 + '@metamask/onboarding': 1.0.1 + '@metamask/providers': 16.1.0 + '@metamask/sdk-analytics': 0.0.5 + '@metamask/sdk-communication-layer': 0.33.1(cross-fetch@4.1.0)(eciesjs@0.4.18)(eventemitter2@6.4.9)(readable-stream@3.6.2)(socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + '@metamask/sdk-install-modal-web': 0.32.1 + '@paulmillr/qr': 0.2.1 + bowser: 2.14.1 + cross-fetch: 4.1.0 + debug: 4.3.4 + eciesjs: 0.4.18 + eth-rpc-errors: 4.0.3 + eventemitter2: 6.4.9 + obj-multiplex: 1.0.0 + pump: 3.0.4 + readable-stream: 3.6.2 + socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tslib: 2.8.1 + util: 0.12.5 + uuid: 8.3.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metamask/superstruct@3.4.1': {} + + '@metamask/utils@11.12.1': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/scure-bip39': 2.1.1 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + '@types/lodash': 4.17.25 + debug: 4.4.3(supports-color@5.5.0) + lodash: 4.17.23 + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@5.0.2': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@types/debug': 4.1.13 + debug: 4.4.3(supports-color@5.5.0) + semver: 7.8.5 + superstruct: 1.0.4 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@8.5.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + debug: 4.4.3(supports-color@5.5.0) + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@metamask/utils@9.3.0': + dependencies: + '@ethereumjs/tx': 4.2.0 + '@metamask/superstruct': 3.4.1 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + '@types/debug': 4.1.13 + debug: 4.4.3(supports-color@5.5.0) + pony-cause: 2.1.11 + semver: 7.8.5 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + '@microsoft/api-extractor-model@7.28.13(@types/node@26.3.0)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.43.0(@types/node@26.3.0)': + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@26.3.0) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@26.3.0) + '@rushstack/ts-command-line': 4.19.1(@types/node@26.3.0) + lodash: 4.17.23 + minimatch: 3.0.8 + resolve: 1.22.12 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/dom@10.12.0': + dependencies: + '@motionone/animation': 10.18.0 + '@motionone/generators': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.8.1 + + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.8.1 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@noble/ciphers@1.2.1': {} + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.8.0': + dependencies: + '@noble/hashes': 1.7.0 + + '@noble/curves@1.8.1': + dependencies: + '@noble/hashes': 1.7.1 + + '@noble/curves@1.9.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.7.0': {} + + '@noble/hashes@1.7.1': {} + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.3 + + '@oxc-project/types@0.146.0': + optional: true + + '@paulmillr/qr@0.2.1': {} + + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + dependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@vanilla-extract/css': 1.20.1 + '@vanilla-extract/dynamic': 2.1.5 + '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1) + clsx: 2.1.1 + cuer: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) + ua-parser-js: 2.0.10 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - babel-plugin-macros + - typescript + + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))': + dependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@vanilla-extract/css': 1.20.1 + '@vanilla-extract/dynamic': 2.1.5 + '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1) + clsx: 2.1.1 + cuer: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) + ua-parser-js: 2.0.10 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + transitivePeerDependencies: + - '@types/react' + - babel-plugin-macros + - typescript + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + big.js: 6.2.2 + dayjs: 1.11.13 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + lit: 3.3.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) + lit: 3.3.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-polyfills@1.7.8': + dependencies: + buffer: 6.0.3 + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-scaffold-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - valtio + - zod + + '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + lit: 3.3.0 + qrcode: 1.5.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/logger': 2.1.2 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + '@reown/appkit-polyfills': 1.7.8 + '@walletconnect/logger': 2.1.2 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + + '@reown/appkit@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@reown/appkit@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit-common': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-controllers': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-pay': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-polyfills': 1.7.8 + '@reown/appkit-scaffold-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) + '@reown/appkit-ui': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@reown/appkit-utils': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@4.4.3) + '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@walletconnect/types': 2.21.0 + '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + bs58: 6.0.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@rolldown/binding-android-arm-eabi@1.2.5': + optional: true + + '@rolldown/binding-android-arm64@1.2.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.5': + optional: true + + '@rolldown/binding-darwin-x64@1.2.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.5': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.5': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.1': + optional: true + + '@rollup/pluginutils@5.4.0(rollup@4.63.0)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 + optionalDependencies: + rollup: 4.63.0 + + '@rollup/rollup-android-arm-eabi@4.63.0': + optional: true + + '@rollup/rollup-android-arm64@4.63.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.63.0': + optional: true + + '@rollup/rollup-darwin-x64@4.63.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.63.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.63.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.63.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.63.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.63.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.63.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.63.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.63.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.63.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.63.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.63.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.63.0': + optional: true + + '@rushstack/node-core-library@4.0.2(@types/node@26.3.0)': + dependencies: + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.12 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 26.3.0 + + '@rushstack/rig-package@0.5.2': + dependencies: + resolve: 1.22.12 + strip-json-comments: 3.1.1 + + '@rushstack/terminal@0.10.0(@types/node@26.3.0)': + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 26.3.0 + + '@rushstack/ts-command-line@4.19.1(@types/node@26.3.0)': + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@26.3.0) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.23.1 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + + '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} + + '@scure/base@1.1.9': {} + + '@scure/base@1.2.6': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip32@1.6.2': + dependencies: + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip32@1.7.0': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.9 + + '@scure/bip39@1.5.4': + dependencies: + '@noble/hashes': 1.7.1 + '@scure/base': 1.2.6 + + '@scure/bip39@1.6.0': + dependencies: + '@noble/hashes': 1.8.0 + '@scure/base': 1.2.6 + + '@sinclair/typebox@0.27.12': {} + + '@socket.io/component-emitter@3.1.2': {} + + '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana-program/token@0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + + '@solana/accounts@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-core@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-data-structures@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-numbers@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs-strings@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/codecs@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/options': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@5.5.1(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/accounts': 5.5.1(typescript@5.9.3) + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instruction-plans': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/offchain-messages': 5.5.1(typescript@5.9.3) + '@solana/plugin-core': 5.5.1(typescript@5.9.3) + '@solana/programs': 5.5.1(typescript@5.9.3) + '@solana/rpc': 5.5.1(typescript@5.9.3) + '@solana/rpc-api': 5.5.1(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/signers': 5.5.1(typescript@5.9.3) + '@solana/sysvars': 5.5.1(typescript@5.9.3) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/nominal-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/programs@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@5.5.1(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/subscribable': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + undici-types: 7.29.1 + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-types@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/rpc-api': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec': 5.5.1(typescript@5.9.3) + '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-transformers': 5.5.1(typescript@5.9.3) + '@solana/rpc-transport-http': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/offchain-messages': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/sysvars@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/accounts': 5.5.1(typescript@5.9.3) + '@solana/codecs': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/promises': 5.5.1(typescript@5.9.3) + '@solana/rpc': 5.5.1(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + '@solana/transactions': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@5.5.1(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.5.1(typescript@5.9.3) + '@solana/codecs-core': 5.5.1(typescript@5.9.3) + '@solana/codecs-data-structures': 5.5.1(typescript@5.9.3) + '@solana/codecs-numbers': 5.5.1(typescript@5.9.3) + '@solana/codecs-strings': 5.5.1(typescript@5.9.3) + '@solana/errors': 5.5.1(typescript@5.9.3) + '@solana/functional': 5.5.1(typescript@5.9.3) + '@solana/instructions': 5.5.1(typescript@5.9.3) + '@solana/keys': 5.5.1(typescript@5.9.3) + '@solana/nominal-types': 5.5.1(typescript@5.9.3) + '@solana/rpc-types': 5.5.1(typescript@5.9.3) + '@solana/transaction-messages': 5.5.1(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@tanstack/query-core@5.102.4': {} + + '@tanstack/react-query@5.102.4(react@18.3.1)': + dependencies: + '@tanstack/query-core': 5.102.4 + react: 18.3.1 + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.8 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.8 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.9': {} + + '@types/lodash@4.17.25': {} + + '@types/ms@2.1.0': {} + + '@types/node@12.20.55': {} + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + '@types/node@26.3.0': + dependencies: + undici-types: 8.3.0 + optional: true + + '@types/prop-types@15.7.15': {} + + '@types/react-dom@18.3.7(@types/react@18.3.31)': + dependencies: + '@types/react': 18.3.31 + + '@types/react@18.3.31': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + + '@types/trusted-types@2.0.7': {} + + '@vanilla-extract/css@1.20.1': + dependencies: + '@emotion/hash': 0.9.2 + '@vanilla-extract/private': 1.0.9 + css-what: 6.2.2 + csstype: 3.2.3 + dedent: 1.7.2 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/dynamic@2.1.5': + dependencies: + '@vanilla-extract/private': 1.0.9 + + '@vanilla-extract/private@1.0.9': {} + + '@vanilla-extract/sprinkles@1.6.5(@vanilla-extract/css@1.20.1)': + dependencies: + '@vanilla-extract/css': 1.20.1 + + '@viem/anvil@0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + execa: 7.2.0 + get-port: 6.1.2 + http-proxy: 1.18.1 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) + '@rolldown/pluginutils': 1.0.0-beta.27 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@1.6.1(vitest@1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.4.3(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + test-exclude: 6.0.0 + vitest: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.1': + dependencies: + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + chai: 4.5.0 + + '@vitest/runner@1.6.1': + dependencies: + '@vitest/utils': 1.6.1 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.1': + dependencies: + magic-string: 0.30.21 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.1': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.1': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + + '@vue/compiler-core@3.5.42': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.42 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.42': + dependencies: + '@vue/compiler-core': 3.5.42 + '@vue/shared': 3.5.42 + + '@vue/language-core@1.8.27(typescript@5.9.3)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.42 + '@vue/shared': 3.5.42 + computeds: 0.0.1 + minimatch: 9.0.9 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.9.3 + + '@vue/shared@3.5.42': {} + + '@wagmi/cli@2.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + dependencies: + abitype: 1.3.0(typescript@5.9.3)(zod@4.4.3) + bundle-require: 5.1.0(esbuild@0.25.12) + cac: 6.7.14 + change-case: 5.4.4 + chokidar: 4.0.1 + dedent: 0.7.0 + dotenv: 16.6.1 + dotenv-expand: 10.0.0 + esbuild: 0.25.12 + escalade: 3.2.0 + fdir: 6.5.0(picomatch@3.0.2) + nanospinner: 1.2.2 + pathe: 1.1.2 + picocolors: 1.1.1 + picomatch: 3.0.2 + prettier: 3.9.6 + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zod: 4.4.3 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': + dependencies: + '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) + '@gemini-wallet/core': 0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': + dependencies: + '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@gemini-wallet/core': 0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + + '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.102.4 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.102.4 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-provider': 1.0.14 + '@walletconnect/jsonrpc-types': 1.0.4 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/window-getters': 1.0.1 + es-toolkit: 1.33.0 + events: 3.3.0 + uint8arrays: 3.1.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/environment@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@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/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@reown/appkit': 1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@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/sign-client': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/types': 2.21.1 + '@walletconnect/universal-provider': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - react + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/events@1.0.1': + dependencies: + keyvaluestorage-interface: 1.0.0 + tslib: 1.14.1 + + '@walletconnect/heartbeat@1.2.2': + dependencies: + '@walletconnect/events': 1.0.1 + '@walletconnect/time': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-http-connection@1.0.8': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + cross-fetch: 3.2.0 + events: 3.3.0 + transitivePeerDependencies: + - encoding + + '@walletconnect/jsonrpc-provider@1.0.14': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + + '@walletconnect/jsonrpc-types@1.0.4': + dependencies: + events: 3.3.0 + keyvaluestorage-interface: 1.0.0 + + '@walletconnect/jsonrpc-utils@1.0.8': + dependencies: + '@walletconnect/environment': 1.0.1 + '@walletconnect/jsonrpc-types': 1.0.4 + tslib: 1.14.1 + + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + dependencies: + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/safe-json': 1.0.2 + events: 3.3.0 + ws: 7.5.13(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@walletconnect/keyvaluestorage@1.1.1': + dependencies: + '@walletconnect/safe-json': 1.0.2 + idb-keyval: 6.3.0 + unstorage: 1.17.5(idb-keyval@6.3.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/logger@2.1.2': + dependencies: + '@walletconnect/safe-json': 1.0.2 + pino: 7.11.0 + + '@walletconnect/relay-api@1.0.11': + dependencies: + '@walletconnect/jsonrpc-types': 1.0.4 + + '@walletconnect/relay-auth@1.1.0': + dependencies: + '@noble/curves': 1.8.0 + '@noble/hashes': 1.7.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + uint8arrays: 3.1.0 + + '@walletconnect/safe-json@1.0.2': + dependencies: + tslib: 1.14.1 + + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@walletconnect/core': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/events': 1.0.1 + '@walletconnect/heartbeat': 1.2.2 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/logger': 2.1.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@walletconnect/core': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/time@1.0.2': + dependencies: + tslib: 1.14.1 + + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@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 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - ioredis + - uploadthing + + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod + + '@walletconnect/universal-provider@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + 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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/types': 2.21.0 + '@walletconnect/utils': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + es-toolkit: 1.33.0 + events: 3.3.0 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - /eth-rpc-errors@4.0.3: - resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - fast-safe-stringify: 2.1.1 - - /ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} - dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 - - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/units': 5.7.0 - '@ethersproject/wallet': 5.7.0 - '@ethersproject/web': 5.7.1 - '@ethersproject/wordlists': 5.7.0 + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + es-toolkit: 1.33.0 + events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing - utf-8-validate + - zod - /ethers@6.12.1: - resolution: {integrity: sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==} - engines: {node: '>=14.0.0'} + '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 18.15.13 - aes-js: 4.0.0-beta.5 - tslib: 2.4.0 - ws: 8.5.0 + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@walletconnect/types': 2.21.1 + '@walletconnect/utils': 2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + es-toolkit: 1.33.0 + events: 3.3.0 transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch - bufferutil + - db0 + - encoding + - ioredis + - typescript + - uploadthing - utf-8-validate - dev: true + - zod - /ethers@6.13.4: - resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} - engines: {node: '>=14.0.0'} + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 22.7.5 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1 + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch - bufferutil + - db0 + - ioredis + - typescript + - uploadthing - utf-8-validate - dev: false - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true + - zod - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true - - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: true + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - /extension-port-stream@3.0.0: - resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} - engines: {node: '>=12.0.0'} + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: - readable-stream: 3.6.2 - webextension-polyfill: 0.10.0 + '@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(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bufferutil + - db0 + - ioredis + - typescript + - uploadthing + - utf-8-validate + - zod - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + '@walletconnect/window-getters@1.0.1': dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + tslib: 1.14.1 - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + '@walletconnect/window-metadata@1.0.1': dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + abitype@1.0.8(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 - /fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - dev: false + abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 - /fast-xml-parser@4.3.6: - resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} - hasBin: true - dependencies: - strnum: 1.0.5 + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 + abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 + abitype@1.3.0(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 - /fdir@6.4.2(picomatch@3.0.1): - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - dependencies: - picomatch: 3.0.1 - dev: true + abitype@1.3.0(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + abitype@1.3.0(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + acorn-walk@8.3.5: dependencies: - to-regex-range: 5.0.1 + acorn: 8.18.0 - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} + acorn@8.18.0: {} - /finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + aes-js@3.0.0: {} - /find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 + aes-js@4.0.0-beta.5: {} - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 + agent-base@7.1.4: + optional: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + ajv@6.12.6: dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + color-convert: 2.0.1 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ansi-styles@5.2.0: {} + + anymatch@3.1.3: dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true + normalize-path: 3.0.0 + picomatch: 2.3.2 - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + argparse@1.0.10: dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true + sprintf-js: 1.0.3 - /flow-enums-runtime@0.0.6: - resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + argparse@2.0.1: {} - /flow-parser@0.236.0: - resolution: {integrity: sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw==} - engines: {node: '>=0.4.0'} + array-union@2.1.0: {} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true + assertion-error@1.1.0: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + async-mutex@0.2.6: dependencies: - is-callable: 1.2.7 + tslib: 2.8.1 - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true + asynckit@0.4.0: {} - /forge-std@1.1.2: - resolution: {integrity: sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw==} - dev: true + atomic-sleep@1.0.0: {} - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + available-typed-arrays@1.0.7: dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true + possible-typed-array-names: 1.1.0 - /framer-motion@6.5.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} - peerDependencies: - react: '>=16.8 || ^17.0.0 || ^18.0.0' - react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' + axios-retry@4.5.0(axios@1.16.0): dependencies: - '@motionone/dom': 10.12.0 - framesync: 6.0.1 - hey-listen: 1.0.8 - popmotion: 11.0.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - style-value-types: 5.0.0 - tslib: 2.7.0 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - dev: false + axios: 1.16.0 + is-retry-allowed: 2.2.0 - /framesync@6.0.1: - resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} + axios@1.16.0: dependencies: - tslib: 2.7.0 - dev: false - - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + follow-redirects: 1.16.0 + form-data: 4.0.6 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + babel-plugin-styled-components@2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1))(supports-color@5.5.0): dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + picomatch: 4.0.7 + styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1) + transitivePeerDependencies: + - supports-color - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true + balanced-match@1.0.2: {} - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + base-x@4.0.1: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + base-x@5.0.1: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true + base64-js@1.5.1: {} - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + baseline-browser-mapping@2.11.23: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + bech32@1.1.4: {} + + better-path-resolve@1.0.0: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - dev: true + is-windows: 1.0.2 - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + big.js@6.2.2: {} - /futoin-hkdf@1.5.3: - resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} - engines: {node: '>=8'} + bn.js@4.12.5: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + bn.js@5.2.5: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + bowser@2.14.1: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + brace-expansion@1.1.18: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + brace-expansion@2.1.4: dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 + balanced-match: 1.0.2 - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: false + braces@3.0.3: + dependencies: + fill-range: 7.1.1 - /get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + brorand@1.1.0: {} - /get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + browserslist@4.28.9: + dependencies: + baseline-browser-mapping: 2.11.23 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.427 + node-releases: 2.0.55 + update-browserslist-db: 1.3.3(browserslist@4.28.9) - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + bs58@5.0.0: + dependencies: + base-x: 4.0.1 - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + bs58@6.0.0: + dependencies: + base-x: 5.0.1 - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + buffer@6.0.3: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true + base64-js: 1.5.1 + ieee754: 1.2.1 - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + bufferutil@4.1.0: dependencies: - is-glob: 4.0.3 + node-gyp-build: 4.8.4 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + bundle-require@5.1.0(esbuild@0.25.12): dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + esbuild: 0.25.12 + load-tsconfig: 0.2.5 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + cac@6.7.14: {} - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + call-bind-apply-helpers@1.0.2: dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - dev: true + es-errors: 1.3.0 + function-bind: 1.1.2 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + call-bind@1.0.9: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + call-bound@1.0.4: dependencies: - get-intrinsic: 1.2.4 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + camelcase@5.3.1: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + camelize@1.0.1: {} - /h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + caniuse-lite@1.0.30001810: {} + + chai@4.5.0: dependencies: - cookie-es: 1.1.0 - crossws: 0.2.4 - defu: 6.1.4 - destr: 2.0.3 - iron-webcrypto: 1.2.1 - ohash: 1.1.3 - radix3: 1.1.2 - ufo: 1.5.3 - uncrypto: 0.1.3 - unenv: 1.9.0 - transitivePeerDependencies: - - uWebSockets.js + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + chalk@5.6.2: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + change-case@5.4.4: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + chardet@2.2.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + charenc@0.0.2: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + check-error@1.0.3: dependencies: - es-define-property: 1.0.0 - - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + get-func-name: 2.0.2 - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + chokidar@4.0.1: dependencies: - has-symbols: 1.0.3 + readdirp: 4.1.2 - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + chokidar@5.0.0: dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 + readdirp: 5.1.1 - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + cliui@6.0.0: dependencies: - function-bind: 1.1.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /hermes-estree@0.19.1: - resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} + clsx@1.2.1: {} - /hermes-estree@0.20.1: - resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + clsx@2.1.1: {} - /hermes-parser@0.19.1: - resolution: {integrity: sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==} + color-convert@2.0.1: dependencies: - hermes-estree: 0.19.1 + color-name: 1.1.4 - /hermes-parser@0.20.1: - resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} - dependencies: - hermes-estree: 0.20.1 + color-name@1.1.4: {} - /hermes-profile-transformer@0.0.6: - resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} - engines: {node: '>=8'} + combined-stream@1.0.8: dependencies: - source-map: 0.7.4 + delayed-stream: 1.0.0 - /hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + commander@14.0.2: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 + commander@9.5.0: + optional: true - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false + computeds@0.0.1: {} - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + concat-map@0.0.1: {} - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + confbox@0.1.8: {} + + connectkit@1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: - whatwg-encoding: 3.1.1 - dev: true + '@aave/account': 0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + '@tanstack/react-query': 5.102.4(react@18.3.1) + buffer: 6.0.3 + detect-browser: 5.3.0 + framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + qrcode: 1.5.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + resize-observer-polyfill: 1.5.1 + styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@babel/core' + - react-is - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + convert-source-map@2.0.0: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 + cookie-es@1.2.3: {} - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true + core-util-is@1.0.3: {} - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + crc-32@1.2.2: {} + + cross-fetch@3.2.0: dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 + node-fetch: 2.7.0 transitivePeerDependencies: - - debug - dev: true - - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + - encoding - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} + cross-fetch@4.1.0: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@5.5.0) + node-fetch: 2.7.0 transitivePeerDependencies: - - supports-color - dev: true + - encoding - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + crypt@0.0.2: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + css-color-keywords@1.0.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + css-to-react-native@3.2.0: dependencies: - ms: 2.1.3 - dev: false + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + css-what@6.2.2: {} - /i18next-browser-languagedetector@7.1.0: - resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} + cssstyle@4.6.0: dependencies: - '@babel/runtime': 7.24.5 + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + optional: true - /i18next@23.11.5: - resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} - dependencies: - '@babel/runtime': 7.24.5 + csstype@3.2.3: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + cuer@0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): dependencies: - safer-buffer: 2.1.2 - dev: true + qr: 0.7.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + typescript: 5.9.3 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + data-urls@5.0.0: dependencies: - safer-buffer: 2.1.2 - dev: true + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + optional: true - /idb-keyval@6.2.1: - resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.7 - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dayjs@1.11.13: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + de-indent@1.0.2: {} - /image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} - engines: {node: '>=16.x'} - hasBin: true + debug@4.3.4: dependencies: - queue: 6.0.2 + ms: 2.1.2 - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} + debug@4.4.3(supports-color@5.5.0): dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + decamelize@1.2.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + decimal.js@10.6.0: + optional: true - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + decode-uri-component@0.2.2: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 + dedent@0.7.0: {} - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dedent@1.7.2: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + deep-eql@4.1.4: dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - dev: true + type-detect: 4.1.0 - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - dependencies: - loose-envify: 1.4.0 + deep-object-diff@1.1.9: {} - /iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + deepmerge@4.3.1: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true + define-lazy-prop@2.0.0: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + defu@6.1.7: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true + delayed-stream@1.0.0: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)): dependencies: - binary-extensions: 2.3.0 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + destr@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + detect-browser@5.3.0: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.2 + detect-europe-js@0.1.2: {} - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - dependencies: - is-typed-array: 1.1.13 - dev: true + detect-indent@6.1.0: {} - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.2 - dev: true + detect-libc@2.1.2: + optional: true - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} + detect-node-es@1.1.0: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + diff-sequences@29.6.3: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true + dijkstrajs@1.0.3: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + dotenv-expand@10.0.0: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + dotenv@16.6.1: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + dunder-proto@1.0.1: dependencies: - has-tostringtag: 1.0.2 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + duplexify@4.1.3: dependencies: - is-extglob: 2.1.1 + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + eciesjs@0.4.18: dependencies: - is-docker: 3.0.0 + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + electron-to-chromium@1.5.427: {} - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + elliptic@6.6.1: + dependencies: + bn.js: 4.12.5 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + emoji-regex@8.0.0: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + encode-utf8@1.0.3: {} + + end-of-stream@1.4.5: dependencies: - has-tostringtag: 1.0.2 - dev: true + once: 1.4.0 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + engine.io-client@6.6.6(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.4.3(supports-color@5.5.0) + engine.io-parser: 5.2.3 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + engine.io-parser@5.2.3: {} - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + enquirer@2.4.1: dependencies: - isobject: 3.0.1 + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + entities@6.0.1: + optional: true - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + entities@7.0.1: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - dev: true + es-define-property@1.0.1: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + es-errors@1.3.0: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - dev: true + hasown: 2.0.4 - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + es-toolkit@1.33.0: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + eth-block-tracker@7.1.0: dependencies: - better-path-resolve: 1.0.0 - dev: true + '@metamask/eth-json-rpc-provider': 1.0.1 + '@metamask/safe-event-emitter': 3.1.3 + '@metamask/utils': 5.0.2 + json-rpc-random-id: 1.0.1 + pify: 3.0.0 + transitivePeerDependencies: + - supports-color - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + eth-json-rpc-filters@6.0.1: dependencies: - has-symbols: 1.0.3 - dev: true + '@metamask/safe-event-emitter': 3.1.3 + async-mutex: 0.2.6 + eth-query: 2.1.2 + json-rpc-engine: 6.1.0 + pify: 5.0.0 - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + eth-query@2.1.2: dependencies: - which-typed-array: 1.1.15 + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.1 - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + ethereum-cryptography@2.2.1: + dependencies: + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 + + ethers@5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + ethers@6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: - call-bind: 1.0.7 - dev: true + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + eventemitter2@6.4.9: {} - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} + eventemitter3@4.0.7: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@7.2.0: dependencies: - is-docker: 2.2.1 + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + execa@8.0.1: dependencies: - is-inside-container: 1.0.0 + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 - /is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} + extendable-error@0.1.7: {} + + extension-port-stream@3.0.0: dependencies: - system-architecture: 0.1.0 + readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + fast-deep-equal@3.1.3: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + fast-json-stable-stringify@2.1.0: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + fast-redact@3.5.0: {} - /isomorphic-ws@4.0.1(ws@7.5.9): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - dependencies: - ws: 7.5.9 - dev: false + fast-safe-stringify@2.1.1: {} - /isows@1.0.6(ws@8.18.0): - resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} - peerDependencies: - ws: '*' + fastq@1.20.3: dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + reusify: 1.1.0 - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + fdir@6.5.0(picomatch@3.0.2): + optionalDependencies: + picomatch: 3.0.2 - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + fill-range@7.1.1: dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true + to-regex-range: 5.0.1 - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true + filter-obj@1.1.0: {} - /jayson@4.1.0: - resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} - engines: {node: '>=8'} - hasBin: true + find-up@4.1.0: dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.9) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + locate-path: 5.0.0 + path-exists: 4.0.0 - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + follow-redirects@1.16.0: {} - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + for-each@0.3.5: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + is-callable: 1.2.7 - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + form-data@4.0.6: dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + framer-motion@6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/code-frame': 7.24.2 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + '@motionone/dom': 10.12.0 + framesync: 6.0.1 + hey-listen: 1.0.8 + popmotion: 11.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + style-value-types: 5.0.0 + tslib: 2.8.1 + optionalDependencies: + '@emotion/is-prop-valid': 0.8.8 - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + framesync@6.0.1: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - jest-util: 29.7.0 + tslib: 2.8.1 - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + fs-extra@7.0.1: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - chalk: 4.1.2 - ci-info: 3.9.0 graceful-fs: 4.2.11 - picomatch: 2.3.1 + jsonfile: 4.0.0 + universalify: 0.1.2 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + fs-extra@8.1.0: dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 22.7.5 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 + fs.realpath@1.0.0: {} - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true + fsevents@2.3.3: + optional: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + function-bind@1.1.2: {} - /joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 + generator-function@2.0.1: {} - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + gensync@1.0.0-beta.2: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + get-caller-file@2.0.5: {} - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - dev: true + get-func-name@2.0.2: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + get-intrinsic@1.3.0: dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /jsc-android@250231.0.0: - resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 - /jsc-safe-url@0.2.4: - resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + get-nonce@1.0.1: {} - /jscodeshift@0.14.0(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - dependencies: - '@babel/core': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.24.5) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.24.5) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) - '@babel/preset-env': 7.24.5(@babel/core@7.24.5) - '@babel/preset-flow': 7.24.1(@babel/core@7.24.5) - '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) - '@babel/register': 7.23.7(@babel/core@7.24.5) - babel-core: 7.0.0-bridge.0(@babel/core@7.24.5) - chalk: 4.1.2 - flow-parser: 0.236.0 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.21.5 - temp: 0.8.4 - write-file-atomic: 2.4.3 - transitivePeerDependencies: - - supports-color + get-port@6.1.2: {} - /jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + get-proto@1.0.1: dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.4 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.10 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.17.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + get-stream@6.0.1: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + get-stream@8.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 - /json-rpc-engine@6.1.0: - resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} - engines: {node: '>=10.0.0'} + globby@11.1.0: dependencies: - '@metamask/safe-event-emitter': 2.0.0 - eth-rpc-errors: 4.0.3 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 - /json-rpc-random-id@1.0.1: - resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} + gopd@1.2.0: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + graceful-fs@4.2.11: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.5 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + has-flag@3.0.0: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 + has-flag@4.0.0: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + has-property-descriptors@1.0.2: dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true + es-define-property: 1.0.1 - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + has-symbols@1.1.0: {} - /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - requiresBuild: true + has-tostringtag@1.0.2: dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 - readable-stream: 3.6.2 + has-symbols: 1.1.0 - /keyvaluestorage-interface@1.0.0: - resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + he@1.2.0: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + hey-listen@1.0.8: {} - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - dev: true + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hono@4.13.7: {} - /lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + html-encoding-sniffer@4.0.0: dependencies: - debug: 2.6.9 - marky: 1.2.5 - transitivePeerDependencies: - - supports-color + whatwg-encoding: 3.1.1 + optional: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + html-escaper@2.0.2: {} - /listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} - hasBin: true + http-proxy-agent@7.0.2: dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 - citty: 0.1.6 - clipboardy: 4.0.0 - consola: 3.2.3 - crossws: 0.2.4 - defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.11.1 - http-shutdown: 1.2.2 - jiti: 1.21.0 - mlly: 1.7.0 - node-forge: 1.3.1 - pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.3 - untun: 0.1.3 - uqr: 0.1.2 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - - uWebSockets.js + - supports-color + optional: true - /lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + http-proxy@1.18.1: dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 + eventemitter3: 4.0.7 + follow-redirects: 1.16.0 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug - /lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + https-proxy-agent@7.0.6: dependencies: - '@types/trusted-types': 2.0.7 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + optional: true - /lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} - dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 + human-id@4.2.1: {} - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + human-signals@4.3.1: {} - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true + human-signals@5.0.0: {} - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - dev: true + husky@8.0.3: {} - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + iconv-lite@0.6.3: dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 + safer-buffer: 2.1.2 + optional: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + iconv-lite@0.7.3: dependencies: - p-locate: 4.1.0 + safer-buffer: 2.1.2 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 + idb-keyval@6.2.1: {} - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-locate: 6.0.0 - dev: true + idb-keyval@6.3.0: {} - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + ieee754@1.2.1: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + ignore@5.3.2: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + import-lazy@4.0.0: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + inherits@2.0.4: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + iron-webcrypto@1.2.1: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + is-arguments@1.2.0: dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: true + is-buffer@1.1.6: {} - /logkitty@0.7.1: - resolution: {integrity: sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==} - hasBin: true - dependencies: - ansi-fragments: 0.2.1 - dayjs: 1.11.11 - yargs: 15.4.1 + is-callable@1.2.7: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + is-core-module@2.16.2: dependencies: - js-tokens: 4.0.0 + hasown: 2.0.4 - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - dependencies: - get-func-name: 2.0.2 - dev: true + is-docker@2.2.1: {} - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + is-extglob@2.1.1: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true + is-fullwidth-code-point@3.0.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + is-generator-function@1.1.2: dependencies: - yallist: 3.1.1 + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + is-glob@4.0.3: dependencies: - yallist: 4.0.0 - dev: true + is-extglob: 2.1.1 - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true + is-number@7.0.0: {} - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + is-potential-custom-element-name@1.0.1: + optional: true - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + is-regex@1.2.1: dependencies: - pify: 4.0.1 - semver: 5.7.2 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.2 - dev: true + is-retry-allowed@2.2.0: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 + is-standalone-pwa@0.1.1: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + is-stream@2.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + is-stream@3.0.0: {} - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 - /media-query-parser@2.0.2: - resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + is-typed-array@1.1.15: dependencies: - '@babel/runtime': 7.24.5 - dev: false + which-typed-array: 1.1.22 - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + is-windows@1.0.2: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - dev: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + is-docker: 2.2.1 - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + isarray@1.0.0: {} - /metro-babel-transformer@0.80.9: - resolution: {integrity: sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==} - engines: {node: '>=18'} - dependencies: - '@babel/core': 7.24.5 - hermes-parser: 0.20.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color + isarray@2.0.5: {} - /metro-cache-key@0.80.9: - resolution: {integrity: sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==} - engines: {node: '>=18'} + isexe@2.0.0: {} - /metro-cache@0.80.9: - resolution: {integrity: sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==} - engines: {node: '>=18'} + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - metro-core: 0.80.9 - rimraf: 3.0.2 + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - /metro-config@0.80.9: - resolution: {integrity: sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==} - engines: {node: '>=18'} + isows@1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): dependencies: - connect: 3.7.0 - cosmiconfig: 5.2.1 - jest-validate: 29.7.0 - metro: 0.80.9 - metro-cache: 0.80.9 - metro-core: 0.80.9 - metro-runtime: 0.80.9 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - /metro-core@0.80.9: - resolution: {integrity: sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==} - engines: {node: '>=18'} + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: dependencies: - lodash.throttle: 4.1.1 - metro-resolver: 0.80.9 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - /metro-file-map@0.80.9: - resolution: {integrity: sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==} - engines: {node: '>=18'} + istanbul-lib-source-maps@5.0.6: dependencies: - anymatch: 3.1.3 - debug: 2.6.9 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-worker: 29.7.0 - micromatch: 4.0.5 - node-abort-controller: 3.1.1 - nullthrows: 1.1.1 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - /metro-minify-terser@0.80.9: - resolution: {integrity: sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==} - engines: {node: '>=18'} + istanbul-reports@3.2.0: dependencies: - terser: 5.31.0 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - /metro-resolver@0.80.9: - resolution: {integrity: sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==} - engines: {node: '>=18'} + jju@1.4.0: {} - /metro-runtime@0.80.9: - resolution: {integrity: sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==} - engines: {node: '>=18'} - dependencies: - '@babel/runtime': 7.24.5 + jose@6.2.12: {} - /metro-source-map@0.80.9: - resolution: {integrity: sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==} - engines: {node: '>=18'} - dependencies: - '@babel/traverse': 7.24.5(supports-color@5.5.0) - '@babel/types': 7.24.5 - invariant: 2.2.4 - metro-symbolicate: 0.80.9 - nullthrows: 1.1.1 - ob1: 0.80.9 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color + js-sha3@0.8.0: {} - /metro-symbolicate@0.80.9: - resolution: {integrity: sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==} - engines: {node: '>=18'} - hasBin: true + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.15.2: dependencies: - invariant: 2.2.4 - metro-source-map: 0.80.9 - nullthrows: 1.1.1 - source-map: 0.5.7 - through2: 2.0.5 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color + argparse: 1.0.10 + esprima: 4.0.1 - /metro-transform-plugins@0.80.9: - resolution: {integrity: sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==} - engines: {node: '>=18'} + js-yaml@4.3.2: dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5(supports-color@5.5.0) - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color + argparse: 2.0.1 - /metro-transform-worker@0.80.9: - resolution: {integrity: sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==} - engines: {node: '>=18'} + jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - metro: 0.80.9 - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-minify-terser: 0.80.9 - metro-source-map: 0.80.9 - metro-transform-plugins: 0.80.9 - nullthrows: 1.1.1 + cssstyle: 4.6.0 + data-urls: 5.0.0 + decimal.js: 10.6.0 + form-data: 4.0.6 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.27 + parse5: 7.3.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) + xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - - encoding - supports-color - utf-8-validate + optional: true - /metro@0.80.9: - resolution: {integrity: sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==} - engines: {node: '>=18'} - hasBin: true + jsesc@3.1.0: {} + + json-rpc-engine@6.1.0: dependencies: - '@babel/code-frame': 7.24.2 - '@babel/core': 7.24.5 - '@babel/generator': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5(supports-color@5.5.0) - '@babel/types': 7.24.5 - accepts: 1.3.8 - chalk: 4.1.2 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 2.6.9 - denodeify: 1.2.1 - error-stack-parser: 2.1.4 - graceful-fs: 4.2.11 - hermes-parser: 0.20.1 - image-size: 1.1.1 - invariant: 2.2.4 - jest-worker: 29.7.0 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.80.9 - metro-cache: 0.80.9 - metro-cache-key: 0.80.9 - metro-config: 0.80.9 - metro-core: 0.80.9 - metro-file-map: 0.80.9 - metro-resolver: 0.80.9 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 - metro-symbolicate: 0.80.9 - metro-transform-plugins: 0.80.9 - metro-transform-worker: 0.80.9 - mime-types: 2.1.35 - node-fetch: 2.7.0 - nullthrows: 1.1.1 - rimraf: 3.0.2 - serialize-error: 2.1.0 - source-map: 0.5.7 - strip-ansi: 6.0.1 - throat: 5.0.0 - ws: 7.5.9 - yargs: 17.7.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + json-rpc-random-id@1.0.1: {} - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 + json-schema-traverse@0.4.1: {} - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + json5@2.2.3: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keccak@3.0.4: dependencies: - mime-db: 1.52.0 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + keyvaluestorage-interface@1.0.0: {} - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true + kolorist@1.8.0: {} - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true + lightningcss-android-arm64@1.33.0: + optional: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + lightningcss-darwin-arm64@1.33.0: + optional: true - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + lightningcss-darwin-x64@1.33.0: + optional: true - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + lightningcss-freebsd-x64@1.33.0: + optional: true - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + lightningcss-linux-arm64-gnu@1.33.0: + optional: true - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: dependencies: - brace-expansion: 1.1.11 - dev: true + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + optional: true - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + lit-element@4.2.2: dependencies: - brace-expansion: 1.1.11 + '@lit-labs/ssr-dom-shim': 1.6.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.3 - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + lit-html@3.3.3: dependencies: - brace-expansion: 2.0.1 - dev: true + '@types/trusted-types': 2.0.7 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + lit@3.3.0: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + load-tsconfig@0.2.5: {} - /mipd@0.0.7(typescript@5.4.5): - resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + local-pkg@0.5.1: dependencies: - typescript: 5.4.5 + mlly: 1.8.2 + pkg-types: 1.3.1 - /mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - dev: true - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + locate-path@5.0.0: dependencies: - minimist: 1.2.8 + p-locate: 4.1.0 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + lodash.get@4.4.2: {} - /mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 + lodash.isequal@4.5.0: {} + + lodash.startcase@4.4.0: {} - /modern-ahocorasick@1.0.1: - resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} - dev: false + lodash@4.17.23: {} - /motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} + loose-envify@1.4.0: dependencies: - '@motionone/animation': 10.17.0 - '@motionone/dom': 10.17.0 - '@motionone/svelte': 10.16.4 - '@motionone/types': 10.17.0 - '@motionone/utils': 10.17.0 - '@motionone/vue': 10.16.4 + js-tokens: 4.0.0 - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + lru-cache@10.4.3: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + lru-cache@11.5.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 - /multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + magicast@0.3.5: + dependencies: + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + make-dir@4.0.0: + dependencies: + semver: 7.8.5 - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + math-intrinsics@1.1.0: {} - /nocache@3.0.4: - resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} - engines: {node: '>=12.0.0'} + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.29.7 - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + merge-stream@2.0.0: {} - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + merge2@1.4.1: {} - /node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} + micro-ftch@0.3.1: {} - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + micromatch@4.0.8: dependencies: - minimatch: 3.1.2 + braces: 3.0.3 + picomatch: 2.3.2 - /node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + mime-db@1.52.0: {} - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + mime-types@2.1.35: dependencies: - whatwg-url: 5.0.0 - - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true + mime-db: 1.52.0 - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + mimic-fn@4.0.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + minimalistic-assert@1.0.1: {} - /node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} + minimalistic-crypto-utils@1.0.1: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + minimatch@3.0.8: dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true + brace-expansion: 1.1.18 - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.18 - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + minimatch@9.0.9: dependencies: - path-key: 3.1.1 + brace-expansion: 2.1.4 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + mipd@0.0.7(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + mlly@1.8.2: dependencies: - path-key: 4.0.0 + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + modern-ahocorasick@1.1.0: {} - /nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - dev: true + mri@1.2.0: {} - /ob1@0.80.9: - resolution: {integrity: sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==} - engines: {node: '>=18'} + ms@2.1.2: {} - /obj-multiplex@1.0.0: - resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - readable-stream: 2.3.8 + ms@2.1.3: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + muggle-string@0.3.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + multiformats@9.9.0: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + nanoid@3.3.18: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + nanospinner@1.2.2: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true + picocolors: 1.1.1 - /ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + node-addon-api@2.0.2: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.3 + whatwg-url: 5.0.0 - /ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + node-gyp-build@4.8.4: {} - /on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + node-mock-http@1.0.5: {} - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 + node-releases@2.0.55: {} - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + normalize-path@3.0.0: {} + + npm-run-path@5.3.0: dependencies: - ee-first: 1.1.1 + path-key: 4.0.0 - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + nwsapi@2.2.27: + optional: true - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + obj-multiplex@1.0.0: dependencies: - wrappy: 1.0.2 + end-of-stream: 1.4.5 + once: 1.4.0 + readable-stream: 2.3.8 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + ofetch@1.5.1: dependencies: - mimic-fn: 2.1.0 + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 + on-exit-leak-free@0.2.0: {} - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} + once@1.4.0: dependencies: - is-wsl: 1.1.0 + wrappy: 1.0.2 - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + onetime@6.0.0: dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 + mimic-fn: 4.0.0 - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + openapi-fetch@0.13.8: dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 + openapi-typescript-helpers: 0.0.15 - /ora@6.3.1: - resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 1.3.0 - log-symbols: 5.1.0 - stdin-discarder: 0.1.0 - strip-ansi: 7.1.0 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + openapi-typescript-helpers@0.0.15: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true + outdent@0.5.0: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + ox@0.14.44(typescript@5.9.3)(zod@3.22.4): dependencies: - p-map: 2.1.0 - dev: true + '@adraffy/ens-normalize': 1.11.1 + '@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.3.0(typescript@5.9.3)(zod@3.22.4) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + ox@0.14.44(typescript@5.9.3)(zod@3.25.76): dependencies: - p-try: 2.2.0 + '@adraffy/ens-normalize': 1.11.1 + '@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.3.0(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + ox@0.14.44(typescript@5.9.3)(zod@4.4.3): dependencies: - yocto-queue: 0.1.0 + '@adraffy/ens-normalize': 1.11.1 + '@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.3.0(typescript@5.9.3)(zod@4.4.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + ox@0.6.7(typescript@5.9.3)(zod@3.25.76): dependencies: - yocto-queue: 1.0.0 - dev: true + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.3.0(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + ox@0.6.7(typescript@5.9.3)(zod@4.4.3): dependencies: - yocto-queue: 1.0.0 - dev: true + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.3.0(typescript@5.9.3)(zod@4.4.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + ox@0.6.9(typescript@5.9.3)(zod@3.25.76): dependencies: - p-limit: 2.3.0 + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.3.0(typescript@5.9.3)(zod@3.25.76) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + ox@0.6.9(typescript@5.9.3)(zod@4.4.3): dependencies: - p-limit: 2.3.0 + '@adraffy/ens-normalize': 1.11.1 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.3.0(typescript@5.9.3)(zod@4.4.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + ox@0.9.17(typescript@5.9.3)(zod@4.4.3): dependencies: - p-limit: 3.1.0 + '@adraffy/ens-normalize': 1.11.1 + '@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.3.0(typescript@5.9.3)(zod@4.4.3) + eventemitter3: 5.0.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - zod - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-filter@2.1.0: dependencies: - p-limit: 4.0.0 - dev: true - - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + p-map: 2.1.0 - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + p-limit@5.0.0: dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 + yocto-queue: 1.2.2 - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: - '@babel/code-frame': 7.24.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + package-manager-detector@0.2.11: dependencies: - entities: 4.5.0 - dev: true + quansync: 0.2.11 - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + optional: true - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + path-browserify@1.0.1: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@4.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-is-absolute@1.0.1: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-key@3.1.1: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-key@4.0.0: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-parse@1.0.7: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-type@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + pathe@1.1.2: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + pathe@2.0.3: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@1.1.1: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + picocolors@1.1.1: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picomatch@2.3.2: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@3.0.2: {} - /picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} - dev: true + picomatch@4.0.7: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + pify@3.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + pify@4.0.1: {} - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} + pify@5.0.0: {} - /pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@0.5.0: dependencies: duplexify: 4.1.3 split2: 4.2.0 - /pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + pino-std-serializers@4.0.0: {} - /pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} - hasBin: true + pino@7.11.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 @@ -9371,457 +10469,208 @@ packages: process-warning: 1.0.0 quick-format-unescaped: 4.0.4 real-require: 0.1.0 - safe-stable-stringify: 2.4.3 + safe-stable-stringify: 2.5.0 sonic-boom: 2.8.0 thread-stream: 0.15.2 - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - - /pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + pkg-types@1.3.1: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 - /pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} + pngjs@5.0.0: {} - /pony-cause@2.1.11: - resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} - engines: {node: '>=12.0.0'} + pony-cause@2.1.11: {} - /popmotion@11.0.3: - resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} + popmotion@11.0.3: dependencies: framesync: 6.0.1 hey-listen: 1.0.8 style-value-types: 5.0.0 - tslib: 2.7.0 - dev: false - - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + tslib: 2.8.1 + + porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.13.7 + idb-keyval: 6.3.0 + mipd: 0.0.7(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 4.4.3 + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + react: 18.3.1 + typescript: 5.9.3 + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + + porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + hono: 4.13.7 + idb-keyval: 6.3.0 + mipd: 0.0.7(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zod: 4.4.3 + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + react: 18.3.1 + typescript: 5.9.3 + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true + possible-typed-array-names@1.1.0: {} - /preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + postcss-value-parser@4.2.0: {} - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + postcss@8.5.26: dependencies: - find-up: 5.0.0 - find-yarn-workspace-root2: 1.2.16 - path-exists: 4.0.0 - which-pm: 2.0.0 - dev: true - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - dev: true + preact@10.24.2: {} - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} - dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 + prettier@2.8.8: {} - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true + prettier@3.9.6: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.3.1 - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - /process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - dependencies: - asap: 2.0.6 + process-nextick-args@2.0.1: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 + process-warning@1.0.0: {} - /proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + process@0.11.10: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + proxy-compare@2.6.0: {} - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + proxy-from-env@2.1.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + psl@1.15.0: dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode: 2.3.1 + optional: true - /qr-code-styling@1.6.0-rc.1: - resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} + pump@3.0.4: dependencies: - qrcode-generator: 1.4.4 + end-of-stream: 1.4.5 + once: 1.4.0 - /qrcode-generator@1.4.4: - resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + punycode@2.3.1: {} - /qrcode-terminal-nooctal@0.12.1: - resolution: {integrity: sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==} - hasBin: true + qr@0.7.0: {} - /qrcode@1.5.3: - resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} - engines: {node: '>=10.13.0'} - hasBin: true + qrcode@1.5.3: dependencies: dijkstrajs: 1.0.3 encode-utf8: 1.0.3 pngjs: 5.0.0 yargs: 15.4.1 - /qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 pngjs: 5.0.0 yargs: 15.4.1 - dev: false - /query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + quansync@0.2.11: {} + + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 filter-obj: 1.1.0 split-on-first: 1.1.0 strict-uri-encode: 2.0.0 - /querystring@0.2.1: - resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} - engines: {node: '>=0.4.x'} - deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} - dependencies: - inherits: 2.0.4 - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + querystringify@2.2.0: + optional: true - /radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + queue-microtask@1.2.3: {} - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + quick-format-unescaped@4.0.4: {} - /react-devtools-core@5.2.0: - resolution: {integrity: sha512-vZK+/gvxxsieAoAyYaiRIVFxlajb7KXhgBDV7OsoMzaAE+IqGpoxusBjIgq5ibqA2IloKu0p9n7tE68z1xs18A==} - dependencies: - shell-quote: 1.8.1 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + radix3@1.1.2: {} - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - /react-native-webview@11.26.1(react-native@0.74.1)(react@18.3.1): - resolution: {integrity: sha512-hC7BkxOpf+z0UKhxFSFTPAM4shQzYmZHoELa6/8a/MspcjEP7ukYKpuSUTLDywQditT8yI9idfcKvfZDKQExGw==} - peerDependencies: - react: '*' - react-native: '*' - dependencies: - escape-string-regexp: 2.0.0 - invariant: 2.2.4 - react: 18.3.1 - react-native: 0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5)(@types/react@18.3.11)(react@18.3.1) + react-is@16.13.1: {} - /react-native@0.74.1(@babel/core@7.24.5)(@babel/preset-env@7.24.5)(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-0H2XpmghwOtfPpM2LKqHIN7gxy+7G/r1hwJHKLV6uoyXGC/gCojRtoo5NqyKrWpFC8cqyT6wTYCLuG7CxEKilg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@types/react': ^18.2.6 - react: 18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@jest/create-cache-key-function': 29.7.0 - '@react-native-community/cli': 13.6.6 - '@react-native-community/cli-platform-android': 13.6.6 - '@react-native-community/cli-platform-ios': 13.6.6 - '@react-native/assets-registry': 0.74.83 - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5) - '@react-native/community-cli-plugin': 0.74.83(@babel/core@7.24.5)(@babel/preset-env@7.24.5) - '@react-native/gradle-plugin': 0.74.83 - '@react-native/js-polyfills': 0.74.83 - '@react-native/normalize-colors': 0.74.83 - '@react-native/virtualized-lists': 0.74.83(@types/react@18.3.11)(react-native@0.74.1)(react@18.3.1) - '@types/react': 18.3.11 - abort-controller: 3.0.0 - anser: 1.4.10 - ansi-regex: 5.0.1 - base64-js: 1.5.1 - chalk: 4.1.2 - event-target-shim: 5.0.1 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - jest-environment-node: 29.7.0 - jsc-android: 250231.0.0 - memoize-one: 5.2.1 - metro-runtime: 0.80.9 - metro-source-map: 0.80.9 - mkdirp: 0.5.6 - nullthrows: 1.1.1 - pretty-format: 26.6.2 - promise: 8.3.0 - react: 18.3.1 - react-devtools-core: 5.2.0 - react-refresh: 0.14.2 - react-shallow-renderer: 16.15.0(react@18.3.1) - regenerator-runtime: 0.13.11 - scheduler: 0.24.0-canary-efb381bbf-20230505 - stacktrace-parser: 0.1.10 - whatwg-fetch: 3.6.20 - ws: 6.2.2 - yargs: 17.7.2 - transitivePeerDependencies: - - '@babel/core' - - '@babel/preset-env' - - bufferutil - - encoding - - supports-color - - utf-8-validate + react-is@18.3.1: {} - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} + react-is@19.3.0: {} - /react-remove-scroll-bar@2.3.6(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.3.2 - react: 18.3.1 - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.7.0 - dev: false + react-refresh@0.17.0: {} - /react-remove-scroll@2.6.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@18.3.1): dependencies: - '@types/react': 18.3.2 react: 18.3.1 - react-remove-scroll-bar: 2.3.6(@types/react@18.3.2)(react@18.3.1) - react-style-singleton: 2.2.1(@types/react@18.3.2)(react@18.3.1) - tslib: 2.7.0 - use-callback-ref: 1.3.2(@types/react@18.3.2)(react@18.3.1) - use-sidecar: 1.1.2(@types/react@18.3.2)(react@18.3.1) - dev: false + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 - /react-shallow-renderer@16.15.0(react@18.3.1): - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-remove-scroll@2.7.2(@types/react@18.3.31)(react@18.3.1): dependencies: - object-assign: 4.1.1 react: 18.3.1 - react-is: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.31)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.31)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.31)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 - /react-style-singleton@2.2.1(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + react-style-singleton@2.2.3(@types/react@18.3.31)(react@18.3.1): dependencies: - '@types/react': 18.3.2 get-nonce: 1.0.1 - invariant: 2.2.4 react: 18.3.1 - tslib: 2.7.0 - dev: false + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 - /react-transition-state@1.1.5(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ITY2mZqc2dWG2eitJkYNdcSFW8aKeOlkL2A/vowRrLL8GH3J6Re/SpD/BLvQzrVOTqjsP0b5S9N10vgNNzwMUQ==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react-transition-state@1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - /react-use-measure@2.1.1(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} - peerDependencies: - react: '>=16.13' - react-dom: '>=16.13' + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - debounce: 1.2.1 react: 18.3.1 + optionalDependencies: react-dom: 18.3.1(react@18.3.1) - dev: false - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.15.2 pify: 4.0.1 strip-bom: 3.0.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9831,1566 +10680,679 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - - /real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} - engines: {node: '>= 12.13.0'} - - /recast@0.21.5: - resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} - engines: {node: '>= 4'} - dependencies: - ast-types: 0.15.2 - esprima: 4.0.1 - source-map: 0.6.1 - tslib: 2.7.0 - - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + readdirp@4.1.2: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + readdirp@5.1.1: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + real-require@0.1.0: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - dependencies: - '@babel/runtime': 7.24.5 - - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - dev: true - - /regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - dependencies: - '@babel/regjsgen': 0.8.0 - regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true - dependencies: - jsesc: 0.5.0 - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + require-directory@2.1.1: {} - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + require-main-filename@2.0.0: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false + requires-port@1.0.0: {} - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} + resize-observer-polyfill@1.5.1: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolve@1.19.0: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.16.2 path-parse: 1.0.7 - dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.12: dependencies: - is-core-module: 2.13.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 + reusify@1.1.0: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rolldown@1.2.5: dependencies: - glob: 7.2.3 + '@oxc-project/types': 0.146.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.5 + '@rolldown/binding-android-arm64': 1.2.5 + '@rolldown/binding-darwin-arm64': 1.2.5 + '@rolldown/binding-darwin-x64': 1.2.5 + '@rolldown/binding-freebsd-x64': 1.2.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 + '@rolldown/binding-linux-arm64-gnu': 1.2.5 + '@rolldown/binding-linux-arm64-musl': 1.2.5 + '@rolldown/binding-linux-ppc64-gnu': 1.2.5 + '@rolldown/binding-linux-s390x-gnu': 1.2.5 + '@rolldown/binding-linux-x64-gnu': 1.2.5 + '@rolldown/binding-linux-x64-musl': 1.2.5 + '@rolldown/binding-openharmony-arm64': 1.2.5 + '@rolldown/binding-win32-arm64-msvc': 1.2.5 + '@rolldown/binding-win32-x64-msvc': 1.2.5 + optional: true - /rollup-plugin-visualizer@5.12.0: - resolution: {integrity: sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rollup: - optional: true + rollup-plugin-visualizer@5.14.0(rolldown@1.2.5)(rollup@4.63.0): dependencies: open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 - yargs: 17.7.2 - - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + picomatch: 4.0.7 + source-map: 0.7.6 + yargs: 17.7.3 optionalDependencies: - fsevents: 2.3.3 - dev: true + rolldown: 1.2.5 + rollup: 4.63.0 - /rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - dependencies: - '@types/estree': 1.0.5 + rollup@3.30.0: optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.17.2 - '@rollup/rollup-android-arm64': 4.17.2 - '@rollup/rollup-darwin-arm64': 4.17.2 - '@rollup/rollup-darwin-x64': 4.17.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 - '@rollup/rollup-linux-arm-musleabihf': 4.17.2 - '@rollup/rollup-linux-arm64-gnu': 4.17.2 - '@rollup/rollup-linux-arm64-musl': 4.17.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 - '@rollup/rollup-linux-riscv64-gnu': 4.17.2 - '@rollup/rollup-linux-s390x-gnu': 4.17.2 - '@rollup/rollup-linux-x64-gnu': 4.17.2 - '@rollup/rollup-linux-x64-musl': 4.17.2 - '@rollup/rollup-win32-arm64-msvc': 4.17.2 - '@rollup/rollup-win32-ia32-msvc': 4.17.2 - '@rollup/rollup-win32-x64-msvc': 4.17.2 fsevents: 2.3.3 - dev: true - /rpc-websockets@7.11.0: - resolution: {integrity: sha512-IkLYjayPv6Io8C/TdCL5gwgzd1hFz2vmBZrjMw/SPEXo51ETOhnzgS4Qy5GWi2JQN7HKHa66J3+2mv0fgNh/7w==} + rollup@4.63.0: dependencies: - eventemitter3: 4.0.7 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@types/estree': 1.0.9 optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - dev: false + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.0 + '@rollup/rollup-android-arm64': 4.63.0 + '@rollup/rollup-darwin-arm64': 4.63.0 + '@rollup/rollup-darwin-x64': 4.63.0 + '@rollup/rollup-freebsd-arm64': 4.63.0 + '@rollup/rollup-freebsd-x64': 4.63.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.0 + '@rollup/rollup-linux-arm-musleabihf': 4.63.0 + '@rollup/rollup-linux-arm64-gnu': 4.63.0 + '@rollup/rollup-linux-arm64-musl': 4.63.0 + '@rollup/rollup-linux-loong64-gnu': 4.63.0 + '@rollup/rollup-linux-loong64-musl': 4.63.0 + '@rollup/rollup-linux-ppc64-gnu': 4.63.0 + '@rollup/rollup-linux-ppc64-musl': 4.63.0 + '@rollup/rollup-linux-riscv64-gnu': 4.63.0 + '@rollup/rollup-linux-riscv64-musl': 4.63.0 + '@rollup/rollup-linux-s390x-gnu': 4.63.0 + '@rollup/rollup-linux-x64-gnu': 4.63.0 + '@rollup/rollup-linux-x64-musl': 4.63.0 + '@rollup/rollup-openbsd-x64': 4.63.0 + '@rollup/rollup-openharmony-arm64': 4.63.0 + '@rollup/rollup-win32-arm64-msvc': 4.63.0 + '@rollup/rollup-win32-ia32-msvc': 4.63.0 + '@rollup/rollup-win32-x64-gnu': 4.63.0 + '@rollup/rollup-win32-x64-msvc': 4.63.0 + fsevents: 2.3.3 - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true + rrweb-cssom@0.7.1: + optional: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 + rrweb-cssom@0.8.0: + optional: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + run-parallel@1.2.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true + queue-microtask: 1.2.3 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true + is-regex: 1.2.1 - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} + safe-stable-stringify@2.5.0: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + saxes@6.0.0: dependencies: xmlchars: 2.2.0 - dev: true - - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - dependencies: - loose-envify: 1.4.0 + optional: true - /scheduler@0.24.0-canary-efb381bbf-20230505: - resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - /secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} - requiresBuild: true - dependencies: - elliptic: 6.5.5 - node-addon-api: 5.1.0 - node-gyp-build: 4.8.1 - - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + scrypt-js@3.0.1: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - /send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - /serialize-error@2.1.0: - resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} - engines: {node: '>=0.10.0'} - - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color + semver@7.8.5: {} - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 + get-intrinsic: 1.3.0 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - dev: true - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + sha.js@2.4.12: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 + to-buffer: 1.2.2 - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true + shallowequal@1.1.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + shebang-regex@3.0.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + siginfo@2.0.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + signal-exit@3.0.7: {} - /slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 + signal-exit@4.1.0: {} - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - dev: true + slash@3.0.0: {} - /socket.io-client@4.7.5: - resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} - engines: {node: '>=10.0.0'} + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@5.5.0) - engine.io-client: 6.5.3 - socket.io-parser: 4.2.4 + debug: 4.4.3(supports-color@5.5.0) + engine.io-client: 6.6.6(bufferutil@4.1.0)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.7 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - /socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} + socket.io-parser@4.2.7: dependencies: '@socket.io/component-emitter': 3.1.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - /sonic-boom@2.8.0: - resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - dev: true - - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true - - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 - dev: true - - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - dev: true - - /split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} + source-map-js@1.2.1: {} - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true + source-map@0.6.1: {} - /stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + source-map@0.7.6: {} - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + spawndamnit@3.0.1: dependencies: - type-fest: 0.7.1 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + split-on-first@1.1.0: {} - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + split2@4.2.0: {} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + sprintf-js@1.0.3: {} - /stdin-discarder@0.1.0: - resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - bl: 5.1.0 - dev: true + stackback@0.0.2: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + std-env@3.10.0: {} - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - dependencies: - mixme: 0.5.10 - dev: true + stream-shift@1.0.3: {} - /strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} + strict-uri-encode@2.0.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - dev: true - - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true - - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - dependencies: - ansi-regex: 4.1.1 - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + strip-bom@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true + strip-final-newline@3.0.0: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.1.1: dependencies: - js-tokens: 9.0.0 - dev: true + js-tokens: 9.0.1 - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} - - /style-value-types@5.0.0: - resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} + style-value-types@5.0.0: dependencies: hey-listen: 1.0.8 - tslib: 2.7.0 - dev: false + tslib: 2.8.1 - /styled-components@5.3.11(@babel/core@7.24.5)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' + styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/traverse': 7.24.5(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.2.2 + '@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) + '@babel/traverse': 7.29.8(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.4.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.24.5)(styled-components@5.3.11) + babel-plugin-styled-components: 2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 + react-is: 19.3.0 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: - '@babel/core' - dev: false - - /sudo-prompt@9.2.1: - resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - - /superstruct@0.14.2: - resolution: {integrity: sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==} - dev: false - /superstruct@1.0.4: - resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} - engines: {node: '>=14.0.0'} + superstruct@1.0.4: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - - /system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} - - /temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} - dependencies: - rimraf: 2.6.3 - - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: true - - /terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - dev: false - - /thread-stream@0.15.2: - resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} - dependencies: - real-require: 0.1.0 - - /throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false - - /tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - dev: true - - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true - - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - /tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} - dependencies: - punycode: 2.3.1 - dev: true - - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + supports-preserve-symlinks-flag@1.0.0: {} - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true + symbol-tree@3.2.4: + optional: true - /tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + term-size@2.2.1: {} - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true + test-exclude@6.0.0: dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - dev: true + '@istanbuljs/schema': 0.1.6 + glob: 7.2.3 + minimatch: 3.1.5 - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + thread-stream@0.15.2: + dependencies: + real-require: 0.1.0 - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true + tiny-invariant@1.3.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + tinybench@2.9.0: {} - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} + tinypool@0.8.4: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + tinyspy@2.2.1: {} - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + to-buffer@1.2.2: dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + to-regex-range@5.0.1: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true + is-number: 7.0.0 - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - dev: true - - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + tough-cookie@4.1.4: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - dev: true - - /typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + optional: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true + tr46@0.0.3: {} - /typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + optional: true - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - dev: false + tslib@1.14.1: {} - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + tslib@2.7.0: {} - /uint8arrays@3.1.0: - resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} - dependencies: - multiformats: 9.9.0 + tslib@2.8.1: {} - /uint8arrays@3.1.1: - resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} - dependencies: - multiformats: 9.9.0 + type-detect@4.1.0: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + typescript@5.4.2: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + typescript@5.9.3: {} - /undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + ua-is-frozen@0.1.2: {} - /unenv@1.9.0: - resolution: {integrity: sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==} + ua-parser-js@2.0.10: dependencies: - consola: 3.2.3 - defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 - pathe: 1.1.2 + detect-europe-js: 0.1.2 + is-standalone-pwa: 0.1.1 + ua-is-frozen: 0.1.2 - /unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + ufo@1.6.4: {} - /unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + uint8arrays@3.1.0: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 + multiformats: 9.9.0 - /unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + uncrypto@0.1.3: {} - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + undici-types@6.19.8: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + undici-types@7.29.1: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + undici-types@8.3.0: + optional: true - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@0.1.2: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + universalify@0.2.0: + optional: true - /unstorage@1.10.2(idb-keyval@6.2.1): - resolution: {integrity: sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==} - peerDependencies: - '@azure/app-configuration': ^1.5.0 - '@azure/cosmos': ^4.0.0 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.0.1 - '@azure/keyvault-secrets': ^4.8.0 - '@azure/storage-blob': ^12.17.0 - '@capacitor/preferences': ^5.0.7 - '@netlify/blobs': ^6.5.0 || ^7.0.0 - '@planetscale/database': ^1.16.0 - '@upstash/redis': ^1.28.4 - '@vercel/kv': ^1.0.1 - idb-keyval: ^6.2.1 - ioredis: ^5.3.2 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - ioredis: - optional: true + unstorage@1.17.5(idb-keyval@6.3.0): dependencies: anymatch: 3.1.3 - chokidar: 3.6.0 - destr: 2.0.3 - h3: 1.11.1 - idb-keyval: 6.2.1 - listhen: 1.7.2 - lru-cache: 10.4.3 - mri: 1.2.0 - node-fetch-native: 1.6.4 - ofetch: 1.3.4 - ufo: 1.5.3 - transitivePeerDependencies: - - uWebSockets.js - - /untun@0.1.3: - resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} - hasBin: true - dependencies: - citty: 0.1.6 - consola: 3.2.3 - pathe: 1.1.2 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.5.2 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + optionalDependencies: + idb-keyval: 6.3.0 - /update-browserslist-db@1.0.16(browserslist@4.23.0): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.3.3(browserslist@4.28.9): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.1 - - /uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + browserslist: 4.28.9 + escalade: 3.2.0 + picocolors: 1.1.1 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 - dev: true + optional: true - /use-callback-ref@1.3.2(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-callback-ref@1.3.3(@types/react@18.3.31)(react@18.3.1): dependencies: - '@types/react': 18.3.2 react: 18.3.1 - tslib: 2.7.0 - dev: false + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 - /use-sidecar@1.1.2(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true + use-sidecar@1.1.3(@types/react@18.3.31)(react@18.3.1): dependencies: - '@types/react': 18.3.2 detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.7.0 - dev: false + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.31 - /use-sync-external-store@1.2.0(react@18.3.1): - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.0(react@18.3.1): dependencies: react: 18.3.1 - /utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - requiresBuild: true + use-sync-external-store@1.4.0(react@18.3.1): dependencies: - node-gyp-build: 4.8.1 + react: 18.3.1 - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + util-deprecate@1.0.2: {} + + util@0.12.5: dependencies: inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.22 - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + uuid@8.3.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + uuid@9.0.1: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true + validator@13.15.35: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + valtio@1.13.2(@types/react@18.3.31)(react@18.3.1): dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true + derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)) + proxy-compare: 2.6.0 + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.31 + react: 18.3.1 - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true - - /validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - dev: true + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.9.3)(zod@3.25.76) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /valtio@1.11.2(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): dependencies: - '@types/react': 18.3.11 - proxy-compare: 2.5.1 - react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) - dev: true + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@scure/bip32': 1.6.2 + '@scure/bip39': 1.5.4 + abitype: 1.0.8(typescript@5.9.3)(zod@4.4.3) + isows: 1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.6.7(typescript@5.9.3)(zod@4.4.3) + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /valtio@1.11.2(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true + viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: - '@types/react': 18.3.2 - proxy-compare: 2.5.1 - react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) - dev: false + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) + isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.14.44(typescript@5.9.3)(zod@3.22.4) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) + isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.14.44(typescript@5.9.3)(zod@3.25.76) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod - /viem@2.21.32(typescript@5.4.5)(zod@3.23.8): - resolution: {integrity: sha512-2oXt5JNIb683oy7C8wuIJ/SeL3XtHVMEQpy1U2TA6WMnJQ4ScssRvyPwYLcaP6mKlrGXE/cR/V7ncWpvLUVPYQ==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): dependencies: - '@adraffy/ens-normalize': 1.11.0 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - '@scure/bip32': 1.5.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.6(typescript@5.4.5)(zod@3.23.8) - isows: 1.0.6(ws@8.18.0) - typescript: 5.4.5 - webauthn-p256: 0.0.10 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) + isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + ox: 0.14.44(typescript@5.9.3)(zod@4.4.3) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - /vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vite-node@1.6.1(@types/node@26.3.0)(lightningcss@1.33.0): dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.2.11 + picocolors: 1.1.1 + vite: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - /vite-plugin-dts@3.9.1(typescript@5.4.5)(vite@4.5.3): - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true + vite-plugin-dts@3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)): dependencies: - '@microsoft/api-extractor': 7.43.0 - '@rollup/pluginutils': 5.1.0 - '@vue/language-core': 1.8.27(typescript@5.4.5) - debug: 4.3.4(supports-color@5.5.0) + '@microsoft/api-extractor': 7.43.0(@types/node@26.3.0) + '@rollup/pluginutils': 5.4.0(rollup@4.63.0) + '@vue/language-core': 1.8.27(typescript@5.9.3) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 - magic-string: 0.30.10 - typescript: 5.4.5 - vite: 4.5.3 - vue-tsc: 1.8.27(typescript@5.4.5) + magic-string: 0.30.21 + typescript: 5.9.3 + vue-tsc: 1.8.27(typescript@5.9.3) + optionalDependencies: + vite: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - dev: true - - /vite@4.5.3: - resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.18.20 - postcss: 8.4.38 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /vite@5.2.11: - resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + + vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 + esbuild: 0.18.20 + postcss: 8.5.26 + rollup: 3.30.0 optionalDependencies: + '@types/node': 26.3.0 fsevents: 2.3.3 - dev: true + lightningcss: 1.33.0 - /vitest@1.6.0(jsdom@24.0.0): - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4(supports-color@5.5.0) + esbuild: 0.21.5 + postcss: 8.5.26 + rollup: 4.63.0 + optionalDependencies: + '@types/node': 26.3.0 + fsevents: 2.3.3 + lightningcss: 1.33.0 + + vitest@1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0): + dependencies: + '@vitest/expect': 1.6.1 + '@vitest/runner': 1.6.1 + '@vitest/snapshot': 1.6.1 + '@vitest/spy': 1.6.1 + '@vitest/utils': 1.6.1 + acorn-walk: 8.3.5 + chai: 4.5.0 + debug: 4.4.3(supports-color@5.5.0) execa: 8.0.1 - jsdom: 24.0.0 - local-pkg: 0.5.0 - magic-string: 0.30.10 + local-pkg: 0.5.1 + magic-string: 0.30.21 pathe: 1.1.2 - picocolors: 1.0.1 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 + picocolors: 1.1.1 + std-env: 3.10.0 + strip-literal: 2.1.1 + tinybench: 2.9.0 tinypool: 0.8.4 - vite: 5.2.11 - vite-node: 1.6.0 - why-is-node-running: 2.2.2 + vite: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) + vite-node: 1.6.1(@types/node@26.3.0)(lightningcss@1.33.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 26.3.0 + jsdom: 24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) transitivePeerDependencies: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - dev: true - - /vlq@1.0.1: - resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} - /vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 he: 1.2.0 - dev: true - /vue-tsc@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' + vue-tsc@1.8.27(typescript@5.9.3): dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.4.5) - semver: 7.6.2 - typescript: 5.4.5 - dev: true + '@vue/language-core': 1.8.27(typescript@5.9.3) + semver: 7.8.5 + typescript: 5.9.3 - /w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - dev: true + optional: true - /wagmi@2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.11)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-U7UCQQL38ed2AaAMFwfSYjSFW94CwAbf/+ntaG43z1U5i8jdrxh85tP7rcpMWgnd7510/S3Gje0m7uTIS3iYFw==} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: '>=18' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true + wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): dependencies: - '@tanstack/react-query': 5.59.15(react@18.3.1) - '@wagmi/connectors': 5.2.2(@types/react@18.3.11)(@wagmi/core@2.13.9)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - '@wagmi/core': 2.13.9(@types/react@18.3.11)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 18.3.1 - typescript: 5.4.5 - use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11399,44 +11361,47 @@ packages: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@tanstack/query-core' - '@types/react' - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch - bufferutil + - db0 + - debug - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder - immer - ioredis - - react-dom - react-native - - rollup - supports-color - - uWebSockets.js + - uploadthing - utf-8-validate - zod - dev: true - /wagmi@2.12.20(@tanstack/react-query@5.59.15)(@types/react@18.3.2)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32): - resolution: {integrity: sha512-U7UCQQL38ed2AaAMFwfSYjSFW94CwAbf/+ntaG43z1U5i8jdrxh85tP7rcpMWgnd7510/S3Gje0m7uTIS3iYFw==} - peerDependencies: - '@tanstack/react-query': '>=5.0.0' - react: '>=18' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - typescript: - optional: true + wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3): dependencies: - '@tanstack/react-query': 5.59.15(react@18.3.1) - '@wagmi/connectors': 5.2.2(@types/react@18.3.2)(@wagmi/core@2.13.9)(react-dom@18.3.1)(react-native@0.74.1)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) - '@wagmi/core': 2.13.9(@types/react@18.3.2)(react@18.3.1)(typescript@5.4.5)(viem@2.21.32) + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) react: 18.3.1 - typescript: 5.4.5 - use-sync-external-store: 1.2.0(react@18.3.1) - viem: 2.21.32(typescript@5.4.5)(zod@3.23.8) + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -11445,324 +11410,144 @@ packages: - '@azure/keyvault-secrets' - '@azure/storage-blob' - '@capacitor/preferences' + - '@deno/kv' - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' - '@tanstack/query-core' - '@types/react' - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch - bufferutil + - db0 + - debug - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder - immer - ioredis - - react-dom - react-native - - rollup - supports-color - - uWebSockets.js + - uploadthing - utf-8-validate - zod - dev: false - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.4 - - /webauthn-p256@0.0.10: - resolution: {integrity: sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA==} - dependencies: - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 - /webextension-polyfill@0.10.0: - resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + webextension-polyfill@0.10.0: {} - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: true + webidl-conversions@7.0.0: + optional: true - /whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 - dev: true - - /whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + optional: true - /whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - dev: true + whatwg-mimetype@4.0.0: + optional: true - /whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + whatwg-url@14.2.0: dependencies: - tr46: 5.0.0 + tr46: 5.1.1 webidl-conversions: 7.0.0 - dev: true + optional: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} - dependencies: - load-yaml-file: 0.2.0 - path-exists: 4.0.0 - dev: true + which-module@2.0.1: {} - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - dev: true - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - /ws@6.2.2: - resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - async-limiter: 1.0.1 - - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /ws@8.11.0: - resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false + wrappy@1.0.2: {} - /ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dependencies: - bufferutil: 4.0.8 + ws@7.5.13(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 utf-8-validate: 5.0.10 - /ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 - /xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - dev: true + ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true + ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 5.0.10 - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} + xml-name-validator@5.0.0: + optional: true - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xmlchars@2.2.0: + optional: true - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + xmlhttprequest-ssl@2.1.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + xtend@4.0.2: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true + y18n@4.0.3: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + y18n@5.0.8: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@3.1.1: {} - /yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true + yallist@4.0.0: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -11776,91 +11561,40 @@ packages: y18n: 4.0.3 yargs-parser: 18.1.3 - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.3: dependencies: cliui: 8.0.1 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.2.2: {} - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true + z-schema@5.0.5: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 - validator: 13.12.0 + validator: 13.15.35 optionalDependencies: commander: 9.5.0 - dev: true - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + zod@3.22.4: {} - /zustand@4.4.1(@types/react@18.3.11)(react@18.3.1): - resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - '@types/react': 18.3.11 + zod@3.25.76: {} + + zod@4.4.3: {} + + zustand@5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.31 react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) - dev: true + use-sync-external-store: 1.4.0(react@18.3.1) - /zustand@4.4.1(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - dependencies: - '@types/react': 18.3.2 + zustand@5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)): + optionalDependencies: + '@types/react': 18.3.31 react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) - dev: false + use-sync-external-store: 1.4.0(react@18.3.1) diff --git a/scripts/validate-package-contents.mjs b/scripts/validate-package-contents.mjs new file mode 100755 index 0000000..c0d7dd7 --- /dev/null +++ b/scripts/validate-package-contents.mjs @@ -0,0 +1,94 @@ +#!/usr/bin/env node +// Validates what each publishable package would actually ship to npm. +// +// Runs `npm pack --dry-run --json` per package and asserts that nothing +// development-only is included. Also prints packed/unpacked sizes so +// regressions are visible in CI logs. + +import { execFileSync } from "node:child_process" +import { readFileSync } from "node:fs" +import { dirname, resolve } from "node:path" +import { fileURLToPath } from "node:url" + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..") + +const PACKAGES = ["packages/sdk", "packages/ethers"] + +/** Patterns that must never appear in a published tarball. */ +const FORBIDDEN = [ + { label: "bundle analysis output", re: /stats\.html$|\/analysis\// }, + { label: "test files", re: /(^|\/)(test|tests|__tests__)\//i }, + { label: "test/spec modules", re: /\.(test|spec|test-d)\.[cm]?[jt]sx?$/ }, + { label: "coverage output", re: /(^|\/)coverage\// }, + { label: "example apps", re: /(^|\/)examples?\// }, + { label: "env files", re: /(^|\/)\.env/ }, + { label: "source maps of tests", re: /\.(test|spec)\.[cm]?[jt]s\.map$/ }, + { + label: "tsconfig/build config", + re: /(^|\/)(tsconfig.*\.json|vite\.config\.[jt]s|vitest\.config\.[jt]s|wagmi\.config\.[jt]s|biome\.json)$/, + }, + { label: "wagmi codegen output", re: /wagmi-cli-hooks/ }, + { label: "raw TypeScript sources", re: /\.tsx?$/, allow: /\.d\.ts$/ }, + { label: "editor/OS cruft", re: /(^|\/)(\.DS_Store|\.vscode|\.idea)(\/|$)/ }, +] + +let failed = false +const summary = [] + +for (const pkgDir of PACKAGES) { + const cwd = resolve(ROOT, pkgDir) + const pkgName = JSON.parse( + readFileSync(resolve(cwd, "package.json"), "utf8"), + ).name + + const raw = execFileSync("npm", ["pack", "--dry-run", "--json"], { + cwd, + encoding: "utf8", + stdio: ["ignore", "pipe", "pipe"], + }) + + const [result] = JSON.parse(raw) + const files = result.files.map((f) => f.path) + + const violations = [] + for (const { label, re, allow } of FORBIDDEN) { + for (const file of files) { + if (allow?.test(file)) continue + if (re.test(file)) violations.push(`${label}: ${file}`) + } + } + + // Every package must ship its metadata and a readme. + if (!files.includes("package.json")) violations.push("missing package.json") + if (!files.some((f) => /^readme(\.md)?$/i.test(f))) { + violations.push("missing README") + } + + const packedKB = (result.size / 1000).toFixed(1) + const unpackedKB = (result.unpackedSize / 1000).toFixed(1) + + summary.push({ + pkgName, + files: files.length, + packedKB, + unpackedKB, + }) + + if (violations.length) { + failed = true + console.error(`\n✗ ${pkgName} would publish disallowed files:`) + for (const v of violations) console.error(` ${v}`) + } else { + console.log(`✓ ${pkgName}: ${files.length} files, ${packedKB} kB packed`) + } +} + +console.log("\nPackage size report") +console.table(summary) + +if (failed) { + console.error("\nPackage content validation failed.") + process.exit(1) +} + +console.log("\nAll packages validated.") diff --git a/tsconfig.json b/tsconfig.json index a439461..7bd949a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "useDefineForClassFields": true, "module": "ESNext", "lib": ["ESNext", "DOM"], - "moduleResolution": "Node", + "moduleResolution": "Bundler", "strict": true, "jsx": "preserve", "resolveJsonModule": true, From 3cb448b57a66a5d8a5d808fa693a95899df83008 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 16 Sep 2026 19:43:44 -0700 Subject: [PATCH 02/30] viem + ethers separation + tests --- MIGRATION.md | 38 + README.md | 44 +- .../vite-wagmi-ethers-rainbowkit/.env.example | 2 - .../vite-wagmi-ethers-rainbowkit/CHANGELOG.md | 70 -- .../vite-wagmi-ethers-rainbowkit/README.md | 22 - .../vite-wagmi-ethers-rainbowkit/src/App.tsx | 123 -- .../src/components/Account.tsx | 13 - .../src/components/index.ts | 1 - .../src/hooks/index.ts | 1 - .../src/hooks/useEthersSigner.ts | 30 - .../vite-wagmi-ethers-rainbowkit/src/main.tsx | 36 - .../src/vite-env.d.ts | 1 - .../tsconfig.json | 20 - .../vite.config.ts | 21 - examples/vite-wagmi-ethers/.env.example | 3 +- examples/vite-wagmi-ethers/polyfills.ts | 4 +- examples/vite-wagmi-ethers/src/App.tsx | 9 +- .../src/components/Account.tsx | 18 +- .../vite-wagmi-ethers/src/components/index.ts | 2 +- examples/vite-wagmi-ethers/src/hooks/index.ts | 2 +- .../src/hooks/useEthersSigner.ts | 40 +- examples/vite-wagmi-ethers/src/main.tsx | 3 +- examples/vite-wagmi-ethers/src/vite-env.d.ts | 10 + examples/vite-wagmi-ethers/src/wagmi.ts | 27 +- examples/vite-wagmi-ethers/tsconfig.json | 36 +- examples/vite-wagmi-ethers/vite.config.ts | 36 +- examples/vite-wagmi-ethers6/.env.example | 3 +- examples/vite-wagmi-ethers6/polyfills.ts | 4 +- examples/vite-wagmi-ethers6/src/App.tsx | 10 +- .../src/components/Account.tsx | 18 +- .../src/components/index.ts | 2 +- .../vite-wagmi-ethers6/src/hooks/index.ts | 2 +- .../src/hooks/useEthers6Signer.ts | 46 +- examples/vite-wagmi-ethers6/src/main.tsx | 6 +- examples/vite-wagmi-ethers6/src/vite-env.d.ts | 10 + examples/vite-wagmi-ethers6/tsconfig.json | 36 +- examples/vite-wagmi-ethers6/vite.config.ts | 36 +- examples/vite-wagmi-viem/.env.example | 3 +- examples/vite-wagmi-viem/polyfills.ts | 4 +- examples/vite-wagmi-viem/src/App.tsx | 40 +- .../src/components/Account.tsx | 18 +- .../vite-wagmi-viem/src/components/index.ts | 2 +- examples/vite-wagmi-viem/src/main.tsx | 25 +- examples/vite-wagmi-viem/src/vite-env.d.ts | 10 + examples/vite-wagmi-viem/tsconfig.json | 36 +- examples/vite-wagmi-viem/vite.config.ts | 36 +- examples/vite-wagmi3-viem/.env.example | 2 + .../.gitignore | 0 .../.npmrc | 0 examples/vite-wagmi3-viem/README.md | 22 + .../index.html | 2 +- .../package.json | 11 +- .../polyfills.ts | 4 +- examples/vite-wagmi3-viem/src/App.tsx | 157 +++ .../src/components/Account.tsx | 13 + .../src/components/ConnectWallet.tsx | 37 + .../vite-wagmi3-viem/src/components/index.ts | 2 + examples/vite-wagmi3-viem/src/main.tsx | 50 + examples/vite-wagmi3-viem/src/vite-env.d.ts | 11 + examples/vite-wagmi3-viem/tsconfig.json | 20 + examples/vite-wagmi3-viem/vite.config.ts | 21 + package.json | 9 +- packages/ethers/README.md | 24 + packages/ethers/package.json | 17 +- packages/ethers/src/TokenboundClient.ts | 151 +-- packages/ethers/src/adapter.ts | 44 +- packages/ethers/src/index.ts | 3 + .../ethers/src/test/TestAllEthers.test.ts | 1020 +++++++++++++++++ .../{v2.test.ts => TestAllEthersV2.test.ts} | 72 +- ...ter.test.ts => TestEthersVersions.test.ts} | 49 + .../src/test/TestSharedFixtures.test.ts | 29 + packages/ethers/src/test/constants.ts | 17 - packages/ethers/src/test/integration.test.ts | 317 ----- packages/ethers/src/test/transfer.test.ts | 175 --- packages/ethers/vite.config.ts | 2 +- packages/sdk/README.md | 130 ++- packages/sdk/package.json | 7 +- packages/sdk/src/TokenboundClient.ts | 99 +- packages/sdk/src/index.ts | 1 + .../{TestAll.test.ts => TestAllViem.test.ts} | 121 +- packages/sdk/src/test/config/anvil.ts | 15 - packages/sdk/src/test/config/base.ts | 7 - packages/sdk/src/test/config/index.ts | 3 - packages/sdk/src/test/config/mints.ts | 27 - packages/sdk/src/test/constants/addresses.ts | 5 - packages/sdk/src/test/constants/anvil.ts | 53 - packages/sdk/src/test/constants/index.ts | 3 - packages/sdk/src/test/constants/regexes.ts | 1 - packages/sdk/src/test/types/index.ts | 1 - packages/sdk/src/test/types/testers.ts | 7 - .../sdk/src/test/unit/isAddressMatch.test.ts | 43 + packages/sdk/src/test/unit/protocol.test.ts | 3 +- packages/sdk/src/test/utils/clients.ts | 2 +- packages/sdk/src/test/utils/debug.ts | 27 - packages/sdk/src/test/utils/getWETHBalance.ts | 2 +- .../sdk/src/test/utils/getZora1155Balance.ts | 5 +- .../sdk/src/test/utils/getZora721Balance.ts | 5 +- packages/sdk/src/test/utils/index.ts | 1 - packages/sdk/vite.config.ts | 2 +- packages/sdk/wagmi.config.ts | 4 +- packages/test-fixtures/package.json | 16 + packages/test-fixtures/src/anvil.ts | 37 + packages/test-fixtures/src/fixtures.ts | 120 ++ .../src}/generated.ts | 0 packages/test-fixtures/src/index.ts | 12 + packages/test-fixtures/src/mints.ts | 48 + pnpm-lock.yaml | 795 +++++++------ 107 files changed, 2836 insertions(+), 2006 deletions(-) delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/.env.example delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/CHANGELOG.md delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/README.md delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/App.tsx delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/components/Account.tsx delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/components/index.ts delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/hooks/index.ts delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/hooks/useEthersSigner.ts delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/main.tsx delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/src/vite-env.d.ts delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/tsconfig.json delete mode 100644 examples/vite-wagmi-ethers-rainbowkit/vite.config.ts create mode 100644 examples/vite-wagmi3-viem/.env.example rename examples/{vite-wagmi-ethers-rainbowkit => vite-wagmi3-viem}/.gitignore (100%) rename examples/{vite-wagmi-ethers-rainbowkit => vite-wagmi3-viem}/.npmrc (100%) create mode 100644 examples/vite-wagmi3-viem/README.md rename examples/{vite-wagmi-ethers-rainbowkit => vite-wagmi3-viem}/index.html (83%) rename examples/{vite-wagmi-ethers-rainbowkit => vite-wagmi3-viem}/package.json (72%) rename examples/{vite-wagmi-ethers-rainbowkit => vite-wagmi3-viem}/polyfills.ts (53%) create mode 100644 examples/vite-wagmi3-viem/src/App.tsx create mode 100644 examples/vite-wagmi3-viem/src/components/Account.tsx create mode 100644 examples/vite-wagmi3-viem/src/components/ConnectWallet.tsx create mode 100644 examples/vite-wagmi3-viem/src/components/index.ts create mode 100644 examples/vite-wagmi3-viem/src/main.tsx create mode 100644 examples/vite-wagmi3-viem/src/vite-env.d.ts create mode 100644 examples/vite-wagmi3-viem/tsconfig.json create mode 100644 examples/vite-wagmi3-viem/vite.config.ts create mode 100644 packages/ethers/src/test/TestAllEthers.test.ts rename packages/ethers/src/test/{v2.test.ts => TestAllEthersV2.test.ts} (78%) rename packages/ethers/src/test/{adapter.test.ts => TestEthersVersions.test.ts} (73%) create mode 100644 packages/ethers/src/test/TestSharedFixtures.test.ts delete mode 100644 packages/ethers/src/test/constants.ts delete mode 100644 packages/ethers/src/test/integration.test.ts delete mode 100644 packages/ethers/src/test/transfer.test.ts rename packages/sdk/src/test/{TestAll.test.ts => TestAllViem.test.ts} (94%) delete mode 100644 packages/sdk/src/test/config/anvil.ts delete mode 100644 packages/sdk/src/test/config/base.ts delete mode 100644 packages/sdk/src/test/config/index.ts delete mode 100644 packages/sdk/src/test/config/mints.ts delete mode 100644 packages/sdk/src/test/constants/addresses.ts delete mode 100644 packages/sdk/src/test/constants/anvil.ts delete mode 100644 packages/sdk/src/test/constants/index.ts delete mode 100644 packages/sdk/src/test/constants/regexes.ts delete mode 100644 packages/sdk/src/test/types/index.ts delete mode 100644 packages/sdk/src/test/types/testers.ts create mode 100644 packages/sdk/src/test/unit/isAddressMatch.test.ts delete mode 100644 packages/sdk/src/test/utils/debug.ts create mode 100644 packages/test-fixtures/package.json create mode 100644 packages/test-fixtures/src/anvil.ts create mode 100644 packages/test-fixtures/src/fixtures.ts rename packages/{sdk/src/test/wagmi-cli-hooks => test-fixtures/src}/generated.ts (100%) create mode 100644 packages/test-fixtures/src/index.ts create mode 100644 packages/test-fixtures/src/mints.ts diff --git a/MIGRATION.md b/MIGRATION.md index bdca7db..89f0e48 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -124,6 +124,23 @@ it is now also a compile error. npm install @tokenbound/ethers ``` +
+pnpm / yarn / bun + +```bash +pnpm add @tokenbound/ethers +``` + +```bash +yarn add @tokenbound/ethers +``` + +```bash +bun add @tokenbound/ethers +``` + +
+ ```diff - import { TokenboundClient } from "@tokenbound/sdk" + import { TokenboundClient } from "@tokenbound/ethers" @@ -173,6 +190,27 @@ These moved to `@tokenbound/ethers` or were deleted: | `chainIdToChain` | pass a viem `Chain` directly | | `TokenboundClientOptions.chainId` | pass `chain`; use per-method `chainId` for cross-chain | +## 4b. `@tokenbound/ethers` reads use your signer's Provider + +`publicClient` and `publicClientRPCUrl` are no longer accepted by +`@tokenbound/ethers`. Reads now go through the Provider the signer is already +connected to, which removes a second RPC stack from ethers consumers' bundles +(~169 kB → ~32 kB gzipped). + +```diff + const tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, +- publicClient, // no longer accepted + }) +``` + +Your signer must be connected to a Provider. `new Wallet(pk)` can sign but not +read; use `new Wallet(pk, provider)` or `signer.connect(provider)`. Read calls +on an unconnected signer throw a clear error. + +`@tokenbound/sdk` is unaffected — it still takes `publicClient`/`publicClientRPCUrl`. + ## 5. Cross-chain execution Cross-chain `execute` requires a viem public client for LayerZero fee quoting diff --git a/README.md b/README.md index 0fec277..2e3a002 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ into their bundle. Migrating from a previous release? See **[MIGRATION.md](./MIG ### Examples -- **[examples/vite-wagmi-viem](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-viem)** - An example app using the tokenbound SDK in a vite project with wagmi -- **[examples/vite-wagmi-ethers](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-ethers)** - An example app using the tokenbound SDK in a vite project with ethers v5 -- **[examples/vite-wagmi-ethers6](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-ethers6)** - An example app using the tokenbound SDK in a vite project with ethers v6 -- **[examples/vite-wagmi-ethers-rainbowkit](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-rainbowkit)** - An example app using the tokenbound SDK in a vite project with ethers v5 +- **[examples/vite-wagmi-viem](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-viem)** - `@tokenbound/sdk` with viem's `.extend(tokenboundActions())` API, wagmi 2 + RainbowKit +- **[examples/vite-wagmi-ethers](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-ethers)** - `@tokenbound/ethers` with an ethers v5 `Signer`, wagmi 2 + ConnectKit +- **[examples/vite-wagmi-ethers6](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi-ethers6)** - `@tokenbound/ethers` with an ethers v6 `Signer`, wagmi 2 + ConnectKit +- **[examples/vite-wagmi3-viem](https://github.com/tokenbound/sdk/tree/main/examples/vite-wagmi3-viem)** - the same viem app on **wagmi 3**, using wagmi's own `useConnect` instead of a connect-modal library ### Development @@ -86,6 +86,38 @@ pnpm test All unit tests will be executed. +#### Running one package's tests + +From the repository root: + +```bash copy +pnpm test # both packages +pnpm test:viem # @tokenbound/sdk only +pnpm test:ethers # @tokenbound/ethers only +pnpm test:unit # the SDK's unit tests only (no Anvil fork needed) +``` + +The ethers suites are split one file per command, so the v5 and v6 forks never +share a process. `pnpm test:ethers` runs all four in sequence; to run just one, +use these from `packages/ethers`: + +```bash copy +pnpm test:all # ethers v5 + v6 against the V3 deployment +pnpm test:v2 # ethers v5 + v6 against the legacy V2 deployment +pnpm test:versions # version detection and message normalization (no chain) +pnpm test:fixtures # shared fixtures are wired up correctly +``` + +#### Verbose test output + +The fork-backed suites log derived addresses, balances and transaction hashes, +which is what you want when a mainnet-fork test fails but noise otherwise. It is +off by default — set `USE_VERBOSE_TESTS` to turn it on: + +```bash copy +USE_VERBOSE_TESTS=1 pnpm test +``` + ### Pre-commit Hooks Husky has been configured to run a pre-commit hook to ensure tests pass. @@ -105,7 +137,7 @@ The client is instantiated with an object containing two parameters: Use a viem `walletClient` [(see walletClient docs)](https://viem.sh/docs/clients/wallet.html) for transactions that require a user to sign. -Ethers users should install **[@tokenbound/ethers](./packages/ethers)** instead, which accepts an ethers v5 or v6 `Signer` and exposes the same API. +Ethers users should install **[@tokenbound/ethers](./packages/ethers)** instead, which accepts an ethers v5 or v6 `Signer` and exposes the same API. It depends on `@tokenbound/sdk`, so installing it pulls in everything you need — there's no need to install both. The TokenboundClient is configured to use the [Version 3.1 ERC-6551 contract deployments →](https://docs.tokenbound.org/contracts/deployments) by default. @@ -131,7 +163,7 @@ const walletClient: WalletClient = createWalletClient({ const tokenboundClient = new TokenboundClient({ walletClient, chain: mainnet }) ``` -Any viem `Chain` works, including ones not on the [deployments page →](https://docs.tokenbound.org/contracts/deployments): +Any viem `Chain` works, as long as an ERC-6551 deployment exists on that chain — see the [deployments page →](https://docs.tokenbound.org/contracts/deployments): ```ts copy import { zora } from 'viem/chains' diff --git a/examples/vite-wagmi-ethers-rainbowkit/.env.example b/examples/vite-wagmi-ethers-rainbowkit/.env.example deleted file mode 100644 index d043626..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -VITE_ALCHEMY_API_KEY= -NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID= \ No newline at end of file diff --git a/examples/vite-wagmi-ethers-rainbowkit/CHANGELOG.md b/examples/vite-wagmi-ethers-rainbowkit/CHANGELOG.md deleted file mode 100644 index a807148..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/CHANGELOG.md +++ /dev/null @@ -1,70 +0,0 @@ -# vite-wagmi-ethers-rainbowkit - -## 0.0.7 - -### Patch Changes - -- Updated dependencies - - @tokenbound/sdk@0.5.5 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies - - @tokenbound/sdk@0.5.4 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies - - @tokenbound/sdk@0.5.2 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies - - @tokenbound/sdk@0.5.1 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [269d9ef] -- Updated dependencies [ad90b31] -- Updated dependencies [b9f64b9] -- Updated dependencies [d7aba50] -- Updated dependencies [0b59d05] -- Updated dependencies [1e3822b] -- Updated dependencies [fcf538e] -- Updated dependencies [b7d2ed7] -- Updated dependencies [ac30562] -- Updated dependencies [b228840] -- Updated dependencies [d155d74] -- Updated dependencies [e0b5ea5] -- Updated dependencies [c8d718a] -- Updated dependencies [991890f] -- Updated dependencies [bbb9398] -- Updated dependencies [539b120] -- Updated dependencies [765b4d2] -- Updated dependencies [62968c4] -- Updated dependencies [907b3b0] - - @tokenbound/sdk@0.5.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [37a5f93] -- Updated dependencies [3df57e7] - - @tokenbound/sdk@0.3.2 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [a6f4b75] -- Updated dependencies [4429984] - - @tokenbound/sdk@0.3.1 diff --git a/examples/vite-wagmi-ethers-rainbowkit/README.md b/examples/vite-wagmi-ethers-rainbowkit/README.md deleted file mode 100644 index 7692817..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/README.md +++ /dev/null @@ -1,22 +0,0 @@ -This is a [wagmi](https://wagmi.sh) + [RainbowKit](https://www.rainbowkit.com/docs) + [Vite](https://vitejs.dev/) project bootstrapped with [`create-wagmi`](https://github.com/wagmi-dev/wagmi/tree/main/packages/create-wagmi) - -For convenience, it implements the Ethers v5 signer using [viem's Ethers.js adapters](https://wagmi.sh/react/ethers-adapters) in the `useEthersSigner` hook. - -# Getting Started - -Run `npm run dev` in your terminal, and then open [localhost:5173](http://localhost:5173) in your browser. - -Once the webpage has loaded, changes made to files inside the `src/` directory (e.g. `src/App.tsx`) will automatically update the webpage. - -If making local changes to the [SDK](https://github.com/tokenbound/sdk/tree/main/packages/sdk), note that `npm build` must be run inside the `tokenbound-sdk/packages/sdk` directory before the changes will be reflected in this example implementation. - -# Learn more - -To learn more about [Vite](https://vitejs.dev/), [RainbowKit](https://www.rainbowkit.com/docs) or [wagmi](https://wagmi.sh), check out the following resources: - -- [Ethers 5 Documentation](https://docs.ethers.org/v5/) – learn about Ethers v5 -- [viem Documentation](https://viem.sh) – learn about viem Hooks and API. -- [wagmi Documentation](https://wagmi.sh) – learn about wagmi Hooks and API. -- [wagmi Examples](https://wagmi.sh/examples/connect-wallet) – a suite of simple examples using wagmi. -- [RainbowKit Documentation](https://www.rainbowkit.com/docs) – learn more about RainbowKit (configuration, theming, advanced usage, etc). -- [Vite Documentation](https://vitejs.dev/) – learn about Vite features and API. diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx b/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx deleted file mode 100644 index 32ea063..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx +++ /dev/null @@ -1,123 +0,0 @@ -import { ConnectButton } from "@rainbow-me/rainbowkit" -import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/ethers" - -import { Account } from "./components" - -import { parseUnits, getAddress } from "viem" -import { sepolia } from "viem/chains" -import { useCallback, useEffect } from "react" -import { useEthersSigner } from "./hooks" - -// Origin NFT: MoonTrees #0 on Base Sepolia -const originNFT = { - tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), - tokenId: "0", -} - -// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia -const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") -const recipientAddress = getAddress( - "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", -) -const ethAmount = 0.005 -const ethAmountWei = parseUnits(`${ethAmount}`, 18) - -export function App() { - const { isConnected, address } = useAccount() - const signer = useEthersSigner({ chainId: sepolia.id }) - // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() - - const tokenboundClient = new TokenboundClient({ signer, chain: sepolia }) - - useEffect(() => { - async function testTokenboundClass() { - const account = tokenboundClient.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) - - const preparedExecution = await tokenboundClient.prepareExecution({ - account: account, - to: account, - value: 0n, - data: "0x", - }) - - const preparedAccount = await tokenboundClient.prepareCreateAccount({ - tokenContract: "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb", - tokenId: "1", - }) - - console.log("getAccount", account) - console.log("preparedExecution", preparedExecution) - console.log("preparedAccount", preparedAccount) - - // if (signer) { - // signer?.sendTransaction(preparedAccount) - // signer?.sendTransaction(preparedExecuteCall) - // } - } - - testTokenboundClass() - }, [tokenboundClient]) - - const createAccount = useCallback(async () => { - if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.createAccount({ - tokenContract: "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb", - tokenId: "1", - }) - alert(`new account: ${createdAccount}`) - }, [tokenboundClient, address]) - - const execute = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.execute({ - account: sendingTBA, - to: recipientAddress, - value: ethAmountWei, - data: "0x", - }) - executedCall && alert(`Executed: ${executedCall}`) - }, [tokenboundClient, address]) - - const transferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.transferETH({ - account: sendingTBA, - recipientAddress, - amount: ethAmount, - }) - executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) - }, [tokenboundClient, address]) - - return ( - <> -

Ethers 5 Signer + RainbowKit + Vite

- - {isConnected && } - {address && ( -
- - - -
- )} - - ) -} diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/components/Account.tsx b/examples/vite-wagmi-ethers-rainbowkit/src/components/Account.tsx deleted file mode 100644 index 071b5fe..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/components/Account.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useAccount, useEnsName } from 'wagmi' - -export function Account() { - const { address } = useAccount() - const { data: ensName } = useEnsName({ address }) - - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) -} diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/components/index.ts b/examples/vite-wagmi-ethers-rainbowkit/src/components/index.ts deleted file mode 100644 index 1f9f004..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Account } from './Account' diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/hooks/index.ts b/examples/vite-wagmi-ethers-rainbowkit/src/hooks/index.ts deleted file mode 100644 index 258979b..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './useEthersSigner' \ No newline at end of file diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/hooks/useEthersSigner.ts b/examples/vite-wagmi-ethers-rainbowkit/src/hooks/useEthersSigner.ts deleted file mode 100644 index 81b8e4c..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/hooks/useEthersSigner.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as React from 'react' -import { useWalletClient } from 'wagmi' -import type { WalletClient } from 'viem' -import { providers } from 'ethers' - -// Ethers.js Adapters for Wagmi Wallet Client -// https://wagmi.sh/react/ethers-adapters - -export function walletClientToSigner(walletClient: WalletClient) { - const { account, chain, transport } = walletClient - if(!chain) throw new Error('Chain not found') - - const network = { - chainId: chain.id, - name: chain.name, - ensAddress: chain.contracts?.ensRegistry?.address, - } - const provider = new providers.Web3Provider(transport, network) - const signer = provider.getSigner(account?.address) - return signer -} - -/** Hook to convert a viem Wallet Client to an ethers.js Signer. */ -export function useEthersSigner({ chainId }: { chainId?: number } = {}) { - const { data: walletClient } = useWalletClient({ chainId }) - return React.useMemo( - () => (walletClient ? walletClientToSigner(walletClient) : undefined), - [walletClient], - ) -} diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/main.tsx b/examples/vite-wagmi-ethers-rainbowkit/src/main.tsx deleted file mode 100644 index cabe80e..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/main.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import "@rainbow-me/rainbowkit/styles.css" - -import * as React from "react" -import * as ReactDOM from "react-dom/client" -import { WagmiProvider } from "wagmi" - -import { baseSepolia } from "wagmi/chains" -import { QueryClientProvider, QueryClient } from "@tanstack/react-query" - -import { App } from "./App" -import { getDefaultConfig, RainbowKitProvider } from "@rainbow-me/rainbowkit" -const queryClient = new QueryClient() - -const config = getDefaultConfig({ - appName: "My RainbowKit App", - projectId: "YOUR_PROJECT_ID", - chains: [baseSepolia], -}) - -const htmlRoot = document.getElementById("root") - -if (htmlRoot) { - ReactDOM.createRoot(htmlRoot).render( - - - - - - - - - , - ) -} else { - console.error("Failed to find the root element") -} diff --git a/examples/vite-wagmi-ethers-rainbowkit/src/vite-env.d.ts b/examples/vite-wagmi-ethers-rainbowkit/src/vite-env.d.ts deleted file mode 100644 index 11f02fe..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json b/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json deleted file mode 100644 index 2c92705..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react-jsx", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ESNext", - "useDefineForClassFields": true - }, - "include": ["./src"] -} diff --git a/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts b/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts deleted file mode 100644 index ca945ae..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; - -// https://vitejs.dev/config/ -export default defineConfig({ - build: { - target: "es2020", - }, - optimizeDeps: { - esbuildOptions: { - target: "es2020", - }, - }, - resolve: { - alias: { - process: "process/browser", - util: "util", - }, - }, - plugins: [react()], -}); diff --git a/examples/vite-wagmi-ethers/.env.example b/examples/vite-wagmi-ethers/.env.example index 7e3b967..5698aaf 100644 --- a/examples/vite-wagmi-ethers/.env.example +++ b/examples/vite-wagmi-ethers/.env.example @@ -1 +1,2 @@ -VITE_ALCHEMY_API_KEY= \ No newline at end of file +VITE_ALCHEMY_API_KEY= +VITE_WALLETCONNECT_PROJECT_ID= diff --git a/examples/vite-wagmi-ethers/polyfills.ts b/examples/vite-wagmi-ethers/polyfills.ts index 57e078c..3078d58 100644 --- a/examples/vite-wagmi-ethers/polyfills.ts +++ b/examples/vite-wagmi-ethers/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'buffer' -import process from 'process' +import { Buffer } from "buffer" +import process from "process" window.global = window window.process = process diff --git a/examples/vite-wagmi-ethers/src/App.tsx b/examples/vite-wagmi-ethers/src/App.tsx index c925df8..be56ce6 100644 --- a/examples/vite-wagmi-ethers/src/App.tsx +++ b/examples/vite-wagmi-ethers/src/App.tsx @@ -1,11 +1,10 @@ +import { TokenboundClient } from "@tokenbound/ethers" import { ConnectKitButton } from "connectkit" +import { useCallback, useEffect } from "react" +import { getAddress, parseUnits } from "viem" +import { sepolia } from "viem/chains" import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/ethers" - import { Account } from "./components" -import { parseUnits, getAddress } from "viem" -import { sepolia } from "viem/chains" -import { useCallback, useEffect } from "react" import { useEthersSigner } from "./hooks" // Origin NFT: MoonTrees #0 on Base Sepolia diff --git a/examples/vite-wagmi-ethers/src/components/Account.tsx b/examples/vite-wagmi-ethers/src/components/Account.tsx index 071b5fe..83409e4 100644 --- a/examples/vite-wagmi-ethers/src/components/Account.tsx +++ b/examples/vite-wagmi-ethers/src/components/Account.tsx @@ -1,13 +1,13 @@ -import { useAccount, useEnsName } from 'wagmi' +import { useAccount, useEnsName } from "wagmi" export function Account() { - const { address } = useAccount() - const { data: ensName } = useEnsName({ address }) + const { address } = useAccount() + const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + return ( +
+ {ensName ?? address} + {ensName ? ` (${address})` : null} +
+ ) } diff --git a/examples/vite-wagmi-ethers/src/components/index.ts b/examples/vite-wagmi-ethers/src/components/index.ts index 1f9f004..f7aecea 100644 --- a/examples/vite-wagmi-ethers/src/components/index.ts +++ b/examples/vite-wagmi-ethers/src/components/index.ts @@ -1 +1 @@ -export { Account } from './Account' +export { Account } from "./Account" diff --git a/examples/vite-wagmi-ethers/src/hooks/index.ts b/examples/vite-wagmi-ethers/src/hooks/index.ts index 258979b..e0f8e2f 100644 --- a/examples/vite-wagmi-ethers/src/hooks/index.ts +++ b/examples/vite-wagmi-ethers/src/hooks/index.ts @@ -1 +1 @@ -export * from './useEthersSigner' \ No newline at end of file +export * from "./useEthersSigner" diff --git a/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts b/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts index 5089516..1750192 100644 --- a/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts +++ b/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts @@ -1,30 +1,30 @@ -import * as React from 'react' -import { useWalletClient } from 'wagmi' -import type { WalletClient } from 'viem' -import { providers } from 'ethers' +import { providers } from "ethers" +import * as React from "react" +import type { WalletClient } from "viem" +import { useWalletClient } from "wagmi" // Ethers.js Adapters for Wagmi Wallet Client // https://wagmi.sh/react/ethers-adapters export function walletClientToSigner(walletClient: WalletClient) { - const { account, chain, transport } = walletClient - if (!chain) throw new Error('Wallet client has no chain') - if (!account) throw new Error('Wallet client has no account') - const network = { - chainId: chain.id, - name: chain.name, - ensAddress: chain.contracts?.ensRegistry?.address, - } - const provider = new providers.Web3Provider(transport, network) - const signer = provider.getSigner(account.address) - return signer + const { account, chain, transport } = walletClient + if (!chain) throw new Error("Wallet client has no chain") + if (!account) throw new Error("Wallet client has no account") + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + } + const provider = new providers.Web3Provider(transport, network) + const signer = provider.getSigner(account.address) + return signer } /** Hook to convert a viem Wallet Client to an ethers.js Signer. */ export function useEthersSigner({ chainId }: { chainId?: number } = {}) { - const { data: walletClient } = useWalletClient({ chainId }) - return React.useMemo( - () => (walletClient ? walletClientToSigner(walletClient) : undefined), - [walletClient], - ) + const { data: walletClient } = useWalletClient({ chainId }) + return React.useMemo( + () => (walletClient ? walletClientToSigner(walletClient) : undefined), + [walletClient], + ) } diff --git a/examples/vite-wagmi-ethers/src/main.tsx b/examples/vite-wagmi-ethers/src/main.tsx index 05d45ad..0bb2a98 100644 --- a/examples/vite-wagmi-ethers/src/main.tsx +++ b/examples/vite-wagmi-ethers/src/main.tsx @@ -1,11 +1,10 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { ConnectKitProvider } from "connectkit" import * as React from "react" import * as ReactDOM from "react-dom/client" import { WagmiProvider } from "wagmi" - import { App } from "./App" import { wagmiConfig } from "./wagmi" -import { QueryClient, QueryClientProvider } from "@tanstack/react-query" const queryClient = new QueryClient() diff --git a/examples/vite-wagmi-ethers/src/vite-env.d.ts b/examples/vite-wagmi-ethers/src/vite-env.d.ts index 11f02fe..d1a748d 100644 --- a/examples/vite-wagmi-ethers/src/vite-env.d.ts +++ b/examples/vite-wagmi-ethers/src/vite-env.d.ts @@ -1 +1,11 @@ /// + +interface ImportMetaEnv { + readonly VITE_ALCHEMY_API_KEY?: string + /** WalletConnect project id from https://cloud.reown.com. Optional. */ + readonly VITE_WALLETCONNECT_PROJECT_ID?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/vite-wagmi-ethers/src/wagmi.ts b/examples/vite-wagmi-ethers/src/wagmi.ts index eea8bf1..a7da002 100644 --- a/examples/vite-wagmi-ethers/src/wagmi.ts +++ b/examples/vite-wagmi-ethers/src/wagmi.ts @@ -1,17 +1,18 @@ -import { getDefaultConfig } from "connectkit"; -import { createConfig } from "wagmi"; -import { baseSepolia } from 'wagmi/chains' - -import type { Chain } from 'viem' +import { getDefaultConfig } from "connectkit" +import type { Chain } from "viem" +import { createConfig } from "wagmi" +import { baseSepolia } from "wagmi/chains" const chains: readonly [Chain, ...Chain[]] = [baseSepolia] export const wagmiConfig = createConfig( - getDefaultConfig({ - walletConnectProjectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!, - chains, - appName: 'Vite Tokenbound SDK Example', - appDescription: 'Tokenbound SDK Example', - appUrl: 'https://tokenbound.org', - }) -) \ No newline at end of file + getDefaultConfig({ + // Vite only exposes VITE_-prefixed vars, and via import.meta.env — not + // process.env. Get a project id at https://cloud.reown.com. + walletConnectProjectId: import.meta.env.VITE_WALLETCONNECT_PROJECT_ID ?? "", + chains, + appName: "Vite Tokenbound SDK Example", + appDescription: "Tokenbound SDK Example", + appUrl: "https://tokenbound.org", + }), +) diff --git a/examples/vite-wagmi-ethers/tsconfig.json b/examples/vite-wagmi-ethers/tsconfig.json index 2c92705..a6dcc1b 100644 --- a/examples/vite-wagmi-ethers/tsconfig.json +++ b/examples/vite-wagmi-ethers/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react-jsx", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ESNext", - "useDefineForClassFields": true - }, - "include": ["./src"] + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "react-jsx", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "useDefineForClassFields": true + }, + "include": ["./src"] } diff --git a/examples/vite-wagmi-ethers/vite.config.ts b/examples/vite-wagmi-ethers/vite.config.ts index ca945ae..eda8ee0 100644 --- a/examples/vite-wagmi-ethers/vite.config.ts +++ b/examples/vite-wagmi-ethers/vite.config.ts @@ -1,21 +1,21 @@ -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react" +import { defineConfig } from "vite" // https://vitejs.dev/config/ export default defineConfig({ - build: { - target: "es2020", - }, - optimizeDeps: { - esbuildOptions: { - target: "es2020", - }, - }, - resolve: { - alias: { - process: "process/browser", - util: "util", - }, - }, - plugins: [react()], -}); + build: { + target: "es2020", + }, + optimizeDeps: { + esbuildOptions: { + target: "es2020", + }, + }, + resolve: { + alias: { + process: "process/browser", + util: "util", + }, + }, + plugins: [react()], +}) diff --git a/examples/vite-wagmi-ethers6/.env.example b/examples/vite-wagmi-ethers6/.env.example index 7e3b967..5698aaf 100644 --- a/examples/vite-wagmi-ethers6/.env.example +++ b/examples/vite-wagmi-ethers6/.env.example @@ -1 +1,2 @@ -VITE_ALCHEMY_API_KEY= \ No newline at end of file +VITE_ALCHEMY_API_KEY= +VITE_WALLETCONNECT_PROJECT_ID= diff --git a/examples/vite-wagmi-ethers6/polyfills.ts b/examples/vite-wagmi-ethers6/polyfills.ts index 57e078c..3078d58 100644 --- a/examples/vite-wagmi-ethers6/polyfills.ts +++ b/examples/vite-wagmi-ethers6/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'buffer' -import process from 'process' +import { Buffer } from "buffer" +import process from "process" window.global = window window.process = process diff --git a/examples/vite-wagmi-ethers6/src/App.tsx b/examples/vite-wagmi-ethers6/src/App.tsx index 7eabbf9..b984107 100644 --- a/examples/vite-wagmi-ethers6/src/App.tsx +++ b/examples/vite-wagmi-ethers6/src/App.tsx @@ -1,12 +1,10 @@ +import { TokenboundClient } from "@tokenbound/ethers" import { ConnectKitButton } from "connectkit" +import { useCallback, useEffect } from "react" +import { getAddress, parseUnits } from "viem" +import { sepolia } from "viem/chains" import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/ethers" - import { Account } from "./components" - -import { parseUnits, getAddress } from "viem" -import { sepolia } from "viem/chains" -import { useCallback, useEffect } from "react" import { useEthers6Signer } from "./hooks" // Origin NFT: MoonTrees #0 on Base Sepolia diff --git a/examples/vite-wagmi-ethers6/src/components/Account.tsx b/examples/vite-wagmi-ethers6/src/components/Account.tsx index 071b5fe..83409e4 100644 --- a/examples/vite-wagmi-ethers6/src/components/Account.tsx +++ b/examples/vite-wagmi-ethers6/src/components/Account.tsx @@ -1,13 +1,13 @@ -import { useAccount, useEnsName } from 'wagmi' +import { useAccount, useEnsName } from "wagmi" export function Account() { - const { address } = useAccount() - const { data: ensName } = useEnsName({ address }) + const { address } = useAccount() + const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + return ( +
+ {ensName ?? address} + {ensName ? ` (${address})` : null} +
+ ) } diff --git a/examples/vite-wagmi-ethers6/src/components/index.ts b/examples/vite-wagmi-ethers6/src/components/index.ts index 1f9f004..f7aecea 100644 --- a/examples/vite-wagmi-ethers6/src/components/index.ts +++ b/examples/vite-wagmi-ethers6/src/components/index.ts @@ -1 +1 @@ -export { Account } from './Account' +export { Account } from "./Account" diff --git a/examples/vite-wagmi-ethers6/src/hooks/index.ts b/examples/vite-wagmi-ethers6/src/hooks/index.ts index ccdafb6..800ab73 100644 --- a/examples/vite-wagmi-ethers6/src/hooks/index.ts +++ b/examples/vite-wagmi-ethers6/src/hooks/index.ts @@ -1 +1 @@ -export * from './useEthers6Signer' \ No newline at end of file +export * from "./useEthers6Signer" diff --git a/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts b/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts index 1021daa..b4b802a 100644 --- a/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts +++ b/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts @@ -1,30 +1,30 @@ -import * as React from 'react' -import { useWalletClient } from 'wagmi' -import type { WalletClient } from 'viem' -import { BrowserProvider, JsonRpcSigner } from 'ethers' - +import { BrowserProvider, JsonRpcSigner } from "ethers" +import * as React from "react" +import type { WalletClient } from "viem" +import { useWalletClient } from "wagmi" + // Ethers.js Adapters for Wagmi Wallet Client // https://wagmi.sh/react/ethers-adapters export function walletClientToSigner(walletClient: WalletClient) { - const { account, chain, transport } = walletClient - if (!chain) throw new Error('Wallet client has no chain') - if (!account) throw new Error('Wallet client has no account') - const network = { - chainId: chain.id, - name: chain.name, - ensAddress: chain.contracts?.ensRegistry?.address, - } - const provider = new BrowserProvider(transport, network) - const signer = new JsonRpcSigner(provider, account.address) - return signer + const { account, chain, transport } = walletClient + if (!chain) throw new Error("Wallet client has no chain") + if (!account) throw new Error("Wallet client has no account") + const network = { + chainId: chain.id, + name: chain.name, + ensAddress: chain.contracts?.ensRegistry?.address, + } + const provider = new BrowserProvider(transport, network) + const signer = new JsonRpcSigner(provider, account.address) + return signer } - + /** Hook to convert a viem Wallet Client to an ethers.js Signer. */ export function useEthers6Signer({ chainId }: { chainId?: number } = {}) { - const { data: walletClient } = useWalletClient({ chainId }) - return React.useMemo( - () => (walletClient ? walletClientToSigner(walletClient) : undefined), - [walletClient], - ) -} \ No newline at end of file + const { data: walletClient } = useWalletClient({ chainId }) + return React.useMemo( + () => (walletClient ? walletClientToSigner(walletClient) : undefined), + [walletClient], + ) +} diff --git a/examples/vite-wagmi-ethers6/src/main.tsx b/examples/vite-wagmi-ethers6/src/main.tsx index 537b3d3..423277b 100644 --- a/examples/vite-wagmi-ethers6/src/main.tsx +++ b/examples/vite-wagmi-ethers6/src/main.tsx @@ -1,13 +1,13 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { ConnectKitProvider } from "connectkit" import * as React from "react" import * as ReactDOM from "react-dom/client" +import { http } from "viem" import { createConfig, WagmiProvider } from "wagmi" - import { baseSepolia } from "wagmi/chains" -import { QueryClientProvider, QueryClient } from "@tanstack/react-query" -import { http } from "viem" import { App } from "./App" + const queryClient = new QueryClient() export const config = createConfig({ diff --git a/examples/vite-wagmi-ethers6/src/vite-env.d.ts b/examples/vite-wagmi-ethers6/src/vite-env.d.ts index 11f02fe..d1a748d 100644 --- a/examples/vite-wagmi-ethers6/src/vite-env.d.ts +++ b/examples/vite-wagmi-ethers6/src/vite-env.d.ts @@ -1 +1,11 @@ /// + +interface ImportMetaEnv { + readonly VITE_ALCHEMY_API_KEY?: string + /** WalletConnect project id from https://cloud.reown.com. Optional. */ + readonly VITE_WALLETCONNECT_PROJECT_ID?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/vite-wagmi-ethers6/tsconfig.json b/examples/vite-wagmi-ethers6/tsconfig.json index 2c92705..a6dcc1b 100644 --- a/examples/vite-wagmi-ethers6/tsconfig.json +++ b/examples/vite-wagmi-ethers6/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react-jsx", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ESNext", - "useDefineForClassFields": true - }, - "include": ["./src"] + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "react-jsx", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "useDefineForClassFields": true + }, + "include": ["./src"] } diff --git a/examples/vite-wagmi-ethers6/vite.config.ts b/examples/vite-wagmi-ethers6/vite.config.ts index ca945ae..eda8ee0 100644 --- a/examples/vite-wagmi-ethers6/vite.config.ts +++ b/examples/vite-wagmi-ethers6/vite.config.ts @@ -1,21 +1,21 @@ -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react" +import { defineConfig } from "vite" // https://vitejs.dev/config/ export default defineConfig({ - build: { - target: "es2020", - }, - optimizeDeps: { - esbuildOptions: { - target: "es2020", - }, - }, - resolve: { - alias: { - process: "process/browser", - util: "util", - }, - }, - plugins: [react()], -}); + build: { + target: "es2020", + }, + optimizeDeps: { + esbuildOptions: { + target: "es2020", + }, + }, + resolve: { + alias: { + process: "process/browser", + util: "util", + }, + }, + plugins: [react()], +}) diff --git a/examples/vite-wagmi-viem/.env.example b/examples/vite-wagmi-viem/.env.example index 7e3b967..5698aaf 100644 --- a/examples/vite-wagmi-viem/.env.example +++ b/examples/vite-wagmi-viem/.env.example @@ -1 +1,2 @@ -VITE_ALCHEMY_API_KEY= \ No newline at end of file +VITE_ALCHEMY_API_KEY= +VITE_WALLETCONNECT_PROJECT_ID= diff --git a/examples/vite-wagmi-viem/polyfills.ts b/examples/vite-wagmi-viem/polyfills.ts index 57e078c..3078d58 100644 --- a/examples/vite-wagmi-viem/polyfills.ts +++ b/examples/vite-wagmi-viem/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'buffer' -import process from 'process' +import { Buffer } from "buffer" +import process from "process" window.global = window window.process = process diff --git a/examples/vite-wagmi-viem/src/App.tsx b/examples/vite-wagmi-viem/src/App.tsx index 2aa4350..68f779b 100644 --- a/examples/vite-wagmi-viem/src/App.tsx +++ b/examples/vite-wagmi-viem/src/App.tsx @@ -1,19 +1,12 @@ import { ConnectButton } from "@rainbow-me/rainbowkit" -import { useAccount } from "wagmi" - -import { Account } from "./components" - -import { - createWalletClient, - http, - custom, - parseUnits, - getAddress, -} from "viem" -import { baseSepolia, baseGoerli } from "viem/chains" import { tokenboundActions } from "@tokenbound/sdk/viem" import { useCallback, useEffect } from "react" +import { createWalletClient, custom, getAddress, http, parseUnits } from "viem" +import { baseGoerli, baseSepolia } from "viem/chains" +import { useAccount } from "wagmi" +import { Account } from "./components" + declare global { interface Window { ethereum?: any // CoinbaseWalletSDK also defines window.ethereum, so we have to work around that :( @@ -55,19 +48,19 @@ export function App() { tokenId: originNFT.tokenId, }) - const preparedExecution = await tokenboundClient.tokenbound.prepareExecution({ - account: tokenboundAccount, - to: recipientAddress, - value: 0n, - data: "0x", - }) + const preparedExecution = + await tokenboundClient.tokenbound.prepareExecution({ + account: tokenboundAccount, + to: recipientAddress, + value: 0n, + data: "0x", + }) - const preparedCreateAccount = await tokenboundClient.tokenbound.prepareCreateAccount( - { + const preparedCreateAccount = + await tokenboundClient.tokenbound.prepareCreateAccount({ tokenContract: originNFT.tokenContract, tokenId: originNFT.tokenId, - }, - ) + }) console.log("getAccount", tokenboundAccount) console.log("preparedExecution", preparedExecution) @@ -124,7 +117,8 @@ export function App() { chainId: baseGoerli.id, } - const executedCallTxHash = await tokenboundClient.tokenbound.execute(execution) + const executedCallTxHash = + await tokenboundClient.tokenbound.execute(execution) executedCallTxHash && alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) diff --git a/examples/vite-wagmi-viem/src/components/Account.tsx b/examples/vite-wagmi-viem/src/components/Account.tsx index 071b5fe..83409e4 100644 --- a/examples/vite-wagmi-viem/src/components/Account.tsx +++ b/examples/vite-wagmi-viem/src/components/Account.tsx @@ -1,13 +1,13 @@ -import { useAccount, useEnsName } from 'wagmi' +import { useAccount, useEnsName } from "wagmi" export function Account() { - const { address } = useAccount() - const { data: ensName } = useEnsName({ address }) + const { address } = useAccount() + const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + return ( +
+ {ensName ?? address} + {ensName ? ` (${address})` : null} +
+ ) } diff --git a/examples/vite-wagmi-viem/src/components/index.ts b/examples/vite-wagmi-viem/src/components/index.ts index 1f9f004..f7aecea 100644 --- a/examples/vite-wagmi-viem/src/components/index.ts +++ b/examples/vite-wagmi-viem/src/components/index.ts @@ -1 +1 @@ -export { Account } from './Account' +export { Account } from "./Account" diff --git a/examples/vite-wagmi-viem/src/main.tsx b/examples/vite-wagmi-viem/src/main.tsx index 5ce5c68..4e29374 100644 --- a/examples/vite-wagmi-viem/src/main.tsx +++ b/examples/vite-wagmi-viem/src/main.tsx @@ -1,21 +1,36 @@ import "@rainbow-me/rainbowkit/styles.css" -import { http } from "viem" -import { createConfig, WagmiProvider } from "wagmi" +import { lightTheme, RainbowKitProvider } from "@rainbow-me/rainbowkit" import { QueryClient, QueryClientProvider } from "@tanstack/react-query" -import { RainbowKitProvider, lightTheme } from "@rainbow-me/rainbowkit" -import { baseSepolia } from "wagmi/chains" - import * as React from "react" import * as ReactDOM from "react-dom/client" +import { http } from "viem" +import { createConfig, WagmiProvider } from "wagmi" +import { baseSepolia } from "wagmi/chains" +import { coinbaseWallet, injected, walletConnect } from "wagmi/connectors" import { App } from "./App" + // import { wagmiConfig } from './wagmi' const queryClient = new QueryClient() +// WalletConnect needs a project id from https://cloud.reown.com. It is optional +// here: without one the example still runs, just without mobile-wallet support. +const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID + export const config = createConfig({ chains: [baseSepolia], + connectors: [ + // EIP-6963 discovery: MetaMask, Rabby, Phantom, Brave — any injected wallet + // the browser announces. Without an explicit connector list wagmi falls back + // to this alone, which is why Coinbase and WalletConnect are added below. + injected(), + coinbaseWallet({ appName: "Tokenbound SDK Example" }), + ...(walletConnectProjectId + ? [walletConnect({ projectId: walletConnectProjectId })] + : []), + ], transports: { [baseSepolia.id]: http(), }, diff --git a/examples/vite-wagmi-viem/src/vite-env.d.ts b/examples/vite-wagmi-viem/src/vite-env.d.ts index 11f02fe..d1a748d 100644 --- a/examples/vite-wagmi-viem/src/vite-env.d.ts +++ b/examples/vite-wagmi-viem/src/vite-env.d.ts @@ -1 +1,11 @@ /// + +interface ImportMetaEnv { + readonly VITE_ALCHEMY_API_KEY?: string + /** WalletConnect project id from https://cloud.reown.com. Optional. */ + readonly VITE_WALLETCONNECT_PROJECT_ID?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/vite-wagmi-viem/tsconfig.json b/examples/vite-wagmi-viem/tsconfig.json index 2c92705..a6dcc1b 100644 --- a/examples/vite-wagmi-viem/tsconfig.json +++ b/examples/vite-wagmi-viem/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "allowJs": false, - "allowSyntheticDefaultImports": true, - "esModuleInterop": false, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true, - "jsx": "react-jsx", - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "module": "ESNext", - "moduleResolution": "Bundler", - "noEmit": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "strict": true, - "target": "ESNext", - "useDefineForClassFields": true - }, - "include": ["./src"] + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "react-jsx", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "useDefineForClassFields": true + }, + "include": ["./src"] } diff --git a/examples/vite-wagmi-viem/vite.config.ts b/examples/vite-wagmi-viem/vite.config.ts index ca945ae..eda8ee0 100644 --- a/examples/vite-wagmi-viem/vite.config.ts +++ b/examples/vite-wagmi-viem/vite.config.ts @@ -1,21 +1,21 @@ -import react from "@vitejs/plugin-react"; -import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react" +import { defineConfig } from "vite" // https://vitejs.dev/config/ export default defineConfig({ - build: { - target: "es2020", - }, - optimizeDeps: { - esbuildOptions: { - target: "es2020", - }, - }, - resolve: { - alias: { - process: "process/browser", - util: "util", - }, - }, - plugins: [react()], -}); + build: { + target: "es2020", + }, + optimizeDeps: { + esbuildOptions: { + target: "es2020", + }, + }, + resolve: { + alias: { + process: "process/browser", + util: "util", + }, + }, + plugins: [react()], +}) diff --git a/examples/vite-wagmi3-viem/.env.example b/examples/vite-wagmi3-viem/.env.example new file mode 100644 index 0000000..5698aaf --- /dev/null +++ b/examples/vite-wagmi3-viem/.env.example @@ -0,0 +1,2 @@ +VITE_ALCHEMY_API_KEY= +VITE_WALLETCONNECT_PROJECT_ID= diff --git a/examples/vite-wagmi-ethers-rainbowkit/.gitignore b/examples/vite-wagmi3-viem/.gitignore similarity index 100% rename from examples/vite-wagmi-ethers-rainbowkit/.gitignore rename to examples/vite-wagmi3-viem/.gitignore diff --git a/examples/vite-wagmi-ethers-rainbowkit/.npmrc b/examples/vite-wagmi3-viem/.npmrc similarity index 100% rename from examples/vite-wagmi-ethers-rainbowkit/.npmrc rename to examples/vite-wagmi3-viem/.npmrc diff --git a/examples/vite-wagmi3-viem/README.md b/examples/vite-wagmi3-viem/README.md new file mode 100644 index 0000000..37a6eef --- /dev/null +++ b/examples/vite-wagmi3-viem/README.md @@ -0,0 +1,22 @@ +# vite-wagmi3-viem + +`@tokenbound/sdk` with viem's `.extend(tokenboundActions())` API, on **wagmi 3**. + +The difference from [`vite-wagmi-viem`](../vite-wagmi-viem) is the wallet +connection layer, not the SDK: this app uses wagmi's own `useConnect` hook with +an explicit connector list instead of a connect-modal library. RainbowKit and +ConnectKit currently cap at wagmi 2, so dropping them is what allows wagmi 3 +here. + +The SDK only needs a connected account, so either approach works. + +## Setup + +```bash +pnpm install +cp .env.example .env # optional: add a WalletConnect project id +pnpm dev +``` + +`VITE_WALLETCONNECT_PROJECT_ID` is optional — without it the app still runs, +just without mobile-wallet support. Get one at https://cloud.reown.com. diff --git a/examples/vite-wagmi-ethers-rainbowkit/index.html b/examples/vite-wagmi3-viem/index.html similarity index 83% rename from examples/vite-wagmi-ethers-rainbowkit/index.html rename to examples/vite-wagmi3-viem/index.html index e4479c2..bb59c9e 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/index.html +++ b/examples/vite-wagmi3-viem/index.html @@ -3,7 +3,7 @@ - Tokenbound Demo - Ethers 5 Signer + RainbowKit + Tokenbound Demo - viem walletClient diff --git a/examples/vite-wagmi-ethers-rainbowkit/package.json b/examples/vite-wagmi3-viem/package.json similarity index 72% rename from examples/vite-wagmi-ethers-rainbowkit/package.json rename to examples/vite-wagmi3-viem/package.json index eafa875..63dda2f 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/package.json +++ b/examples/vite-wagmi3-viem/package.json @@ -1,6 +1,6 @@ { - "name": "vite-wagmi-ethers-rainbowkit", - "version": "0.0.7", + "name": "vite-wagmi3-viem", + "version": "0.0.0", "private": true, "scripts": { "dev": "vite", @@ -9,18 +9,15 @@ "clean": "rm -rf node_modules" }, "dependencies": { - "@rainbow-me/rainbowkit": "^2.2.11", "@tanstack/react-query": "^5.59.15", - "@tokenbound/ethers": "workspace:^", - "@wagmi/core": "^2.13.9", + "@tokenbound/sdk": "workspace:^", "buffer": "^6.0.3", - "ethers": "^5.8.0", "process": "^0.11.10", "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", "viem": "^2.56.5", - "wagmi": "^2.19.5" + "wagmi": "^3.7.7" }, "devDependencies": { "@biomejs/biome": "2.5.13", diff --git a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts b/examples/vite-wagmi3-viem/polyfills.ts similarity index 53% rename from examples/vite-wagmi-ethers-rainbowkit/polyfills.ts rename to examples/vite-wagmi3-viem/polyfills.ts index 57e078c..3078d58 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts +++ b/examples/vite-wagmi3-viem/polyfills.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'buffer' -import process from 'process' +import { Buffer } from "buffer" +import process from "process" window.global = window window.process = process diff --git a/examples/vite-wagmi3-viem/src/App.tsx b/examples/vite-wagmi3-viem/src/App.tsx new file mode 100644 index 0000000..678e4c6 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/App.tsx @@ -0,0 +1,157 @@ +import { tokenboundActions } from "@tokenbound/sdk/viem" +import { useCallback, useEffect } from "react" + +import { createWalletClient, custom, getAddress, http, parseUnits } from "viem" +import { baseGoerli, baseSepolia } from "viem/chains" +import { useAccount } from "wagmi" +import { Account, ConnectWallet } from "./components" + +declare global { + interface Window { + ethereum?: any // CoinbaseWalletSDK also defines window.ethereum, so we have to work around that :( + } +} + +// Origin NFT: MoonTrees #0 on Base Sepolia +const originNFT = { + tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), + tokenId: "0", +} + +// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia +const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") +const recipientAddress = getAddress( + "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", +) +const ethAmount = 0.005 +const ethAmountWei = parseUnits(`${ethAmount}`, 18) + +export function App() { + const { isConnected, address } = useAccount() + + // The modern viem-first API: extend a viem client and call through + // `client.tokenbound.*`. The extension reuses the same protocol logic as the + // standalone functions, and preserves viem's type inference. + const tokenboundClient = createWalletClient({ + chain: baseSepolia, + account: address, + transport: window.ethereum ? custom(window.ethereum) : http(), + }).extend(tokenboundActions()) + + useEffect(() => { + async function testTokenboundClass() { + if (!tokenboundClient) return + + const tokenboundAccount = tokenboundClient.tokenbound.getAccount({ + tokenContract: originNFT.tokenContract, + tokenId: originNFT.tokenId, + }) + + const preparedExecution = + await tokenboundClient.tokenbound.prepareExecution({ + account: tokenboundAccount, + to: recipientAddress, + value: 0n, + data: "0x", + }) + + const preparedCreateAccount = + await tokenboundClient.tokenbound.prepareCreateAccount({ + tokenContract: originNFT.tokenContract, + tokenId: originNFT.tokenId, + }) + + console.log("getAccount", tokenboundAccount) + console.log("preparedExecution", preparedExecution) + console.log("preparedAccount", preparedCreateAccount) + + // if (address) { + // walletClient?.sendTransaction(preparedCreateAccount) + // walletClient?.sendTransaction(preparedExecuteCall) + // } + } + + testTokenboundClass() + }, [tokenboundClient]) + + const createAccount = useCallback(async () => { + if (!tokenboundClient || !address) return + const createdAccount = await tokenboundClient.tokenbound.createAccount({ + tokenContract: originNFT.tokenContract, + tokenId: originNFT.tokenId, + }) + console.log(`new account: ${createdAccount}`) + alert(`new account: ${createdAccount}`) + }, [tokenboundClient, address]) + + const execute = useCallback(async () => { + if (!tokenboundClient || !address) return + const executedCall = await tokenboundClient.tokenbound.execute({ + account: sendingTBA, + to: recipientAddress, + value: ethAmountWei, + data: "0x", + }) + executedCall && alert(`Executed: ${executedCall}`) + }, [tokenboundClient, address]) + + const transferETH = useCallback(async () => { + if (!tokenboundClient || !address) return + const executedTransfer = await tokenboundClient.tokenbound.transferETH({ + account: sendingTBA, + recipientAddress, + amount: ethAmount, + }) + executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) + }, [tokenboundClient, address]) + + const crossChainTransferETH = useCallback(async () => { + if (!tokenboundClient || !address) return + + const execution = { + account: sendingTBA, + to: originNFT.tokenContract, + value: 0n, + data: "0x" as const, + chainId: baseGoerli.id, + } + + const executedCallTxHash = + await tokenboundClient.tokenbound.execute(execution) + + executedCallTxHash && + alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) + }, [tokenboundClient, address]) + + return ( + <> +

viem .extend(tokenboundActions()) + wagmi 3 + Vite

+ + {isConnected && } + {address && ( +
+ + + + +
+ )} + + ) +} diff --git a/examples/vite-wagmi3-viem/src/components/Account.tsx b/examples/vite-wagmi3-viem/src/components/Account.tsx new file mode 100644 index 0000000..83409e4 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/components/Account.tsx @@ -0,0 +1,13 @@ +import { useAccount, useEnsName } from "wagmi" + +export function Account() { + const { address } = useAccount() + const { data: ensName } = useEnsName({ address }) + + return ( +
+ {ensName ?? address} + {ensName ? ` (${address})` : null} +
+ ) +} diff --git a/examples/vite-wagmi3-viem/src/components/ConnectWallet.tsx b/examples/vite-wagmi3-viem/src/components/ConnectWallet.tsx new file mode 100644 index 0000000..d90bc42 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/components/ConnectWallet.tsx @@ -0,0 +1,37 @@ +import { useAccount, useConnect, useDisconnect } from "wagmi" + +/** + * A minimal connect UI built on wagmi's own hooks. + * + * Deliberately not RainbowKit/ConnectKit: the SDK only needs a connected + * account, however you obtain it. See examples/vite-wagmi-viem for the same app + * using RainbowKit instead. + */ +export function ConnectWallet() { + const { address, isConnected } = useAccount() + const { connectors, connect, isPending } = useConnect() + const { disconnect } = useDisconnect() + + if (isConnected) { + return ( + + ) + } + + return ( +
+ {connectors.map((connector) => ( + + ))} +
+ ) +} diff --git a/examples/vite-wagmi3-viem/src/components/index.ts b/examples/vite-wagmi3-viem/src/components/index.ts new file mode 100644 index 0000000..6802d5f --- /dev/null +++ b/examples/vite-wagmi3-viem/src/components/index.ts @@ -0,0 +1,2 @@ +export { Account } from "./Account" +export { ConnectWallet } from "./ConnectWallet" diff --git a/examples/vite-wagmi3-viem/src/main.tsx b/examples/vite-wagmi3-viem/src/main.tsx new file mode 100644 index 0000000..ee6da88 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/main.tsx @@ -0,0 +1,50 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" +import * as React from "react" +import * as ReactDOM from "react-dom/client" +import { http } from "viem" +import { createConfig, WagmiProvider } from "wagmi" +import { baseSepolia } from "wagmi/chains" +import { coinbaseWallet, injected, walletConnect } from "wagmi/connectors" + +import { App } from "./App" + +// import { wagmiConfig } from './wagmi' + +const queryClient = new QueryClient() + +// WalletConnect needs a project id from https://cloud.reown.com. It is optional +// here: without one the example still runs, just without mobile-wallet support. +const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID + +export const config = createConfig({ + chains: [baseSepolia], + connectors: [ + // EIP-6963 discovery: MetaMask, Rabby, Phantom, Brave — any injected wallet + // the browser announces. Without an explicit connector list wagmi falls back + // to this alone, which is why Coinbase and WalletConnect are added below. + injected(), + coinbaseWallet({ appName: "Tokenbound SDK Example" }), + ...(walletConnectProjectId + ? [walletConnect({ projectId: walletConnectProjectId })] + : []), + ], + transports: { + [baseSepolia.id]: http(), + }, +}) + +const htmlRoot = document.getElementById("root") + +if (htmlRoot) { + ReactDOM.createRoot(htmlRoot).render( + + + + + + + , + ) +} else { + console.error("Failed to find the root element") +} diff --git a/examples/vite-wagmi3-viem/src/vite-env.d.ts b/examples/vite-wagmi3-viem/src/vite-env.d.ts new file mode 100644 index 0000000..d1a748d --- /dev/null +++ b/examples/vite-wagmi3-viem/src/vite-env.d.ts @@ -0,0 +1,11 @@ +/// + +interface ImportMetaEnv { + readonly VITE_ALCHEMY_API_KEY?: string + /** WalletConnect project id from https://cloud.reown.com. Optional. */ + readonly VITE_WALLETCONNECT_PROJECT_ID?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/vite-wagmi3-viem/tsconfig.json b/examples/vite-wagmi3-viem/tsconfig.json new file mode 100644 index 0000000..a6dcc1b --- /dev/null +++ b/examples/vite-wagmi3-viem/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "allowJs": false, + "allowSyntheticDefaultImports": true, + "esModuleInterop": false, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "react-jsx", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "ESNext", + "useDefineForClassFields": true + }, + "include": ["./src"] +} diff --git a/examples/vite-wagmi3-viem/vite.config.ts b/examples/vite-wagmi3-viem/vite.config.ts new file mode 100644 index 0000000..eda8ee0 --- /dev/null +++ b/examples/vite-wagmi3-viem/vite.config.ts @@ -0,0 +1,21 @@ +import react from "@vitejs/plugin-react" +import { defineConfig } from "vite" + +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + target: "es2020", + }, + optimizeDeps: { + esbuildOptions: { + target: "es2020", + }, + }, + resolve: { + alias: { + process: "process/browser", + util: "util", + }, + }, + plugins: [react()], +}) diff --git a/package.json b/package.json index 3e3f801..2057f7f 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "scripts": { "build": "pnpm --filter @tokenbound/sdk build && pnpm --filter @tokenbound/ethers build", "test": "pnpm --filter @tokenbound/sdk test && pnpm --filter @tokenbound/ethers test", + "test:viem": "pnpm --filter @tokenbound/sdk test", + "test:ethers": "pnpm --filter @tokenbound/ethers test", "test:unit": "pnpm --filter @tokenbound/sdk exec vitest --watch=false --typecheck run src/test/unit/", "typecheck": "pnpm --filter @tokenbound/sdk exec tsc --noEmit && pnpm --filter @tokenbound/ethers exec tsc --noEmit", "validate:packages": "node scripts/validate-package-contents.mjs", @@ -19,9 +21,14 @@ "author": "", "license": "ISC", "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "2.5.14", "@changesets/cli": "^2.26.2", "husky": "^8.0.3", "typescript": "^5.6.3" + }, + "pnpm": { + "overrides": { + "@walletconnect/logger>pino": "10.0.0" + } } } diff --git a/packages/ethers/README.md b/packages/ethers/README.md index cb7bf65..6d84789 100644 --- a/packages/ethers/README.md +++ b/packages/ethers/README.md @@ -21,9 +21,31 @@ deconstruction) is reused from `@tokenbound/sdk` — nothing is reimplemented he npm install @tokenbound/ethers ethers ``` +
+pnpm / yarn / bun + +```bash +pnpm add @tokenbound/ethers ethers +``` + +```bash +yarn add @tokenbound/ethers ethers +``` + +```bash +bun add @tokenbound/ethers ethers +``` + +
+ `ethers` and `viem` are peer dependencies. Both ethers v5 and v6 are supported; the version in use is detected automatically. +Reads (deployment checks, bytecode, `isValidSigner`, ENS) go through the +Provider your signer is already connected to — this package does not build a +second RPC client. **Your signer must be connected to a Provider**; a bare +`new Wallet(privateKey)` can sign but not read. + ## Usage The API mirrors `@tokenbound/sdk`'s `TokenboundClient`, so migrating from @@ -94,6 +116,8 @@ majors (v6 rejects `ArrayLike`, v5 accepts it) and is handled internally ## Limitations +- The signer must be connected to a Provider for any read operation. + - **Cross-chain execution** is not supported through the ethers adapter. Use `@tokenbound/sdk` with a viem client for cross-chain calls. - `chain` is required — passing only `chainId` is no longer supported, because diff --git a/packages/ethers/package.json b/packages/ethers/package.json index ea1472f..5354684 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -38,29 +38,30 @@ }, "scripts": { "build": "tsc --noEmit && vite build", - "test": "pnpm test:unit && pnpm test:integration && pnpm test:v2 && pnpm test:transfer", + "test": "pnpm test:versions && pnpm test:fixtures && pnpm test:all && pnpm test:v2", "clean": "rm -rf node_modules/ dist/", "lint": "biome lint .", "format": "biome format .", - "test:unit": "vitest --watch=false run src/test/adapter.test.ts", - "test:integration": "vitest --watch=false run src/test/integration.test.ts", - "test:transfer": "vitest --watch=false run src/test/transfer.test.ts", - "test:v2": "vitest --watch=false run src/test/v2.test.ts" + "test:v2": "vitest --watch=false run src/test/TestAllEthersV2.test.ts", + "test:fixtures": "vitest --watch=false run src/test/TestSharedFixtures.test.ts", + "test:versions": "vitest --watch=false run src/test/TestEthersVersions.test.ts", + "test:all": "vitest --watch=false run src/test/TestAllEthers.test.ts" }, "dependencies": { "@tokenbound/sdk": "workspace:^" }, "peerDependencies": { "ethers": "^5.7.2 || ^6.0.0", - "viem": "^2.56.5" + "viem": "~2.56.6" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "2.5.14", + "@tokenbound/test-fixtures": "workspace:*", "@viem/anvil": "^0.0.10", "ethers": "^5.8.0", "ethers6": "npm:ethers@^6.17.0", "typescript": "^5.6.3", - "viem": "^2.56.5", + "viem": "~2.56.6", "vite": "^4.4.9", "vite-plugin-dts": "^3.9.0", "vitest": "^1.6.1" diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts index 20ccd43..706da87 100644 --- a/packages/ethers/src/TokenboundClient.ts +++ b/packages/ethers/src/TokenboundClient.ts @@ -6,18 +6,23 @@ // layer — nothing is reimplemented here. import { - type Call3, type CallData, + type CreateAccountParams, deconstructBytecode as deconstructBytecodeFromHex, ERC_6551_DEFAULT, + type ERC20TransferParams, + type ETHTransferParams, + type ExecuteParams, encodeERC20Transfer, encodeETHTransfer, encodeExecuteCall, encodeExecution, encodeNFTTransfer, + type GetAccountParams, getAccountAddress, type MultiCallTx, - type Prettify, + type NFTTransferParams, + type PossibleENSAddress, prepareCreateAccountTx, type ResolvedDeployment, resolveDeployment, @@ -26,22 +31,12 @@ import { type TokenboundAccountNFT, VALID_SIGNER_MAGIC_VALUE, } from "@tokenbound/sdk" -import { - type Address, - type Chain, - createPublicClient, - type Hex, - http, - type PublicClient, -} from "viem" +import type { Address, Chain, Hex } from "viem" +import { encodeFunctionData, getAddress, numberToHex } from "viem/utils" import { type EthersAdapter, resolveAdapter } from "./adapter" import type { EthersSignableMessage } from "./types" -type PossibleENSAddress = Address | `${string}.eth` - -type NFTTokenTypeValue = "ERC721" | "ERC1155" - export type TokenboundEthersClientOptions = { /** An ethers v5 or v6 Signer. */ signer: unknown @@ -50,52 +45,38 @@ export type TokenboundEthersClientOptions = { * SDK no longer maps a bare chainId to a Chain. */ chain: Chain - /** A viem PublicClient used for reads. Created automatically when omitted. */ - publicClient?: PublicClient - publicClientRPCUrl?: string implementationAddress?: Address registryAddress?: Address version?: TBImplementationVersion } -export type GetAccountParams = { - tokenContract: Address - tokenId: string - chainId?: number - salt?: number -} - -export type CreateAccountParams = Prettify< - GetAccountParams & { - appendedCalls?: Call3[] - } -> - -export type ExecuteParams = { - account: Address - to: Address - value: bigint - data: string - chainId?: number +// Parameter types come from @tokenbound/sdk rather than being redefined here: +// the two clients expose the same API, so a consumer switching between them +// (or a shared helper typed against one) must see identical shapes. Re-exported +// below so `import type { GetAccountParams } from "@tokenbound/ethers"` works. +export type { + CreateAccountParams, + ERC20TransferParams, + ETHTransferParams, + ExecuteParams, + GetAccountParams, + NFTTransferParams, } export class TokenboundClient { - private chainId: number + private chain: Chain public isInitialized = false - public publicClient: PublicClient private adapter: EthersAdapter private deployment: ResolvedDeployment + /** Always the configured chain's id; derived rather than stored separately. */ + private get chainId(): number { + return this.chain.id + } + constructor(options: TokenboundEthersClientOptions) { - const { - signer, - chain, - publicClient, - publicClientRPCUrl, - implementationAddress, - registryAddress, - version, - } = options + const { signer, chain, implementationAddress, registryAddress, version } = + options if (!chain) { throw new Error( @@ -107,22 +88,9 @@ export class TokenboundClient { throw new Error("signer required.") } - if (publicClient && publicClientRPCUrl) { - throw new Error( - "Only one of `publicClient` or `publicClientRPCUrl` should be provided.", - ) - } - - this.chainId = chain.id + this.chain = chain this.adapter = resolveAdapter(signer) - this.publicClient = - publicClient ?? - createPublicClient({ - chain, - transport: http(publicClientRPCUrl ?? undefined), - }) - this.deployment = resolveDeployment({ implementationAddress, registryAddress, @@ -254,16 +222,17 @@ export class TokenboundClient { } const signerAddress = await this.adapter.getAddress() - const { numberToHex } = await import("viem") - - const validityCheck = await this.publicClient.readContract({ - address: account, + const data = encodeFunctionData({ abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, functionName: "isValidSigner", args: [signerAddress, numberToHex(0, { size: 32 })], }) - return validityCheck === VALID_SIGNER_MAGIC_VALUE + // The contract returns a bytes4 magic value, left-aligned in a 32-byte + // word, so the first 4 bytes of the return data are the whole answer. + const returnData = await this.adapter.call({ to: account, data }) + + return returnData.slice(0, 10) === VALID_SIGNER_MAGIC_VALUE } /** Returns true when a tokenbound account has been deployed. */ @@ -272,9 +241,7 @@ export class TokenboundClient { }: { accountAddress: Address }): Promise { - const bytecode = await this.publicClient.getCode({ - address: accountAddress, - }) + const bytecode = await this.adapter.getCode(accountAddress) return bytecode ? bytecode.length > 2 : false } @@ -284,9 +251,7 @@ export class TokenboundClient { }: { accountAddress: Address }): Promise { - const bytecode = await this.publicClient.getCode({ - address: accountAddress, - }) + const bytecode = await this.adapter.getCode(accountAddress) return deconstructBytecodeFromHex(bytecode) } @@ -307,15 +272,7 @@ export class TokenboundClient { } /** Transfers an ERC721/ERC1155 out of a tokenbound account. */ - public async transferNFT(params: { - account: Address - tokenType: NFTTokenTypeValue - tokenContract: Address - tokenId: string - recipientAddress: PossibleENSAddress - amount?: number - chainId?: number - }): Promise { + public async transferNFT(params: NFTTransferParams): Promise { const recipient = await this.resolveRecipient(params.recipientAddress) const transfer = encodeNFTTransfer({ @@ -331,26 +288,14 @@ export class TokenboundClient { } /** Transfers ETH out of a tokenbound account. `amount` is in decimal ETH. */ - public async transferETH(params: { - account: Address - recipientAddress: PossibleENSAddress - amount: number - chainId?: number - }): Promise { + public async transferETH(params: ETHTransferParams): Promise { const recipient = await this.resolveRecipient(params.recipientAddress) const transfer = encodeETHTransfer({ recipient, amount: params.amount }) return await this.executeTransfer(params.account, transfer, params.chainId) } /** Transfers an ERC-20 out of a tokenbound account. */ - public async transferERC20(params: { - account: Address - recipientAddress: PossibleENSAddress - amount: number - erc20tokenAddress: Address - erc20tokenDecimals: number - chainId?: number - }): Promise { + public async transferERC20(params: ERC20TransferParams): Promise { if (params.erc20tokenDecimals < 0 || params.erc20tokenDecimals > 18) { throw new Error("Decimal value out of range. Should be between 0 and 18.") } @@ -381,21 +326,17 @@ export class TokenboundClient { private async resolveRecipient( recipientAddress: PossibleENSAddress, ): Promise
{ - const { getAddress } = await import("viem") - if (!recipientAddress.endsWith(".eth")) { return getAddress(recipientAddress) } - const { normalize } = await import("viem/ens") - const resolved = await this.publicClient.getEnsAddress({ - name: normalize(recipientAddress), - }) + // ethers normalizes ENS names internally, so no viem/ens import here. + const resolved = await this.adapter.resolveName(recipientAddress) if (!resolved) { throw new Error("Failed to resolve ENS address") } - return resolved + return getAddress(resolved) } /** Routes an encoded transfer through execute() or legacy executeCall(). */ @@ -414,9 +355,9 @@ export class TokenboundClient { /** Sends a prepared transaction through the ethers signer. */ private async sendPrepared(tx: CallData | MultiCallTx): Promise { return await this.adapter.sendTransaction({ - to: tx.to as string, - value: (tx.value ?? 0n) as bigint, - data: tx.data as string, + to: tx.to as Address, + value: tx.value ?? 0n, + data: tx.data as Hex, }) } } diff --git a/packages/ethers/src/adapter.ts b/packages/ethers/src/adapter.ts index 11673f8..626a2ab 100644 --- a/packages/ethers/src/adapter.ts +++ b/packages/ethers/src/adapter.ts @@ -13,6 +13,7 @@ import { assertSigner, detectEthersVersion } from "./detect" import type { + Address, EthersSignableMessage, EthersSigner, EthersVersion, @@ -29,14 +30,20 @@ export type EthersAdapter = { signer: EthersSigner /** Sends a prepared transaction and returns its hash. */ sendTransaction: (tx: { - to: string + to: Address value: bigint - data: string + data: Hex }) => Promise /** Signs a message, normalizing it for the detected ethers version. */ signMessage: (message: EthersSignableMessage) => Promise /** Returns the signer's address. */ - getAddress: () => Promise<`0x${string}`> + getAddress: () => Promise
+ /** Returns the deployed bytecode at an address ("0x" when undeployed). */ + getCode: (address: Address) => Promise + /** Performs a read-only contract call and returns the raw return data. */ + call: (tx: { to: Address; data: Hex }) => Promise + /** Resolves an ENS name, or null when it does not resolve. */ + resolveName: (name: string) => Promise
} /** Message normalization, per ethers major version. */ @@ -59,6 +66,22 @@ export function createAdapter( ): EthersAdapter { const normalize = NORMALIZERS[version] + /** + * Reads go through the signer's own Provider rather than a separate viem + * client, so ethers consumers do not pay for a second RPC stack. `getCode`, + * `call` and `resolveName` exist with the same shape on v5 and v6, so no + * version branching is needed here. + */ + const requireProvider = () => { + const provider = signer.provider + if (!provider) { + throw new Error( + "The ethers Signer must be connected to a Provider for read operations. Use `signer.connect(provider)`.", + ) + } + return provider + } + return { version, signer, @@ -74,7 +97,20 @@ export function createAdapter( return (await signer.signMessage(normalize(message))) as Hex }, async getAddress() { - return (await signer.getAddress()) as `0x${string}` + return (await signer.getAddress()) as Address + }, + async getCode(address) { + return (await requireProvider().getCode(address)) as Hex + }, + async call(tx) { + return (await requireProvider().call(tx)) as Hex + }, + async resolveName(name) { + const provider = requireProvider() + if (typeof provider.resolveName !== "function") { + throw new Error("This ethers Provider does not support ENS resolution.") + } + return (await provider.resolveName(name)) as Address | null }, } } diff --git a/packages/ethers/src/index.ts b/packages/ethers/src/index.ts index 1d8c873..9d9e18b 100644 --- a/packages/ethers/src/index.ts +++ b/packages/ethers/src/index.ts @@ -7,8 +7,11 @@ export { type EthersAdapter, resolveAdapter } from "./adapter" export { detectEthersVersion } from "./detect" export { type CreateAccountParams, + type ERC20TransferParams, + type ETHTransferParams, type ExecuteParams, type GetAccountParams, + type NFTTransferParams, TokenboundClient, type TokenboundEthersClientOptions, } from "./TokenboundClient" diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts new file mode 100644 index 0000000..8f1068e --- /dev/null +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -0,0 +1,1020 @@ +// Tokenbound behaviour via an ethers v5 / v6 Signer. +// +// Mirrors packages/sdk/src/test/TestAllViem.test.ts: the same describe blocks +// and the same `it` names, so both ecosystems are asserted to behave +// identically. Like that suite, this one is parameterized over BOTH the +// ERC-6551 deployment (V2 legacy / V3 default) and — uniquely to ethers — the +// ethers major version, so all four combinations run the same cases. +// +// Cases that exist only for ethers (version detection, ArrayLike message +// normalization) live in TestEthersVersions; V2-specific derivation and +// encoding assertions live in TestAllEthersV2. Keep the suites in step — a case +// added there needs its twin here. +// +// Runs its own anvil per variant: ethers caches pending nonces per provider, so +// sharing a fork between variants makes those views stale. + +import { + ERC_6551_DEFAULT, + ERC_6551_LEGACY_V2, + type TBImplementationVersion, + TBVersion, +} from "@tokenbound/sdk" +import { + ADDRESS_REGEX, + ANVIL_ACCOUNTS, + CREATE_ANVIL_OPTIONS, + ECDSA_SIGNATURE_REGEX, + ENS_NAME, + isAddressMatch, + RECIPIENT_ADDRESS, + TX_HASH_REGEX, + testLog, + WETH_CONTRACT_ADDRESS, + weth, + zora721, + zora1155, +} from "@tokenbound/test-fixtures" +import { createAnvil } from "@viem/anvil" +import { ethers } from "ethers" +import { JsonRpcProvider, Wallet } from "ethers6" +import { + type Address, + createPublicClient, + createTestClient, + encodeAbiParameters, + encodeFunctionData, + getAddress, + type Hex, + http, + type PublicClient, + parseAbiParameters, + parseUnits, +} from "viem" +import { mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../index" + +const TIMEOUT = 90000 + +// Imported, not copied: these are the very same values the viem suite uses. +const WETH = WETH_CONTRACT_ADDRESS + +type EthersTestConfig = { + /** ethers major version under test. */ + version: 5 | 6 + /** ERC-6551 deployment under test; undefined means the V3 default. */ + tbVersion?: TBImplementationVersion + /** Name rendered by describe.each, matching the viem suite's style. */ + testName: string +} + +const ENABLED_TESTS: Array = [ + { testName: "ethers@5 v2", version: 5, tbVersion: TBVersion.V2 }, + { testName: "ethers@5 v3", version: 5 }, + { testName: "ethers@6 v2", version: 6, tbVersion: TBVersion.V2 }, + { testName: "ethers@6 v3", version: 6 }, +] + +describe.each(ENABLED_TESTS)( + "$testName", + ({ testName, version, tbVersion }) => { + const isV2 = tbVersion === TBVersion.V2 + const isV3 = !isV2 + // Mirrors the viem suite: V3-only cases are skipped on the V2 variants + // rather than omitted, so the skip is visible in the report. + const v3OnlyIt = isV3 ? it : it.skip + + const ERC6551_DEPLOYMENT = isV2 ? ERC_6551_LEGACY_V2 : ERC_6551_DEFAULT + + // V3 is the client's default deployment, so it takes no overrides. V2 has + // to be pinned explicitly to the legacy implementation and registry. + const DEPLOYMENT_OVERRIDES = isV3 + ? {} + : { + implementationAddress: ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, + registryAddress: ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, + } + // No explicit port: variants run sequentially (fileParallelism: false, + // sequence.concurrent: false) and each afterAll stops anvil before the + // next beforeAll starts, so they can share the default port — same as + // the viem suite. + const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + const rpcUrl = `http://127.0.0.1:${anvil.port}` + + let publicClient: PublicClient + let testClient: ReturnType + const CUSTOM_SALT = 6551 + let signer: ReturnType + let tokenboundClient: TokenboundClient + let NFT_IN_EOA: { tokenContract: Address; tokenId: string } + let NFT_FOR_MULTICALL_CREATE: { tokenContract: Address; tokenId: string } + let TOKENID_IN_EOA: string + let TOKENID_FOR_MULTICALL_CREATE: string + let TOKENID1_IN_TBA: string + let TOKENID2_IN_TBA: string + let ZORA721_TBA_ADDRESS: Address + + function makeSigner() { + if (version === 5) { + return new ethers.Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + } + return new Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new JsonRpcProvider(rpcUrl), + ) + } + + /** + * ethers caches the pending nonce per provider. Writes issued through the + * SDK return a bare hash, so ethers never sees them land; poll until its + * view matches the chain before the next send. + */ + async function nextNonce() { + return await publicClient.getTransactionCount({ + address: getAddress(ANVIL_ACCOUNTS[0].address), + }) + } + + /** + * Writes issued through the SDK return a bare hash, so ethers never sees + * them confirm and its cached pending nonce goes stale. Wait until the + * signer's own provider agrees with the chain before the next send. + */ + async function syncNonce() { + const address = getAddress(ANVIL_ACCOUNTS[0].address) + const provider = signer.provider + if (!provider) return + for (let i = 0; i < 100; i++) { + const onChain = await publicClient.getTransactionCount({ address }) + const fromEthers = await provider.getTransactionCount( + address, + "pending", + ) + if (Number(fromEthers) === Number(onChain)) return + await new Promise((r) => setTimeout(r, 100)) + } + } + + /** + * Waits for a receipt by hash. The SDK's writes return a bare hash, so this + * is how the suite observes them landing. (viem parity: getReceipt) + */ + async function getReceipt(hash: Hex, timeoutMs = 30000) { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + return await publicClient.getTransactionReceipt({ hash }) + } catch { + await new Promise((r) => setTimeout(r, 200)) + } + } + throw new Error(`Transaction ${hash} was not mined within ${timeoutMs}ms`) + } + + /** Mints 4 Zora 721s into the Anvil EOA and records their token IDs. */ + async function ensureMintedNFTs() { + if (TOKENID_IN_EOA) return + + // One purchase of 4 to the EOA, ids split by role. A second purchase + // from the same address trips the drop's per-address mint limit. + const mint = await signer.sendTransaction({ + to: zora721.proxyContractAddress, + value: zora721.mintPrice * BigInt(zora721.quantity), + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [BigInt(zora721.quantity)], + }), + }) + await mint.wait() + const receipt = await getReceipt(mint.hash as Hex) + + // Read token IDs off the mint receipt. The mint is a single transaction, + // so every Transfer log is here and this stays deterministic regardless + // of how the node batches event notifications. + const mintedIds = receipt.logs + .filter( + (l) => + isAddressMatch(l.address, zora721.proxyContractAddress) && + l.topics.length === 4 && + !!l.topics[3], + ) + .map((l) => BigInt(l.topics[3] as Hex).toString()) + + if (mintedIds.length < zora721.quantity) { + throw new Error( + `Expected ${zora721.quantity} minted token IDs, saw ${mintedIds.length}`, + ) + } + + TOKENID_IN_EOA = mintedIds[0] + TOKENID1_IN_TBA = mintedIds[1] + TOKENID2_IN_TBA = mintedIds[2] + TOKENID_FOR_MULTICALL_CREATE = mintedIds[3] + + NFT_IN_EOA = { + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + } + NFT_FOR_MULTICALL_CREATE = { + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_FOR_MULTICALL_CREATE, + } + } + + /** Ensures the TBA for NFT_IN_EOA exists on-chain. */ + async function ensureTBA() { + await ensureMintedNFTs() + if (ZORA721_TBA_ADDRESS) return + + const { account, txHash } = + await tokenboundClient.createAccount(NFT_IN_EOA) + await getReceipt(txHash) + ZORA721_TBA_ADDRESS = account + // Keep ethers' cached pending nonce in step: the SDK returns a bare + // hash, so ethers never observes that confirmation. + await syncNonce() + } + + /** Moves one minted 721 from the EOA into the TBA. Idempotent per token. */ + async function transferNFTToTBA(tokenId: string) { + const owner = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "ownerOf", + args: [BigInt(tokenId)], + }) + if (isAddressMatch(owner, ZORA721_TBA_ADDRESS)) return + + const tx = await signer.sendTransaction({ + to: zora721.proxyContractAddress, + value: 0n, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ + getAddress(ANVIL_ACCOUNTS[0].address), + ZORA721_TBA_ADDRESS, + BigInt(tokenId), + ], + }), + nonce: await nextNonce(), + }) + await tx.wait() + await getReceipt(tx.hash as Hex) + return tx.hash as Hex + } + + /** Ensures the TBA holds the two 721s that transfer tests operate on. */ + async function ensureNFTsInTBA() { + await ensureTBA() + await transferNFTToTBA(TOKENID1_IN_TBA) + await transferNFTToTBA(TOKENID2_IN_TBA) + } + + /** Ensures the TBA holds Zora 1155s for the 1155 transfer tests. */ + async function ensure1155sInTBA( + quantity: number | bigint = zora1155.quantity, + ) { + await ensureETHInTBA(2) + const held = await publicClient.readContract({ + address: zora1155.proxyContractAddress, + abi: zora1155.abi, + functionName: "balanceOf", + args: [ZORA721_TBA_ADDRESS, zora1155.tokenId], + }) + if (held >= BigInt(quantity)) return + + const need = BigInt(quantity) - held + const data = encodeFunctionData({ + abi: zora1155.abi, + functionName: "mint", + args: [ + zora1155.fixedPriceSalesStrategy, + zora1155.tokenId, + need, + encodeAbiParameters(parseAbiParameters("address"), [ + ZORA721_TBA_ADDRESS, + ]), + ], + }) + + const execution = { + account: ZORA721_TBA_ADDRESS, + to: zora1155.proxyContractAddress, + value: zora1155.mintFee * need, + data, + } + + const hash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) + await getReceipt(hash) + await syncNonce() + } + + /** + * The custom-salt TBA address is deterministic, so tests that only need the + * address can compute it instead of depending on the create test having run. + */ + function customSaltTBAAddress(): Address { + return tokenboundClient.getAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + } + + /** Ensures the TBA holds at least `amount` ETH to spend. */ + async function ensureETHInTBA(amount = 1) { + await ensureTBA() + const wei = parseUnits(`${amount}`, 18) + const balance = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + if (balance >= wei) return + // Anvil-funded rather than a transfer: costs no nonce on the signer. + await testClient.setBalance({ + address: ZORA721_TBA_ADDRESS, + value: wei, + }) + } + + // Spin up a fresh anvil instance each time we run the test suite against a + // different configuration. + beforeAll(async () => { + try { + await anvil.start() + + publicClient = createPublicClient({ + chain: mainnet, + transport: http(rpcUrl), + }) as PublicClient + testClient = createTestClient({ + chain: mainnet, + mode: "anvil", + transport: http(rpcUrl), + }) + + // The fork inherits mainnet state for Anvil's well-known default + // accounts, including an EIP-7702 delegation on ANVIL_ACCOUNTS[1]. + // That makes it look like a contract, so safeTransferFrom calls a + // receiver hook it doesn't implement. Clear it so the ZORA721_TBA_ADDRESS behaves + // as a plain EOA. + await testClient.setCode({ + address: getAddress(ANVIL_ACCOUNTS[1].address), + bytecode: "0x", + }) + + signer = makeSigner() + tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, + ...DEPLOYMENT_OVERRIDES, + }) + + testLog(`START → \x1b[94m ${testName} \x1b[0m`) + } catch (err) { + // Rethrow: a failed setup (anvil not starting, fork RPC unreachable) + // must fail the suite here, not surface as confusing failures in + // every downstream test. + console.error("Error during setup:", err) + throw err + } + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + testLog(`END → \x1b[94m ${testName} \x1b[0m`) + }) + + describe("client", () => { + it("can get the SDK version", () => { + // ethers counterpart: the client reports the ethers major detected. + expect(tokenboundClient.getEthersVersion()).toBe(version) + }) + }) + + describe("accounts", () => { + it( + "can mint 2 Zora 721 NFTs into Anvil wallet #0", + async () => { + await ensureMintedNFTs() + const zoraBalanceInAnvilWallet = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [getAddress(ANVIL_ACCOUNTS[0].address)], + }) + + expect(NFT_IN_EOA.tokenId).toBe(TOKENID_IN_EOA) + expect(NFT_FOR_MULTICALL_CREATE.tokenId).toBe( + TOKENID_FOR_MULTICALL_CREATE, + ) + expect(zoraBalanceInAnvilWallet).toBe(BigInt(zora721.quantity)) + expect( + new Set([ + TOKENID_IN_EOA, + TOKENID1_IN_TBA, + TOKENID2_IN_TBA, + TOKENID_FOR_MULTICALL_CREATE, + ]).size, + ).toBe(4) + }, + TIMEOUT, + ) + + it("can prepareCreateAccount", async () => { + await ensureMintedNFTs() + const prepared = await tokenboundClient.prepareCreateAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + }) + expect(prepared.to).toMatch(ADDRESS_REGEX) + expect(prepared.data).toMatch(/^0x/) + }) + + it("can createAccount", async () => { + await ensureTBA() + expect(ZORA721_TBA_ADDRESS).toMatch(ADDRESS_REGEX) + expect( + await tokenboundClient.checkAccountDeployment({ + accountAddress: ZORA721_TBA_ADDRESS, + }), + ).toBe(true) + }) + + it("can createAccount with a custom salt", async () => { + await ensureTBA() + const salted = tokenboundClient.getAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + salt: 6551, + }) + expect(salted).toMatch(ADDRESS_REGEX) + expect(salted).not.toBe(ZORA721_TBA_ADDRESS) + }) + + v3OnlyIt( + "can createAccount and append multicall transaction(s) that use the deployed TBA", + async () => { + await ensureMintedNFTs() + const multicallTBAAddress = tokenboundClient.getAccount( + NFT_FOR_MULTICALL_CREATE, + ) + + // A simple ERC-20 balanceOf, executed by the newly-created TBA. + const preparedBalanceOfByTBA = + await tokenboundClient.prepareExecution({ + account: multicallTBAAddress, + to: WETH, + value: 0n, + data: encodeFunctionData({ + abi: weth.abi, + functionName: "balanceOf", + args: [multicallTBAAddress], + }), + }) + + const { account: created, txHash } = + await tokenboundClient.createAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_FOR_MULTICALL_CREATE, + appendedCalls: [ + { + target: multicallTBAAddress, + allowFailure: false, + callData: preparedBalanceOfByTBA.data, + }, + ], + }) + + const receipt = await publicClient.waitForTransactionReceipt({ + hash: txHash, + }) + await syncNonce() + + expect(created).toMatch(ADDRESS_REGEX) + expect(receipt.status).toBe("success") + }, + TIMEOUT, + ) + + it("can createAccount with a custom chainId", async () => { + await ensureMintedNFTs() + const HARDHAT_CHAIN_ID = 31337 + const other = tokenboundClient.getAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + chainId: HARDHAT_CHAIN_ID, + }) + expect(other).toMatch(ADDRESS_REGEX) + expect(other).not.toBe(ZORA721_TBA_ADDRESS) + }) + }) + + describe("account reads", () => { + it("can checkAccountDeployment for the created account", async () => { + await ensureTBA() + expect( + await tokenboundClient.checkAccountDeployment({ + accountAddress: ZORA721_TBA_ADDRESS, + }), + ).toBe(true) + }) + + it("can getNFT for the created account", async () => { + await ensureTBA() + const nft = await tokenboundClient.getNFT({ + accountAddress: ZORA721_TBA_ADDRESS, + }) + expect(nft.tokenContract).toBe(zora721.proxyContractAddress) + expect(nft.tokenId).toBe(TOKENID_IN_EOA) + expect(nft.chainId).toBe(mainnet.id) + }) + + it("can deconstructBytecode for the created account", async () => { + await ensureTBA() + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: ZORA721_TBA_ADDRESS, + }) + expect(bytecode).not.toBeNull() + expect(bytecode?.chainId).toBe(mainnet.id) + expect(bytecode?.tokenId).toBe(TOKENID_IN_EOA) + }) + + it("can getAccount", async () => { + await ensureTBA() + expect( + tokenboundClient.getAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + }), + ).toBe(ZORA721_TBA_ADDRESS) + }) + + it("can getAccount with a custom salt", async () => { + await ensureMintedNFTs() + const salted = tokenboundClient.getAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + expect(salted).toMatch(ADDRESS_REGEX) + expect(salted).toEqual(customSaltTBAAddress()) + expect(salted).not.toBe(ZORA721_TBA_ADDRESS) + }) + }) + + describe("funding", () => { + it( + "can transfer one of the minted NFTs to the TBA", + async () => { + await ensureTBA() + await transferNFTToTBA(TOKENID1_IN_TBA) + const owner = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "ownerOf", + args: [BigInt(TOKENID1_IN_TBA)], + }) + expect(getAddress(owner)).toBe(getAddress(ZORA721_TBA_ADDRESS)) + }, + TIMEOUT, + ) + + it( + "can transfer another minted NFT to the TBA", + async () => { + await ensureTBA() + await transferNFTToTBA(TOKENID2_IN_TBA) + const owner = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "ownerOf", + args: [BigInt(TOKENID2_IN_TBA)], + }) + expect(getAddress(owner)).toBe(getAddress(ZORA721_TBA_ADDRESS)) + }, + TIMEOUT, + ) + + it( + "can transfer ETH to the TBA", + async () => { + await ensureTBA() + const before = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + const tx = await signer.sendTransaction({ + to: ZORA721_TBA_ADDRESS, + value: parseUnits("0.5", 18), + nonce: await nextNonce(), + }) + await tx.wait() + await publicClient.waitForTransactionReceipt({ hash: tx.hash as Hex }) + const after = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + expect(after - before).toBe(parseUnits("0.5", 18)) + }, + TIMEOUT, + ) + }) + + describe("execution", () => { + it(isV2 ? "can prepareExecuteCall" : "can prepareExecution", async () => { + const execution = { + account: ZORA721_TBA_ADDRESS, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x" as Hex, + } + const prepared = isV3 + ? await tokenboundClient.prepareExecution(execution) + : await tokenboundClient.prepareExecuteCall(execution) + expect(prepared.to).toBe(ZORA721_TBA_ADDRESS) + expect(prepared.data).toMatch(/^0x/) + }) + + it( + isV2 ? "can executeCall with the TBA" : "can execute with the TBA", + async () => { + await ensureETHInTBA() + const execution = { + account: ZORA721_TBA_ADDRESS, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x" as Hex, + } + const hash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) + expect(hash).toMatch(TX_HASH_REGEX) + const receipt = await publicClient.waitForTransactionReceipt({ hash }) + expect(receipt.status).toBe("success") + await syncNonce() + }, + TIMEOUT, + ) + }) + + describe("transfers", () => { + it( + "can transferETH with the TBA", + async () => { + await ensureETHInTBA() + const before = await publicClient.getBalance({ + address: RECIPIENT_ADDRESS, + }) + const hash = await tokenboundClient.transferETH({ + account: ZORA721_TBA_ADDRESS, + recipientAddress: RECIPIENT_ADDRESS, + amount: 0.1, + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + const after = await publicClient.getBalance({ + address: RECIPIENT_ADDRESS, + }) + expect(after - before).toBe(parseUnits("0.1", 18)) + }, + TIMEOUT, + ) + + it( + "can transferETH to an ENS with the TBA", + async () => { + await ensureETHInTBA() + const resolved = getAddress( + (await signer.provider?.resolveName(ENS_NAME)) as string, + ) + const before = await publicClient.getBalance({ address: resolved }) + const hash = await tokenboundClient.transferETH({ + account: ZORA721_TBA_ADDRESS, + recipientAddress: ENS_NAME, + amount: 0.05, + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + const after = await publicClient.getBalance({ address: resolved }) + expect(after - before).toBe(parseUnits("0.05", 18)) + }, + TIMEOUT, + ) + + it("will not allow transferNFT 721 with an amount other than 1", async () => { + await expect( + tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC721", + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID_IN_EOA, + recipientAddress: getAddress(ANVIL_ACCOUNTS[1].address), + amount: 2, + }), + ).rejects.toThrow(/ERC721 transfers can only transfer one token/) + }) + + it( + "can transferNFT a 721 with the TBA", + async () => { + await ensureNFTsInTBA() + await ensureETHInTBA() + const recipient = getAddress(ANVIL_ACCOUNTS[1].address) + const before = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [recipient], + }) + + const hash = await tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC721", + tokenContract: zora721.proxyContractAddress, + tokenId: TOKENID1_IN_TBA, + recipientAddress: recipient, + }) + expect(hash).toMatch(TX_HASH_REGEX) + const receipt = await publicClient.waitForTransactionReceipt({ hash }) + expect(receipt.status).toBe("success") + await syncNonce() + + const after = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [recipient], + }) + expect(after - before).toBe(1n) + }, + TIMEOUT, + ) + + it( + "can transferNFT to an ENS with the TBA", + async () => { + await ensureETHInTBA() + // Pick a token the TBA still owns: an earlier test may have moved + // TOKENID1_IN_TBA out. + let sendableId: string | undefined + for (const candidate of [TOKENID2_IN_TBA, TOKENID1_IN_TBA]) { + const owner = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "ownerOf", + args: [BigInt(candidate)], + }) + if (isAddressMatch(owner, ZORA721_TBA_ADDRESS)) { + sendableId = candidate + break + } + } + if (!sendableId) { + await transferNFTToTBA(TOKENID2_IN_TBA) + sendableId = TOKENID2_IN_TBA + } + + const resolved = getAddress( + (await signer.provider?.resolveName(ENS_NAME)) as string, + ) + const before = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [resolved], + }) + + const hash = await tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC721", + tokenContract: zora721.proxyContractAddress, + tokenId: sendableId, + recipientAddress: ENS_NAME, + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + + const after = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [resolved], + }) + expect(after - before).toBe(1n) + }, + TIMEOUT, + ) + }) + + describe("minting", () => { + it( + "can mint 4 Zora 721 NFTs with the TBA", + async () => { + await ensureETHInTBA() + const before = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [ZORA721_TBA_ADDRESS], + }) + + const hash = await tokenboundClient.execute({ + account: ZORA721_TBA_ADDRESS, + to: zora721.proxyContractAddress, + value: 0n, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [BigInt(zora721.quantity)], + }), + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + + const after = await publicClient.readContract({ + address: zora721.proxyContractAddress, + abi: zora721.abi, + functionName: "balanceOf", + args: [ZORA721_TBA_ADDRESS], + }) + expect(after - before).toBe(BigInt(zora721.quantity)) + }, + TIMEOUT, + ) + + it( + "can mint an 1155 with the TBA", + async () => { + await ensureETHInTBA(2) + const quantity = 3n + const hash = await tokenboundClient.execute({ + account: ZORA721_TBA_ADDRESS, + to: zora1155.proxyContractAddress, + value: zora1155.mintFee * quantity, + data: encodeFunctionData({ + abi: zora1155.abi, + functionName: "mint", + args: [ + zora1155.fixedPriceSalesStrategy, + zora1155.tokenId, + quantity, + encodeAbiParameters(parseAbiParameters("address"), [ + ZORA721_TBA_ADDRESS, + ]), + ], + }), + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + + const balance = await publicClient.readContract({ + address: zora1155.proxyContractAddress, + abi: zora1155.abi, + functionName: "balanceOf", + args: [ZORA721_TBA_ADDRESS, zora1155.tokenId], + }) + expect(balance).toBeGreaterThanOrEqual(quantity) + }, + TIMEOUT, + ) + + it( + "can transferNFT an 1155 with the TBA", + async () => { + const amount = 2 + await ensure1155sInTBA(amount) + + const recipient = getAddress(ANVIL_ACCOUNTS[1].address) + const before = await publicClient.readContract({ + address: zora1155.proxyContractAddress, + abi: zora1155.abi, + functionName: "balanceOf", + args: [recipient, zora1155.tokenId], + }) + + const hash = await tokenboundClient.transferNFT({ + account: ZORA721_TBA_ADDRESS, + tokenType: "ERC1155", + tokenContract: zora1155.proxyContractAddress, + tokenId: zora1155.tokenId.toString(), + recipientAddress: recipient, + amount, + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + + const after = await publicClient.readContract({ + address: zora1155.proxyContractAddress, + abi: zora1155.abi, + functionName: "balanceOf", + args: [recipient, zora1155.tokenId], + }) + expect(after - before).toBe(BigInt(amount)) + }, + TIMEOUT, + ) + }) + + describe("signing", () => { + v3OnlyIt( + "can verify if a wallet isValidSigner for an owned NFT", + async () => { + await ensureTBA() + expect( + await tokenboundClient.isValidSigner({ + account: ZORA721_TBA_ADDRESS, + }), + ).toBe(true) + }, + ) + + it("can sign a message", async () => { + const signature = await tokenboundClient.signMessage({ + message: "Sign me", + }) + expect(signature).toMatch(ECDSA_SIGNATURE_REGEX) + }) + + it("can sign a hexified message", async () => { + const signature = await tokenboundClient.signMessage({ + message: "0x68656c6c6f20776f726c64", + }) + expect(signature).toMatch(ECDSA_SIGNATURE_REGEX) + }) + + it("can sign a Uint8Array message as raw", async () => { + const signature = await tokenboundClient.signMessage({ + message: new Uint8Array([72, 101, 108, 108, 111]), + }) + expect(signature).toMatch(ECDSA_SIGNATURE_REGEX) + }) + + it( + "can transferERC20 with the TBA", + async () => { + await ensureETHInTBA(2) + const depositHash = await tokenboundClient.execute({ + account: ZORA721_TBA_ADDRESS, + to: WETH, + value: parseUnits("0.2", 18), + data: encodeFunctionData({ + abi: weth.abi, + functionName: "deposit", + }), + }) + await publicClient.waitForTransactionReceipt({ hash: depositHash }) + await syncNonce() + + const recipient = getAddress(ANVIL_ACCOUNTS[1].address) + const before = await publicClient.readContract({ + address: WETH, + abi: weth.abi, + functionName: "balanceOf", + args: [recipient], + }) + + const hash = await tokenboundClient.transferERC20({ + account: ZORA721_TBA_ADDRESS, + recipientAddress: recipient, + amount: 0.1, + erc20tokenAddress: WETH, + erc20tokenDecimals: 18, + }) + await publicClient.waitForTransactionReceipt({ hash }) + await syncNonce() + + const after = await publicClient.readContract({ + address: WETH, + abi: weth.abi, + functionName: "balanceOf", + args: [recipient], + }) + expect(after - before).toBe(parseUnits("0.1", 18)) + }, + TIMEOUT, + ) + }) + + describe("ethers-specific", () => { + it("detects the correct ethers version", () => { + expect(tokenboundClient.getEthersVersion()).toBe(version) + }) + + it("rejects out-of-range ERC-20 decimals", async () => { + await expect( + tokenboundClient.transferERC20({ + account: ZORA721_TBA_ADDRESS, + recipientAddress: RECIPIENT_ADDRESS, + amount: 1, + erc20tokenAddress: WETH, + erc20tokenDecimals: 19, + }), + ).rejects.toThrow(/Decimal value out of range/) + }) + }) + }, +) diff --git a/packages/ethers/src/test/v2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts similarity index 78% rename from packages/ethers/src/test/v2.test.ts rename to packages/ethers/src/test/TestAllEthersV2.test.ts index 78b8108..f66d80e 100644 --- a/packages/ethers/src/test/v2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -1,14 +1,23 @@ -// Legacy ERC-6551 V2 deployment coverage for @tokenbound/ethers. +// V2-SPECIFIC assertions for @tokenbound/ethers. // -// The rest of the suite exercises the default V3 deployment. This file pins -// `version: TBVersion.V2` so the V2-only branches of the client — the legacy -// `prepareExecuteCall`/`executeCall` path, the V3-only guards, and V2 address -// derivation — are exercised on BOTH ethers majors. +// TestAllEthers now runs its full suite against BOTH deployments (V2 and V3) on +// both ethers majors, so general behaviour under V2 is covered there. What +// lives here is only what is meaningful for V2 alone: legacy address +// derivation, the legacy registry identity, the `prepareExecuteCall`/ +// `executeCall` encoding, and the guards that reject V3-only surface. // // Lives in its own file (and its own anvil instances) for the same reason as // transfer.test.ts: ethers caches pending nonces per provider. import { ERC_6551_LEGACY_V2, TBVersion } from "@tokenbound/sdk" +import { + ADDRESS_REGEX, + ANVIL_ACCOUNTS, + CREATE_ANVIL_OPTIONS, + isAddressMatch, + TX_HASH_REGEX, + zora721, +} from "@tokenbound/test-fixtures" import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" import { JsonRpcProvider, Wallet } from "ethers6" @@ -16,33 +25,25 @@ import { createPublicClient, encodeFunctionData, getAddress, + type Hex, http, isAddress, type PublicClient, - parseAbi, } from "viem" import { mainnet } from "viem/chains" import { afterAll, beforeAll, describe, expect, it } from "vitest" import { TokenboundClient } from "../index" -import { ADDRESS_REGEX, ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" const TIMEOUT = 60000 -const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const -const ZORA_721_ABI = parseAbi([ - "function purchase(uint256 quantity) external payable returns (uint256)", -]) - -const FORK_URL = - process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? - "https://ethereum-rpc.publicnode.com" - describe.each([{ version: 5 as const }, { version: 6 as const }])( "ethers v$version — ERC-6551 V2 deployment", ({ version }) => { - const port = 9000 + (version === 5 ? 0 : 1) - const rpcUrl = `http://127.0.0.1:${port}` - const anvil = createAnvil({ forkUrl: FORK_URL, port }) + // No explicit port: variants run sequentially and each afterAll stops + // anvil before the next beforeAll starts, so they can share the default + // port — same as the viem suite. + const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + const rpcUrl = `http://127.0.0.1:${anvil.port}` let publicClient: PublicClient let tokenboundClient: TokenboundClient @@ -71,16 +72,15 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( tokenboundClient = new TokenboundClient({ signer, chain: mainnet, - publicClient, version: TBVersion.V2, }) // Mint the NFT that controls the account. const mint = await signer.sendTransaction({ - to: TOKEN_CONTRACT, + to: zora721.proxyContractAddress, value: 0n, data: encodeFunctionData({ - abi: ZORA_721_ABI, + abi: zora721.abi, functionName: "purchase", args: [1n], }), @@ -90,11 +90,11 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( // signer's view stale and the next send fails with "nonce too low". await mint.wait() const receipt = await publicClient.waitForTransactionReceipt({ - hash: mint.hash as `0x${string}`, + hash: mint.hash as Hex, }) const transferLog = receipt.logs.find( (log) => - log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && + isAddressMatch(log.address, zora721.proxyContractAddress) && log.topics.length === 4, ) if (!transferLog?.topics[3]) { @@ -113,7 +113,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( it("derives a V2 account address", () => { const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) expect(isAddress(account)).toBe(true) @@ -122,7 +122,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( it("derives a different address than the V3 deployment", () => { const v2Account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) @@ -139,11 +139,13 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( new JsonRpcProvider(rpcUrl), ), chain: mainnet, - publicClient, }) expect( - v3Client.getAccount({ tokenContract: TOKEN_CONTRACT, tokenId }), + v3Client.getAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId, + }), ).not.toBe(v2Account) }) @@ -151,7 +153,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( // A V2 client must derive against the V2 registry, so its address // differs from one built on a custom registry. const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) expect(account).toMatch(ADDRESS_REGEX) @@ -162,7 +164,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( "creates a V2 tokenbound account on-chain", async () => { const { account, txHash } = await tokenboundClient.createAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) expect(account).toMatch(ADDRESS_REGEX) @@ -186,7 +188,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( "prepares a legacy executeCall (V2-only path)", async () => { const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) @@ -207,7 +209,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( "routes prepareExecution through the V2 executeCall encoding", async () => { const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) const args = { @@ -229,7 +231,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( it("rejects isValidSigner on a V2 deployment", async () => { const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, }) await expect(tokenboundClient.isValidSigner({ account })).rejects.toThrow( @@ -240,11 +242,11 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( it("rejects appendedCalls on a V2 deployment", async () => { await expect( tokenboundClient.prepareCreateAccount({ - tokenContract: TOKEN_CONTRACT, + tokenContract: zora721.proxyContractAddress, tokenId, appendedCalls: [ { - target: getAddress(TOKEN_CONTRACT), + target: getAddress(zora721.proxyContractAddress), allowFailure: false, callData: "0x", }, diff --git a/packages/ethers/src/test/adapter.test.ts b/packages/ethers/src/test/TestEthersVersions.test.ts similarity index 73% rename from packages/ethers/src/test/adapter.test.ts rename to packages/ethers/src/test/TestEthersVersions.test.ts index 9af9675..9325de1 100644 --- a/packages/ethers/src/test/adapter.test.ts +++ b/packages/ethers/src/test/TestEthersVersions.test.ts @@ -92,6 +92,55 @@ describe("resolveAdapter", () => { }) }) +describe("reads via the signer's Provider", () => { + it("routes getCode through the provider", async () => { + const getCode = vi.fn(async () => "0xdeadbeef") + const adapter = resolveAdapter(makeV6Signer({ provider: { getCode } })) + expect( + await adapter.getCode("0x000000000000000000000000000000000000c0de"), + ).toBe("0xdeadbeef") + expect(getCode).toHaveBeenCalledOnce() + }) + + it("routes call through the provider", async () => { + const call = vi.fn(async () => "0x523e3260") + const adapter = resolveAdapter(makeV5Signer({ provider: { call } })) + expect( + await adapter.call({ + to: "0x000000000000000000000000000000000000c0de", + data: "0x", + }), + ).toBe("0x523e3260") + }) + + it("routes ENS resolution through the provider", async () => { + // An arbitrary address — deliberately NOT a Tokenbound contract, so a + // mix-up with the registry/implementation can't pass unnoticed. + const RESOLVED = "0x000000000000000000000000000000000000d00d" + const resolveName = vi.fn(async () => RESOLVED) + const adapter = resolveAdapter(makeV6Signer({ provider: { resolveName } })) + expect(await adapter.resolveName("jeebay.eth")).toBe(RESOLVED) + }) + + it("throws a clear error when the signer has no provider", async () => { + // A Wallet constructed without a provider can still sign, but cannot read. + const adapter = resolveAdapter(makeV6Signer({ provider: null })) + await expect( + adapter.getCode("0x000000000000000000000000000000000000c0de"), + ).rejects.toThrow(/must be connected to a Provider/) + }) + + it("reports the same error for v5 signers without a provider", async () => { + const adapter = resolveAdapter(makeV5Signer({ provider: undefined })) + await expect( + adapter.call({ + to: "0x000000000000000000000000000000000000c0de", + data: "0x", + }), + ).rejects.toThrow(/must be connected to a Provider/) + }) +}) + describe("message normalization", () => { it("passes strings through unchanged on v5 and v6", () => { expect(normalizeV5Message("gm")).toBe("gm") diff --git a/packages/ethers/src/test/TestSharedFixtures.test.ts b/packages/ethers/src/test/TestSharedFixtures.test.ts new file mode 100644 index 0000000..213e729 --- /dev/null +++ b/packages/ethers/src/test/TestSharedFixtures.test.ts @@ -0,0 +1,29 @@ +// Guards the shared-fixture contract: if either suite starts using a different +// contract, account or recipient, this fails instead of silently diverging. + +import { + ANVIL_ACCOUNTS, + ETH_ADDRESS_REGEX, + RECIPIENT_ADDRESS, + WETH_CONTRACT_ADDRESS, + ZORA_721, + ZORA_1155, +} from "@tokenbound/test-fixtures" +import { describe, expect, it } from "vitest" + +describe("shared fixtures", () => { + it("exposes the contracts both suites transact against", () => { + expect(ZORA_721.address).toMatch(ETH_ADDRESS_REGEX) + expect(ZORA_1155.address).toMatch(ETH_ADDRESS_REGEX) + expect(WETH_CONTRACT_ADDRESS).toMatch(ETH_ADDRESS_REGEX) + }) + + it("uses a recipient that is not a Tokenbound contract", () => { + expect(RECIPIENT_ADDRESS).toMatch(ETH_ADDRESS_REGEX) + }) + + it("exposes the anvil accounts both suites sign with", () => { + expect(ANVIL_ACCOUNTS).toHaveLength(2) + expect(ANVIL_ACCOUNTS[0].address).toMatch(ETH_ADDRESS_REGEX) + }) +}) diff --git a/packages/ethers/src/test/constants.ts b/packages/ethers/src/test/constants.ts deleted file mode 100644 index c3b80ef..0000000 --- a/packages/ethers/src/test/constants.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const ANVIL_RPC_URL = "http://127.0.0.1:8545" - -export const ANVIL_ACCOUNTS = [ - { - address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - privateKey: - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - }, - { - address: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - privateKey: - "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", - }, -] as const - -export const ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/ -export const TX_HASH_REGEX = /^0x[a-fA-F0-9]{64}$/ diff --git a/packages/ethers/src/test/integration.test.ts b/packages/ethers/src/test/integration.test.ts deleted file mode 100644 index 6814e20..0000000 --- a/packages/ethers/src/test/integration.test.ts +++ /dev/null @@ -1,317 +0,0 @@ -// Anvil-backed integration tests for @tokenbound/ethers. -// -// ethers v5 and ethers v6 are exercised INDEPENDENTLY against a fresh anvil -// fork each, so a behavioral difference in one major version cannot be masked -// by the other. - -import { createAnvil } from "@viem/anvil" -import { ethers } from "ethers" -import { JsonRpcProvider, Wallet } from "ethers6" -import { - createPublicClient, - encodeFunctionData, - http, - isAddress, - type PublicClient, - parseAbi, -} from "viem" -import { mainnet } from "viem/chains" -import { afterAll, beforeAll, describe, expect, it } from "vitest" - -import { TokenboundClient } from "../index" -import { ADDRESS_REGEX, ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" - -const TIMEOUT = 60000 - -// Zora "Webb's First Deep Field" — an open, free public mint on mainnet, so the -// anvil account can mint itself the NFT that controls the tokenbound account. -const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const -const ZORA_721_ABI = parseAbi([ - "function purchase(uint256 quantity) external payable returns (uint256)", - "function totalSupply() external view returns (uint256)", - "function ownerOf(uint256 tokenId) external view returns (address)", -]) - -// Set in beforeAll once the anvil account has minted. -let TOKEN_ID = "1" - -const FORK_URL = - process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? - "https://ethereum-rpc.publicnode.com" - -/** Each ethers major version gets its own anvil so nonces never collide. */ -const PORT_FOR_VERSION = { 5: 8545, 6: 8546 } as const - -const rpcUrlFor = (version: 5 | 6) => - `http://127.0.0.1:${PORT_FOR_VERSION[version]}` - -/** Builds a signer for the requested ethers major version and anvil account. */ -function makeSignerForAccount(version: 5 | 6, accountIndex: 0 | 1) { - const rpcUrl = rpcUrlFor(version) - const { privateKey } = ANVIL_ACCOUNTS[accountIndex] - if (version === 5) { - const provider = new ethers.providers.JsonRpcProvider(rpcUrl) - return new ethers.Wallet(privateKey, provider) - } - const provider = new JsonRpcProvider(rpcUrl) - return new Wallet(privateKey, provider) -} - -/** Builds a signer on anvil account #0 for the requested ethers version. */ -function makeSigner(version: 5 | 6) { - return makeSignerForAccount(version, 0) -} - -describe.each([{ version: 5 as const }, { version: 6 as const }])( - "ethers v$version", - ({ version }) => { - const anvil = createAnvil({ - forkUrl: FORK_URL, - port: PORT_FOR_VERSION[version], - }) - let tokenboundClient: TokenboundClient - let publicClient: PublicClient - // One signer per version: separate ethers signers on the same account - // track nonces independently and collide. - let signer: ReturnType - - beforeAll(async () => { - await anvil.start() - - publicClient = createPublicClient({ - chain: mainnet, - transport: http(rpcUrlFor(version)), - }) as PublicClient - - // Mint a Zora 721 into the anvil account so it owns the NFT that - // controls the tokenbound account under test. - signer = makeSigner(version) - const mintTx = await signer.sendTransaction({ - to: TOKEN_CONTRACT, - value: 0n, - data: encodeFunctionData({ - abi: ZORA_721_ABI, - functionName: "purchase", - args: [1n], - }), - }) - await mintTx.wait() - - // Read the minted tokenId out of the Transfer log rather than guessing - // from totalSupply, which is not the minted id on this contract. - const mintReceipt = await publicClient.waitForTransactionReceipt({ - hash: mintTx.hash as `0x${string}`, - }) - const transferLog = mintReceipt.logs.find( - (log) => - log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && - log.topics[0] === - "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef" && - log.topics.length === 4, - ) - if (!transferLog?.topics[3]) { - throw new Error("Could not determine minted tokenId from mint receipt") - } - TOKEN_ID = BigInt(transferLog.topics[3]).toString() - const owner = await publicClient.readContract({ - address: TOKEN_CONTRACT, - abi: ZORA_721_ABI, - functionName: "ownerOf", - args: [BigInt(TOKEN_ID)], - }) - if (owner.toLowerCase() !== ANVIL_ACCOUNTS[0].address.toLowerCase()) { - throw new Error(`Minted token ${TOKEN_ID} is owned by ${owner}`) - } - - tokenboundClient = new TokenboundClient({ - signer, - chain: mainnet, - publicClient, - }) - }, TIMEOUT) - - afterAll(async () => { - await anvil.stop() - }) - - it("detects the correct ethers version", () => { - expect(tokenboundClient.getEthersVersion()).toBe(version) - }) - - it("derives a tokenbound account address", () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - expect(isAddress(account)).toBe(true) - expect(account).toMatch(ADDRESS_REGEX) - }) - - it("derives the same address across both ethers versions", () => { - // Derivation is deterministic and client-independent, so v5 and v6 - // must agree with each other. - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - // Derivation is pure, so a read-only client on the other ethers major - // version must produce the same address. - const other = new TokenboundClient({ - signer: makeSigner(version === 5 ? 6 : 5), - chain: mainnet, - publicClient, - }).getAccount({ tokenContract: TOKEN_CONTRACT, tokenId: TOKEN_ID }) - expect(account).toBe(other) - }) - - it("honours a custom salt", () => { - const base = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - const salted = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - salt: 6551, - }) - expect(salted).not.toBe(base) - }) - - it("prepares a create-account transaction", async () => { - const prepared = await tokenboundClient.prepareCreateAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - expect(prepared.data).toMatch(/^0x/) - expect(prepared.to).toMatch(ADDRESS_REGEX) - }) - - it( - "creates a tokenbound account on-chain", - async () => { - const { account, txHash } = await tokenboundClient.createAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - - expect(account).toMatch(ADDRESS_REGEX) - expect(txHash).toMatch(TX_HASH_REGEX) - - const receipt = await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) - expect(receipt.status).toBe("success") - }, - TIMEOUT, - ) - - it( - "reports the account as deployed after creation", - async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - const isDeployed = await tokenboundClient.checkAccountDeployment({ - accountAddress: account, - }) - expect(isDeployed).toBe(true) - }, - TIMEOUT, - ) - - it( - "deconstructs the deployed account bytecode", - async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - const bytecode = await tokenboundClient.deconstructBytecode({ - accountAddress: account, - }) - expect(bytecode).not.toBeNull() - expect(bytecode?.chainId).toBe(mainnet.id) - expect(bytecode?.tokenId).toBe(TOKEN_ID) - }, - TIMEOUT, - ) - - it( - "returns the owning NFT for a deployed account", - async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - const nft = await tokenboundClient.getNFT({ accountAddress: account }) - expect(nft.tokenId).toBe(TOKEN_ID) - expect(nft.chainId).toBe(mainnet.id) - }, - TIMEOUT, - ) - - it( - "prepares an execution against the account", - async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - const prepared = await tokenboundClient.prepareExecution({ - account, - to: ANVIL_ACCOUNTS[1].address, - value: 0n, - data: "0x", - }) - expect(prepared.to).toBe(account) - expect(prepared.data).toMatch(/^0x/) - }, - TIMEOUT, - ) - - it( - "signs a message", - async () => { - const signature = await tokenboundClient.signMessage({ - message: "Sign me", - }) - expect(signature).toMatch(/^0x[a-fA-F0-9]+$/) - }, - TIMEOUT, - ) - - it("rejects out-of-range ERC-20 decimals", async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - await expect( - tokenboundClient.transferERC20({ - account, - recipientAddress: ANVIL_ACCOUNTS[1].address, - amount: 1, - erc20tokenAddress: TOKEN_CONTRACT, - erc20tokenDecimals: 19, - }), - ).rejects.toThrow(/Decimal value out of range/) - }) - - it("rejects ERC721 transfers with an amount other than 1", async () => { - const account = tokenboundClient.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - }) - await expect( - tokenboundClient.transferNFT({ - account, - tokenType: "ERC721", - tokenContract: TOKEN_CONTRACT, - tokenId: TOKEN_ID, - recipientAddress: ANVIL_ACCOUNTS[1].address, - amount: 2, - }), - ).rejects.toThrow(/ERC721 transfers can only transfer one token/) - }) - }, -) diff --git a/packages/ethers/src/test/transfer.test.ts b/packages/ethers/src/test/transfer.test.ts deleted file mode 100644 index 5fcc732..0000000 --- a/packages/ethers/src/test/transfer.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -// ETH transfer through a tokenbound account, ethers v5 and v6. -// -// Lives in its own file (and therefore its own anvil instances) because the -// flow mints, deploys and spends in sequence: sharing an account's nonce -// stream with another suite makes ethers v6's per-provider nonce cache stale. - -import { createAnvil } from "@viem/anvil" -import { ethers } from "ethers" -import { JsonRpcProvider, Wallet } from "ethers6" -import { - createPublicClient, - createTestClient, - encodeFunctionData, - getAddress, - http, - type PublicClient, - parseAbi, -} from "viem" -import { mainnet } from "viem/chains" -import { afterAll, beforeAll, describe, expect, it, vi } from "vitest" - -import { TokenboundClient } from "../index" -import { ANVIL_ACCOUNTS, TX_HASH_REGEX } from "./constants" - -const TIMEOUT = 60000 - -const TOKEN_CONTRACT = "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d" as const -const ZORA_721_ABI = parseAbi([ - "function purchase(uint256 quantity) external payable returns (uint256)", -]) - -const FORK_URL = - process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? - "https://ethereum-rpc.publicnode.com" - -describe.each([{ version: 5 as const }, { version: 6 as const }])( - "ethers v$version — ETH transfer", - ({ version }) => { - // Randomized so a lingering anvil from a previous run can't be reused — - // connecting to a stale instance yields already-spent nonces. - const port = - 8600 + Math.floor(Math.random() * 300) + (version === 5 ? 0 : 300) - const rpcUrl = `http://127.0.0.1:${port}` - const anvil = createAnvil({ forkUrl: FORK_URL, port }) - - let publicClient: PublicClient - let testClient: ReturnType - - beforeAll(async () => { - await anvil.start() - publicClient = createPublicClient({ - chain: mainnet, - transport: http(rpcUrl), - }) as PublicClient - testClient = createTestClient({ - chain: mainnet, - mode: "anvil", - transport: http(rpcUrl), - }) - }, TIMEOUT) - - afterAll(async () => { - await anvil.stop() - }) - - it( - "transfers ETH out of a tokenbound account", - async () => { - const { privateKey } = ANVIL_ACCOUNTS[version === 5 ? 0 : 1] - const signer = - version === 5 - ? new ethers.Wallet( - privateKey, - new ethers.providers.JsonRpcProvider(rpcUrl), - ) - : new Wallet(privateKey, new JsonRpcProvider(rpcUrl)) - - const client = new TokenboundClient({ - signer, - chain: mainnet, - publicClient, - }) - - // Mint the NFT that will control the account. - const mint = await signer.sendTransaction({ - to: TOKEN_CONTRACT, - value: 0n, - data: encodeFunctionData({ - abi: ZORA_721_ABI, - functionName: "purchase", - args: [1n], - }), - }) - const mintReceipt = await publicClient.waitForTransactionReceipt({ - hash: mint.hash as `0x${string}`, - }) - const transferLog = mintReceipt.logs.find( - (log) => - log.address.toLowerCase() === TOKEN_CONTRACT.toLowerCase() && - log.topics.length === 4, - ) - if (!transferLog?.topics[3]) { - throw new Error("Could not determine minted tokenId") - } - const tokenId = BigInt(transferLog.topics[3]).toString() - - const account = client.getAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId, - }) - - await mint.wait() - - const { txHash: createHash } = await client.createAccount({ - tokenContract: TOKEN_CONTRACT, - tokenId, - }) - await publicClient.waitForTransactionReceipt({ hash: createHash }) - - // Wait until the signer's provider sees the same nonce as the chain; - // ethers v6 caches the pending count and can otherwise reuse it. - const signerAddress = getAddress(await signer.getAddress()) - await vi.waitFor(async () => { - const onChain = await publicClient.getTransactionCount({ - address: signerAddress, - }) - const provider = signer.provider - if (!provider) throw new Error("signer has no provider") - const fromEthers = await provider.getTransactionCount( - signerAddress, - "pending", - ) - expect(fromEthers).toBe(onChain) - }) - - // Fund via anvil rather than a second ethers transaction. - await testClient.setBalance({ address: account, value: 10n ** 18n }) - - // A fresh address nothing else touches, so the credit is unambiguous. - const recipient = getAddress( - "0x000000000000000000000000000000000000d00d", - ) - const recipientBefore = await publicClient.getBalance({ - address: recipient, - }) - const accountBefore = await publicClient.getBalance({ - address: account, - }) - - const txHash = await client.transferETH({ - account, - recipientAddress: recipient, - amount: 0.1, - }) - expect(txHash).toMatch(TX_HASH_REGEX) - - const receipt = await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) - expect(receipt.status).toBe("success") - - const recipientAfter = await publicClient.getBalance({ - address: recipient, - }) - const accountAfter = await publicClient.getBalance({ address: account }) - - // The TBA pays no gas (the signer does), so both sides move by - // exactly the transferred amount. - expect(recipientAfter - recipientBefore).toBe(10n ** 17n) - expect(accountBefore - accountAfter).toBe(10n ** 17n) - }, - TIMEOUT, - ) - }, -) diff --git a/packages/ethers/vite.config.ts b/packages/ethers/vite.config.ts index 02e5002..3f077ff 100644 --- a/packages/ethers/vite.config.ts +++ b/packages/ethers/vite.config.ts @@ -12,7 +12,7 @@ export default defineConfig({ sourcemap: true, rollupOptions: { // ethers, viem and the core SDK are all consumer-supplied. - external: ["viem", "viem/ens", "ethers", "@tokenbound/sdk"], + external: ["viem", "viem/utils", "viem/ens", "ethers", "@tokenbound/sdk"], output: { globals: { viem: "viem", diff --git a/packages/sdk/README.md b/packages/sdk/README.md index e9387c3..1161846 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -1,90 +1,114 @@ # @tokenbound/sdk -An SDK for interacting with [ERC-6551 accounts](https://eips.ethereum.org/EIPS/eip-6551) using viem. +A viem-first SDK for interacting with [ERC-6551 accounts](https://eips.ethereum.org/EIPS/eip-6551). -# Installation +Ethers v5 / v6 users want [`@tokenbound/ethers`](https://github.com/tokenbound/sdk/tree/main/packages/ethers), which adapts this package to an ethers `Signer`. + +## Installation ```bash -$ npm install @tokenbound/sdk +npm install @tokenbound/sdk viem ``` -# Usage +
+pnpm / yarn / bun -### Instantiate TokenboundClient +```bash +pnpm add @tokenbound/sdk viem +``` -Using viem's WalletClient: +```bash +yarn add @tokenbound/sdk viem +``` -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -import { goerli } from 'viem/chains' -const tokenboundClient = new TokenboundClient({ walletClient, chainId: goerli.id }); +```bash +bun add @tokenbound/sdk viem ``` -or, with a legacy Wagmi / Ethers signer: +
+ +`viem` is a peer dependency. + +## Usage + +There are two equivalent APIs. Both run the same protocol code, so pick whichever fits your codebase. + +### The viem client extension (recommended) + +Decorates a viem client, namespacing everything under `.tokenbound`: + +```ts +import { createWalletClient, custom } from "viem" +import { mainnet } from "viem/chains" +import { tokenboundActions } from "@tokenbound/sdk/viem" -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -const tokenboundClient = new TokenboundClient({ signer, chainId: 1 }); +const client = createWalletClient({ + chain: mainnet, + account, + transport: custom(window.ethereum), +}).extend(tokenboundActions()) + +const account = client.tokenbound.getAccount({ tokenContract, tokenId }) +await client.tokenbound.createAccount({ tokenContract, tokenId }) ``` -### Get account address +A client without an account gets only the read actions; one carrying an account gets the full set. + +### The TokenboundClient class + +```ts +import { TokenboundClient } from "@tokenbound/sdk" +import { mainnet } from "viem/chains" -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -import { goerli } from 'viem/chains'; -const tokenboundClient = new TokenboundClient({ walletClient, chainId: goerli.id }); +const tokenboundClient = new TokenboundClient({ walletClient, chain: mainnet }) -const tokenBoundAccount = tokenboundClient.getAccount({ +const tokenboundAccount = tokenboundClient.getAccount({ tokenContract: "", tokenId: "", -}); +}) ``` -### Encode call to account - -```javascript -import { prepareExecuteCall } from "@tokenbound/sdk"; +`chain` is required — pass a viem `Chain`, not a chain id. -const to = "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb"; // any address -const value = 0n; // amount of ETH to send in WEI -const data = ""; // calldata +### Encode a call to an account -const preparedCall = await tokenboundClient.prepareExecuteCall({ +```ts +const preparedCall = await tokenboundClient.prepareExecution({ account: "", to: "", - value: value, - data: data, -}); + value: 0n, + data: "0x", +}) -// Execute encoded call -const hash = await walletClient.sendTransaction(preparedCall); +const hash = await walletClient.sendTransaction(preparedCall) ``` -### Custom Implementations +### Custom implementations -The SDK supports custom 6551 implementations. - -If you've deployed your own implementation, you can optionally pass custom configuration parameters when instantiating your TokenboundClient: - -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; +The SDK supports custom ERC-6551 implementations: +```ts const tokenboundClient = new TokenboundClient({ - signer: , - chainId: , - implementationAddress: "", + walletClient, + chain: mainnet, + implementationAddress: "", }) -// Custom implementation AND custom registry (uncommon for most implementations) -const tokenboundClientWithCustomRegistry = new TokenboundClient({ - signer: , - chainId: , - implementationAddress: "", - registryAddress: "", +// Custom implementation AND custom registry (uncommon) +const withCustomRegistry = new TokenboundClient({ + walletClient, + chain: mainnet, + implementationAddress: "", + registryAddress: "", }) +``` -### Documentation +The same options are accepted by the client extension: + +```ts +.extend(tokenboundActions({ implementationAddress, registryAddress })) +``` -See the [Tokenbound docs](https://docs.tokenbound.org/sdk/installation) for complete documentation. +## Documentation -``` \ No newline at end of file +See the [Tokenbound docs](https://docs.tokenbound.org/sdk/installation) for complete documentation, and the [repository README](https://github.com/tokenbound/sdk#readme) for the full method reference. diff --git a/packages/sdk/package.json b/packages/sdk/package.json index a8613a3..4e7671e 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -62,16 +62,17 @@ }, "dependencies": { "@layerzerolabs/lz-v2-utilities": "^3.0.168", - "viem": "^2.56.5" + "viem": "~2.56.6" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "2.5.14", + "@tokenbound/test-fixtures": "workspace:*", "@viem/anvil": "^0.0.10", "@vitest/coverage-v8": "^1.6.1", "@wagmi/cli": "^2.10.0", "rollup-plugin-visualizer": "^5.12.0", "typescript": "^5.4.5", - "viem": "^2.56.5", + "viem": "~2.56.6", "vite": "^4.4.9", "vite-plugin-dts": "^3.9.0", "vitest": "^1.6.0" diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index 34bc166..a96bffb 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -57,13 +57,17 @@ declare global { } class TokenboundClient { - private chainId: number private chain: Chain public isInitialized = false public publicClient: PublicClient private walletClient?: WalletClient private deployment: ResolvedDeployment + /** Always the configured chain's id; derived rather than stored separately. */ + private get chainId(): number { + return this.chain.id + } + constructor(options: TokenboundClientOptions) { const { chain, @@ -87,7 +91,6 @@ class TokenboundClient { ) } - this.chainId = chain.id this.chain = chain this.walletClient = walletClient @@ -449,26 +452,21 @@ class TokenboundClient { chainId, } = params - try { - const recipient = await resolvePossibleENS( - this.publicClient, - recipientAddress, - ) + const recipient = await resolvePossibleENS( + this.publicClient, + recipientAddress, + ) - const transfer = encodeNFTTransfer({ - account: tbAccountAddress, - tokenType, - tokenContract, - tokenId, - recipient, - amount, - }) + const transfer = encodeNFTTransfer({ + account: tbAccountAddress, + tokenType, + tokenContract, + tokenId, + recipient, + amount, + }) - return await this.executeTransfer(tbAccountAddress, transfer, chainId) - } catch (error) { - console.log(error) - throw error - } + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } /** @@ -486,19 +484,14 @@ class TokenboundClient { chainId, } = params - try { - const recipient = await resolvePossibleENS( - this.publicClient, - recipientAddress, - ) + const recipient = await resolvePossibleENS( + this.publicClient, + recipientAddress, + ) - const transfer = encodeETHTransfer({ recipient, amount }) + const transfer = encodeETHTransfer({ recipient, amount }) - return await this.executeTransfer(tbAccountAddress, transfer, chainId) - } catch (err) { - console.log(err) - throw err - } + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } /** @@ -524,24 +517,19 @@ class TokenboundClient { if (erc20tokenDecimals < 0 || erc20tokenDecimals > 18) throw new Error("Decimal value out of range. Should be between 0 and 18.") - try { - const recipient = await resolvePossibleENS( - this.publicClient, - recipientAddress, - ) + const recipient = await resolvePossibleENS( + this.publicClient, + recipientAddress, + ) - const transfer = encodeERC20Transfer({ - recipient, - amount, - erc20tokenAddress, - erc20tokenDecimals, - }) + const transfer = encodeERC20Transfer({ + recipient, + amount, + erc20tokenAddress, + erc20tokenDecimals, + }) - return await this.executeTransfer(tbAccountAddress, transfer, chainId) - } catch (error) { - console.log(error) - throw error - } + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } /** Routes an encoded transfer through execute() or the legacy executeCall(). */ @@ -567,18 +555,13 @@ class TokenboundClient { const { message } = params const walletClient = this.requireWalletClient() - try { - if (!walletClient.account) { - throw new Error("No account available on the wallet client.") - } - return await walletClient.signMessage({ - account: walletClient.account, - message: message as SignableMessage, - }) - } catch (error) { - console.log(error) - throw error + if (!walletClient.account) { + throw new Error("No account available on the wallet client.") } + return await walletClient.signMessage({ + account: walletClient.account, + message: message as SignableMessage, + }) } } diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index c2a8a2d..c3b1662 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -53,6 +53,7 @@ export type { GetCreationCodeParams, MultiCallTx, NFTTransferParams, + PossibleENSAddress, PrepareCreateAccountParams, PrepareExecuteCallParams, PrepareExecutionParams, diff --git a/packages/sdk/src/test/TestAll.test.ts b/packages/sdk/src/test/TestAllViem.test.ts similarity index 94% rename from packages/sdk/src/test/TestAll.test.ts rename to packages/sdk/src/test/TestAllViem.test.ts index 30a4e44..3d925cf 100644 --- a/packages/sdk/src/test/TestAll.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -1,6 +1,23 @@ -// This suite tests Tokenbound SDK methods with -// a viem walletClient + publicClient. +// Tokenbound SDK behaviour via a viem walletClient + publicClient. +// +// packages/ethers/src/test/TestAllEthers.test.ts mirrors this file: the same +// describe blocks and the same `it` names, run against ethers v5 and v6. Keep +// the two in step — if you add a case here, add its counterpart there. +import { + ADDRESS_REGEX, + ANVIL_ACCOUNTS, + ANVIL_CONFIG, + ANVIL_RPC_URL, + CREATE_ANVIL_OPTIONS, + isAddressMatch, + TEST_CONFIG, + testLog, + WETH_CONTRACT_ADDRESS, + weth, + zora721, + zora1155, +} from "@tokenbound/test-fixtures" import { createAnvil } from "@viem/anvil" import { createTestClient, @@ -28,19 +45,6 @@ import { type CreateAccountParams, TokenboundClient } from "../" import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../protocol/constants" import { type Call3, type TBImplementationVersion, TBVersion } from "../types" import { resolvePossibleENS } from "../utils" -import { - ANVIL_CONFIG, - CREATE_ANVIL_OPTIONS, - TEST_CONFIG, - zora721, - zora1155, -} from "./config" -import { - ADDRESS_REGEX, - ANVIL_ACCOUNTS, - ANVIL_RPC_URL, - WETH_CONTRACT_ADDRESS, -} from "./constants" import { ethToWei, getPublicClient, @@ -49,7 +53,6 @@ import { // debugTransaction, getZora1155Balance, } from "./utils" -import { wethABI } from "./wagmi-cli-hooks/generated" const TIMEOUT = 60000 // default 10000 const ANVIL_USER_0 = getAddress(ANVIL_ACCOUNTS[0].address) @@ -107,6 +110,15 @@ describe.each(ENABLED_TESTS)( const ERC6551_DEPLOYMENT = isV2 ? ERC_6551_LEGACY_V2 : ERC_6551_DEFAULT + // V3 is the client's default deployment, so it takes no overrides. V2 has + // to be pinned explicitly to the legacy implementation and registry. + const DEPLOYMENT_OVERRIDES = isV3 + ? {} + : { + implementationAddress: ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, + registryAddress: ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, + } + // Spin up a fresh anvil instance each time we run the test suite against a different configuration beforeAll(async () => { try { @@ -117,12 +129,7 @@ describe.each(ENABLED_TESTS)( chain: ANVIL_CONFIG.ACTIVE_CHAIN, walletClient, publicClient, - implementationAddress: isV3 - ? undefined - : ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, - registryAddress: isV3 - ? undefined - : ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, + ...DEPLOYMENT_OVERRIDES, }) await anvil.start() @@ -133,15 +140,19 @@ describe.each(ENABLED_TESTS)( // Clear it so the account behaves as a plain EOA. await testClient.setCode({ address: ANVIL_USER_1, bytecode: "0x" }) - console.log(`START → \x1b[94m ${testName} \x1b[0m`) + testLog(`START → \x1b[94m ${testName} \x1b[0m`) } catch (err) { + // Rethrow: a failed setup (anvil not starting, fork RPC unreachable) + // must fail the suite here, not surface as confusing failures in + // every downstream test. console.error("Error during setup:", err) + throw err } }, TIMEOUT) afterAll(async () => { await anvil.stop() - console.log(`END → \x1b[94m ${testName} \x1b[0m`) + testLog(`END → \x1b[94m ${testName} \x1b[0m`) }) // --------------------------------------------------------------------- @@ -194,10 +205,8 @@ describe.each(ENABLED_TESTS)( // so every Transfer log is here and this stays deterministic regardless // of how the node batches event notifications. const mintedIds = receipt.logs - .filter( - (log) => - log.address.toLowerCase() === - zora721.proxyContractAddress.toLowerCase(), + .filter((log) => + isAddressMatch(log.address, zora721.proxyContractAddress), ) .map((log) => { try { @@ -213,8 +222,7 @@ describe.each(ENABLED_TESTS)( .filter( (event): event is NonNullable => event?.eventName === "Transfer" && - (event.args as any)?.to?.toLowerCase() === - ANVIL_USER_0.toLowerCase(), + isAddressMatch((event.args as any)?.to, ANVIL_USER_0), ) .map((event) => ((event.args as any).tokenId as bigint).toString()) @@ -349,8 +357,8 @@ describe.each(ENABLED_TESTS)( describe("client", () => { it("can get the SDK version", () => { const sdkVersion: string = tokenboundClient.getSDKVersion() - console.log(`SDK Version → \x1b[94m ${sdkVersion} \x1b[0m`) - // console.log('SDK Version:', sdkVersion) + testLog(`SDK Version → \x1b[94m ${sdkVersion} \x1b[0m`) + // testLog('SDK Version:', sdkVersion) expect(sdkVersion).toBeDefined() }) @@ -410,7 +418,7 @@ describe.each(ENABLED_TESTS)( await ensureMintedNFTs() const { account, txHash } = await tokenboundClient.createAccount(NFT_IN_EOA) - console.log("CREATED ACCT", account) + testLog("CREATED ACCT", account) const createdAccountTxReceipt = await publicClient.waitForTransactionReceipt({ @@ -434,7 +442,7 @@ describe.each(ENABLED_TESTS)( ...NFT_IN_EOA, salt: CUSTOM_SALT, }) - console.log("CREATED ACCT WITH CUSTOM SALT", account) + testLog("CREATED ACCT WITH CUSTOM SALT", account) const createdAccountTxReceipt = await publicClient.waitForTransactionReceipt({ @@ -459,7 +467,7 @@ describe.each(ENABLED_TESTS)( ...NFT_IN_EOA, chainId: HARDHAT_CHAIN_ID, }) - console.log("CREATED ACCT WITH CUSTOM CHAIN ID", account) + testLog("CREATED ACCT WITH CUSTOM CHAIN ID", account) const createdAccountTxReceipt = await publicClient.waitForTransactionReceipt({ @@ -474,7 +482,7 @@ describe.each(ENABLED_TESTS)( const { chainId } = bytecode - console.log("CHAINID OF CREATED ACCT", chainId) + testLog("CHAINID OF CREATED ACCT", chainId) expect(isAddress(account)).toEqual(true) expect(createdAccountTxReceipt.status).toBe("success") @@ -516,7 +524,7 @@ describe.each(ENABLED_TESTS)( ...NFT_FOR_MULTICALL_CREATE, appendedCalls: [appendedCall], }) - console.log("CREATED ACCT WITH MULTICALL", account) + testLog("CREATED ACCT WITH MULTICALL", account) const createdAccountTxReceipt = await publicClient.waitForTransactionReceipt({ @@ -541,7 +549,7 @@ describe.each(ENABLED_TESTS)( }, ) - console.log(`isAccountDeployed ${testName}`, isAccountDeployed) + testLog(`isAccountDeployed ${testName}`, isAccountDeployed) expect(isAccountDeployed).toEqual(true) }) @@ -629,7 +637,7 @@ describe.each(ENABLED_TESTS)( "can transfer one of the minted NFTs to the TBA", async () => { await ensureTBA() - console.log( + testLog( "SAFE_TRANSFER", ZORA721_TBA_ADDRESS, "tokenId", @@ -671,7 +679,7 @@ describe.each(ENABLED_TESTS)( publicClient, walletAddress: ZORA721_TBA_ADDRESS, }) - console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) + testLog("# of NFTs in TBA: ", tbaNFTBalance.toString()) await vi.waitFor(() => { expect(transferHash).toMatch(ADDRESS_REGEX) @@ -721,7 +729,7 @@ describe.each(ENABLED_TESTS)( publicClient, walletAddress: ZORA721_TBA_ADDRESS, }) - console.log("# of NFTs in TBA: ", tbaNFTBalance.toString()) + testLog("# of NFTs in TBA: ", tbaNFTBalance.toString()) await vi.waitFor(() => { expect(transferHash).toMatch(ADDRESS_REGEX) @@ -843,7 +851,6 @@ describe.each(ENABLED_TESTS)( describe("transfers", () => { it("can transferETH with the TBA", async () => { - await ensureNFTsInTBA() await ensureETHInTBA() // Assert the delta rather than absolute balances, so this test does not // depend on how much ETH earlier tests happened to spend. @@ -864,7 +871,7 @@ describe.each(ENABLED_TESTS)( address: ZORA721_TBA_ADDRESS, }) - console.log( + testLog( "BEFORE: ", formatEther(balanceBefore), "AFTER: ", @@ -879,7 +886,6 @@ describe.each(ENABLED_TESTS)( }) it("can transferETH to an ENS with the TBA", async () => { - await ensureNFTsInTBA() await ensureETHInTBA() // Assert the delta rather than absolute balances, so this test does not // depend on how much ETH earlier tests happened to spend. @@ -897,7 +903,7 @@ describe.each(ENABLED_TESTS)( address: ZORA721_TBA_ADDRESS, }) - console.log( + testLog( "BEFORE: ", formatEther(balanceBefore), "AFTER: ", @@ -911,8 +917,6 @@ describe.each(ENABLED_TESTS)( }) it("will not allow transferNFT 721 with an amount other than 1", async () => { - await ensureNFTsInTBA() - await ensureETHInTBA() vi.spyOn(console, "error") await expect(() => @@ -999,7 +1003,7 @@ describe.each(ENABLED_TESTS)( walletAddress: ZORA721_TBA_ADDRESS, }) - console.log("721s MINTED TO TBA: ", zoraBalanceInTBA.toString()) + testLog("721s MINTED TO TBA: ", zoraBalanceInTBA.toString()) await vi.waitFor(() => { expect(mintToTBATxHash).toMatch(ADDRESS_REGEX) @@ -1044,7 +1048,7 @@ describe.each(ENABLED_TESTS)( walletAddress: mintingAccount, }) - console.log("1155 Balance", zora1155BalanceInTBA) + testLog("1155 Balance", zora1155BalanceInTBA) await vi.waitFor(() => { expect(mint1155TxHash).toMatch(ADDRESS_REGEX) @@ -1070,7 +1074,7 @@ describe.each(ENABLED_TESTS)( walletAddress: ANVIL_USER_1, }) - console.log("1155 Balance", anvilAccount1_1155Balance) + testLog("1155 Balance", anvilAccount1_1155Balance) await vi.waitFor(() => { expect(transferNFTHash).toMatch(ADDRESS_REGEX) @@ -1084,15 +1088,12 @@ describe.each(ENABLED_TESTS)( "can verify if a wallet isValidSigner for an owned NFT", async () => { await ensureTBA() - console.log( - "ZORA721_TBA_ADDRESS in isValidSigner", - ZORA721_TBA_ADDRESS, - ) + testLog("ZORA721_TBA_ADDRESS in isValidSigner", ZORA721_TBA_ADDRESS) const isValidSigner = await tokenboundClient.isValidSigner({ account: ZORA721_TBA_ADDRESS, }) - console.log("isValidSigner?", isValidSigner) + testLog("isValidSigner?", isValidSigner) await vi.waitFor(() => { expect(isValidSigner).toBe(true) @@ -1106,7 +1107,7 @@ describe.each(ENABLED_TESTS)( message: "Sign me", }) - console.log("SIGNED MESSAGE: ", signedMessageHash) + testLog("SIGNED MESSAGE: ", signedMessageHash) await vi.waitFor(() => { expect(signedMessageHash).toMatch(ADDRESS_REGEX) @@ -1120,7 +1121,7 @@ describe.each(ENABLED_TESTS)( message: { raw: "0x68656c6c6f20776f726c64" }, }) - console.log("HEX SIGNED MESSAGE: ", hexSignedMessageHash) + testLog("HEX SIGNED MESSAGE: ", hexSignedMessageHash) await vi.waitFor(() => { expect(hexSignedMessageHash).toMatch(ADDRESS_REGEX) @@ -1187,7 +1188,7 @@ describe.each(ENABLED_TESTS)( // Prepare encoded WETH transfer to TBA const wethTransferCallData = encodeFunctionData({ - abi: wethABI, + abi: weth.abi, functionName: "transfer", args: [ZORA721_TBA_ADDRESS, depositWeiValue], }) @@ -1198,7 +1199,7 @@ describe.each(ENABLED_TESTS)( const wethContract = getContract({ address: WETH_CONTRACT_ADDRESS, - abi: wethABI, + abi: weth.abi, client: { wallet: walletClient, }, @@ -1258,7 +1259,7 @@ describe.each(ENABLED_TESTS)( walletAddress: "jeebay.eth", }) - console.log( + testLog( "TBA WETH INITIAL: ", formatEther(tbaWETHInitial), "TBA RECEIVED: ", diff --git a/packages/sdk/src/test/config/anvil.ts b/packages/sdk/src/test/config/anvil.ts deleted file mode 100644 index 1e089c9..0000000 --- a/packages/sdk/src/test/config/anvil.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -import type { CreateAnvilOptions } from "@viem/anvil" -import { mainnet } from "viem/chains" - -const ACTIVE_CHAIN = mainnet - -export const ANVIL_CONFIG = { - TIMEOUT: 60000, // default 10000 - ACTIVE_CHAIN: ACTIVE_CHAIN, -} - -export const CREATE_ANVIL_OPTIONS: CreateAnvilOptions = { - forkUrl: import.meta.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT, -} diff --git a/packages/sdk/src/test/config/base.ts b/packages/sdk/src/test/config/base.ts deleted file mode 100644 index d6fab9b..0000000 --- a/packages/sdk/src/test/config/base.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const TEST_CONFIG = { - RECIPIENT_ADDRESS: <`0x${string}`>( - "0x02101dfb77fde026414827fdc604ddaf224f0921" - ), - ERC1167_HEADER: "363d3d373d3d3d363d73", - ERC1167_FOOTER: "5af43d82803e903d91602b57fd5bf3", -} diff --git a/packages/sdk/src/test/config/index.ts b/packages/sdk/src/test/config/index.ts deleted file mode 100644 index 5a2da7b..0000000 --- a/packages/sdk/src/test/config/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./anvil" -export * from "./base" -export * from "./mints" diff --git a/packages/sdk/src/test/config/mints.ts b/packages/sdk/src/test/config/mints.ts deleted file mode 100644 index 0a254d4..0000000 --- a/packages/sdk/src/test/config/mints.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { getAddress } from "viem" -import { ethToWei } from "../utils" -import { zora721DropABI, zora1155ABI } from "../wagmi-cli-hooks/generated" - -// Zora Webb's First Deep Field: https://zora.co/collect/eth:0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d -export const zora721 = { - abi: zora721DropABI, - proxyContractAddress: getAddress( - "0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d", - ), - mintPrice: BigInt(0), - quantity: 4, -} - -// https://zora.co/collect/eth:0x373075bab7d668ed2473d8233ebdebcf49eb758e/1 -export const zora1155 = { - abi: zora1155ABI, - fixedPriceSalesStrategy: getAddress( - "0x5Ff5a77dD2214d863aCA809C0168941052d9b180", - ), // Zora IMinter1155 from https://etherscan.io/address/0x5Ff5a77dD2214d863aCA809C0168941052d9b180 - proxyContractAddress: getAddress( - "0x373075bab7d668ed2473d8233ebdebcf49eb758e", - ), // proxied Zora 1155 contract - tokenId: BigInt(1), - mintFee: ethToWei(0.000777), - quantity: BigInt(5), -} diff --git a/packages/sdk/src/test/constants/addresses.ts b/packages/sdk/src/test/constants/addresses.ts deleted file mode 100644 index 47bcbd3..0000000 --- a/packages/sdk/src/test/constants/addresses.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { getAddress } from "viem" - -export const WETH_CONTRACT_ADDRESS = getAddress( - "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", -) diff --git a/packages/sdk/src/test/constants/anvil.ts b/packages/sdk/src/test/constants/anvil.ts deleted file mode 100644 index 69828a3..0000000 --- a/packages/sdk/src/test/constants/anvil.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { getAddress } from "viem" -import { foundry } from "viem/chains" -import type { AnvilAccount } from "../../types" - -export const ANVIL_RPC_URL = foundry.rpcUrls.default.http[0] - -// Anvil Accounts for local testing -export const ANVIL_ACCOUNTS: AnvilAccount[] = [ - { - name: "BJ", - address: getAddress("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"), - privateKey: - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", - }, - { - name: "Jayden", - address: getAddress("0x70997970c51812dc3a010c7d01b50e0d17dc79c8"), - privateKey: - "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", - }, - { - name: "Alanah", - address: getAddress("0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc"), - privateKey: - "0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a", - }, - - // Available Accounts - // ================== - // (0) 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 (10000 ETH) - // (1) 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 (10000 ETH) - // (2) 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc (10000 ETH) - // (3) 0x90f79bf6eb2c4f870365e785982e1f101e93b906 (10000 ETH) - // (4) 0x15d34aaf54267db7d7c367839aaf71a00a2c6a65 (10000 ETH) - // (5) 0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc (10000 ETH) - // (6) 0x976ea74026e726554db657fa54763abd0c3a0aa9 (10000 ETH) - // (7) 0x14dc79964da2c08b23698b3d3cc7ca32193d9955 (10000 ETH) - // (8) 0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f (10000 ETH) - // (9) 0xa0ee7a142d267c1f36714e4a8f75612f20a79720 (10000 ETH) - - // Private Keys - // ================== - // (0) 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - // (1) 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d - // (2) 0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a - // (3) 0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6 - // (4) 0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a - // (5) 0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba - // (6) 0x92db14e403b83dfe3df233f83dfa3a0d7096f21ca9b0d6d6b8d88b2b4ec1564e - // (7) 0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356 - // (8) 0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97 - // (9) 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 -] diff --git a/packages/sdk/src/test/constants/index.ts b/packages/sdk/src/test/constants/index.ts deleted file mode 100644 index 81ea8fd..0000000 --- a/packages/sdk/src/test/constants/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./addresses" -export * from "./anvil" -export * from "./regexes" diff --git a/packages/sdk/src/test/constants/regexes.ts b/packages/sdk/src/test/constants/regexes.ts deleted file mode 100644 index 2c81da0..0000000 --- a/packages/sdk/src/test/constants/regexes.ts +++ /dev/null @@ -1 +0,0 @@ -export const ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}/ diff --git a/packages/sdk/src/test/types/index.ts b/packages/sdk/src/test/types/index.ts deleted file mode 100644 index ee4b79c..0000000 --- a/packages/sdk/src/test/types/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./testers" diff --git a/packages/sdk/src/test/types/testers.ts b/packages/sdk/src/test/types/testers.ts deleted file mode 100644 index 54148ba..0000000 --- a/packages/sdk/src/test/types/testers.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const Tester = { - ETHERS: "ETHERS", - ETHERS_6: "ETHERS_6", - VIEM_WALLETCLIENT: "VIEM_WALLETCLIENT", -} as const - -export type TesterType = (typeof Tester)[keyof typeof Tester] diff --git a/packages/sdk/src/test/unit/isAddressMatch.test.ts b/packages/sdk/src/test/unit/isAddressMatch.test.ts new file mode 100644 index 0000000..a6eca8a --- /dev/null +++ b/packages/sdk/src/test/unit/isAddressMatch.test.ts @@ -0,0 +1,43 @@ +import { + ANVIL_ACCOUNTS, + isAddressMatch, + RECIPIENT_ADDRESS, + WETH_CONTRACT_ADDRESS, + ZORA_721, +} from "@tokenbound/test-fixtures" +import { describe, expect, it } from "vitest" + +const WETH_ADDRESS = WETH_CONTRACT_ADDRESS // checksummed by the fixtures package +const WETH_LOWERCASE_ADDRESS = WETH_CONTRACT_ADDRESS.toLowerCase() +const ZORA_ADDRESS = ZORA_721.address +const INVALID_ADDRESS = "NOT AN ADDRESS" + +describe("isAddressMatch", () => { + it("should return true for two identical addresses", () => { + expect(isAddressMatch(WETH_ADDRESS, WETH_ADDRESS)).toBe(true) + }) + + it("should return true for two addresses that differ only in case", () => { + expect(isAddressMatch(WETH_ADDRESS, WETH_LOWERCASE_ADDRESS)).toBe(true) + }) + + it("should return false for two different addresses", () => { + expect(isAddressMatch(WETH_ADDRESS, ZORA_ADDRESS)).toBe(false) + }) + + it("should return false for invalid address", () => { + expect(isAddressMatch(WETH_ADDRESS, INVALID_ADDRESS)).toBe(false) + }) + + it("should return false for null or undefined addresses", () => { + expect(isAddressMatch(null, WETH_ADDRESS)).toBe(false) + expect(isAddressMatch(WETH_ADDRESS, undefined)).toBe(false) + expect(isAddressMatch(null, undefined)).toBe(false) + }) + + it("matches an Anvil account address across casings", () => { + const anvil = ANVIL_ACCOUNTS[0].address + expect(isAddressMatch(anvil, anvil.toLowerCase())).toBe(true) + expect(isAddressMatch(anvil, RECIPIENT_ADDRESS)).toBe(false) + }) +}) diff --git a/packages/sdk/src/test/unit/protocol.test.ts b/packages/sdk/src/test/unit/protocol.test.ts index 97ccd6e..36a160a 100644 --- a/packages/sdk/src/test/unit/protocol.test.ts +++ b/packages/sdk/src/test/unit/protocol.test.ts @@ -254,7 +254,8 @@ describe("execution encoding", () => { describe("transfer encoding", () => { const account = getAddress("0x000000000000000000000000000000000000c0de") - const recipient = getAddress("0x02101dfb77fde026414827fdc604ddaf224f0921") + // Arbitrary recipient — deliberately not a Tokenbound contract address. + const recipient = getAddress("0x000000000000000000000000000000000000d00d") it("encodes an ERC721 transfer", () => { const t = encodeNFTTransfer({ diff --git a/packages/sdk/src/test/utils/clients.ts b/packages/sdk/src/test/utils/clients.ts index 568bc96..900707a 100644 --- a/packages/sdk/src/test/utils/clients.ts +++ b/packages/sdk/src/test/utils/clients.ts @@ -1,5 +1,5 @@ +import { ANVIL_RPC_URL } from "@tokenbound/test-fixtures" import { type Chain, createPublicClient, http, type PublicClient } from "viem" -import { ANVIL_RPC_URL } from "../constants" export const getPublicClient = ({ chain }: { chain: Chain }): PublicClient => { return createPublicClient({ diff --git a/packages/sdk/src/test/utils/debug.ts b/packages/sdk/src/test/utils/debug.ts deleted file mode 100644 index 281df57..0000000 --- a/packages/sdk/src/test/utils/debug.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { PublicClient } from "viem" - -/** - * Emits console output related to the given transaction hash for debugging purposes. - * - * @param publicClient - The viem public client instance. - * @param hash - The transaction hash to debug. - * @returns void - */ -export async function debugTransaction({ - publicClient, - hash, -}: { - publicClient: PublicClient - hash: `0x${string}` -}) { - console.log("DEBUGGING TRANSACTION: ", hash) - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash, - }) - console.log("transactionReceipt", transactionReceipt) - - const transaction = await publicClient.getTransaction({ - hash, - }) - console.log("transaction", transaction) -} diff --git a/packages/sdk/src/test/utils/getWETHBalance.ts b/packages/sdk/src/test/utils/getWETHBalance.ts index 1542de8..9719669 100644 --- a/packages/sdk/src/test/utils/getWETHBalance.ts +++ b/packages/sdk/src/test/utils/getWETHBalance.ts @@ -1,7 +1,7 @@ +import { WETH_CONTRACT_ADDRESS } from "@tokenbound/test-fixtures" import { erc20Abi, type PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" import { resolvePossibleENS } from "../../utils" -import { WETH_CONTRACT_ADDRESS } from "../constants" export async function getWETHBalance({ publicClient, diff --git a/packages/sdk/src/test/utils/getZora1155Balance.ts b/packages/sdk/src/test/utils/getZora1155Balance.ts index 43ee857..406d29e 100644 --- a/packages/sdk/src/test/utils/getZora1155Balance.ts +++ b/packages/sdk/src/test/utils/getZora1155Balance.ts @@ -1,8 +1,7 @@ +import { zora1155 } from "@tokenbound/test-fixtures" import type { PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" import { resolvePossibleENS } from "../../utils" -import { zora1155 } from "../config" -import { zora1155ABI } from "../wagmi-cli-hooks/generated" export async function getZora1155Balance({ publicClient, @@ -14,7 +13,7 @@ export async function getZora1155Balance({ const address = await resolvePossibleENS(publicClient, walletAddress) return await publicClient.readContract({ address: zora1155.proxyContractAddress, - abi: zora1155ABI, + abi: zora1155.abi, functionName: "balanceOf", args: [address, zora1155.tokenId], }) diff --git a/packages/sdk/src/test/utils/getZora721Balance.ts b/packages/sdk/src/test/utils/getZora721Balance.ts index f56f145..8c0b061 100644 --- a/packages/sdk/src/test/utils/getZora721Balance.ts +++ b/packages/sdk/src/test/utils/getZora721Balance.ts @@ -1,8 +1,7 @@ +import { zora721 } from "@tokenbound/test-fixtures" import type { PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" import { resolvePossibleENS } from "../../utils" -import { zora721 } from "../config" -import { zora721DropABI } from "../wagmi-cli-hooks/generated" export async function getZora721Balance({ publicClient, @@ -15,7 +14,7 @@ export async function getZora721Balance({ return await publicClient.readContract({ address: zora721.proxyContractAddress, - abi: zora721DropABI, + abi: zora721.abi, functionName: "balanceOf", args: [address], }) diff --git a/packages/sdk/src/test/utils/index.ts b/packages/sdk/src/test/utils/index.ts index 097a8b8..d3d962f 100644 --- a/packages/sdk/src/test/utils/index.ts +++ b/packages/sdk/src/test/utils/index.ts @@ -1,5 +1,4 @@ export * from "./clients" -export * from "./debug" export * from "./ethToWei" export * from "./getWETHBalance" export * from "./getZora721Balance" diff --git a/packages/sdk/vite.config.ts b/packages/sdk/vite.config.ts index e2ecee5..64b1172 100644 --- a/packages/sdk/vite.config.ts +++ b/packages/sdk/vite.config.ts @@ -1,5 +1,5 @@ import { resolve } from "node:path" -import { type PluginOption, defineConfig } from "vite" +import { defineConfig, type PluginOption } from "vite" import dts from "vite-plugin-dts" // Bundle analysis is opt-in: `ANALYZE=true pnpm build`. diff --git a/packages/sdk/wagmi.config.ts b/packages/sdk/wagmi.config.ts index 20394e8..cbc99c6 100644 --- a/packages/sdk/wagmi.config.ts +++ b/packages/sdk/wagmi.config.ts @@ -1,10 +1,10 @@ import { defineConfig } from "@wagmi/cli" import { etherscan } from "@wagmi/cli/plugins" -import { mainnet, goerli } from "viem/chains" +import { goerli, mainnet } from "viem/chains" import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./src/protocol/constants" export default defineConfig({ - out: "src/test/wagmi-cli-hooks/generated.ts", + out: "../test-fixtures/src/generated.ts", contracts: [], plugins: [ etherscan({ diff --git a/packages/test-fixtures/package.json b/packages/test-fixtures/package.json new file mode 100644 index 0000000..231a077 --- /dev/null +++ b/packages/test-fixtures/package.json @@ -0,0 +1,16 @@ +{ + "name": "@tokenbound/test-fixtures", + "version": "0.0.0", + "private": true, + "description": "Shared on-chain test fixtures for the Tokenbound SDK test suites. Never published.", + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "peerDependencies": { + "viem": "~2.56.6" + }, + "devDependencies": { + "@viem/anvil": "^0.0.10" + } +} diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts new file mode 100644 index 0000000..6a16839 --- /dev/null +++ b/packages/test-fixtures/src/anvil.ts @@ -0,0 +1,37 @@ +// Anvil configuration shared by every fork-backed suite. +// +// Both suites fork the same endpoint with the same timeout, so neither package +// declares its own. Reads process.env (not import.meta.env) so this works under +// plain Node as well as vitest, without depending on vite/client types. + +import type { CreateAnvilOptions } from "@viem/anvil" +import { mainnet } from "viem/chains" + +/** + * The chain the suites fork. Both packages assert against mainnet state + * (Zora drops, ENS, WETH), so this is not configurable per suite. + */ +export const ACTIVE_CHAIN = mainnet + +/** + * Mainnet fork endpoint. Set VITE_ANVIL_MAINNET_FORK_ENDPOINT in .env.test to + * use your own provider; the public fallback keeps a fresh clone runnable, but + * it rate-limits and retains only recent blocks. + */ +export const FORK_URL = + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? + "https://ethereum-rpc.publicnode.com" + +export const ANVIL_CONFIG = { + TIMEOUT: 60000, // default 10000 + ACTIVE_CHAIN, +} + +/** + * No explicit port: suites run sequentially (fileParallelism: false, + * sequence.concurrent: false) and each afterAll stops anvil before the next + * beforeAll starts, so every variant can share the default port. + */ +export const CREATE_ANVIL_OPTIONS: CreateAnvilOptions = { + forkUrl: FORK_URL, +} diff --git a/packages/test-fixtures/src/fixtures.ts b/packages/test-fixtures/src/fixtures.ts new file mode 100644 index 0000000..a9f685f --- /dev/null +++ b/packages/test-fixtures/src/fixtures.ts @@ -0,0 +1,120 @@ +// Shared on-chain fixtures for every Tokenbound test suite. +// +// PRIVATE: this package is never published (see "private": true). It exists so +// the viem suite (packages/sdk) and the ethers suites (packages/ethers) assert +// against the SAME mainnet contracts, accounts and ENS name. Importing these +// rather than copying literals is what actually prevents the suites drifting +// apart — a copied constant with a comment saying "keep in sync" does not. + +import { getAddress, parseUnits } from "viem" +import { foundry } from "viem/chains" + +/** Zora "Webb's First Deep Field" 721 drop — open, free public mint. */ +export const ZORA_721 = { + address: getAddress("0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d"), + mintPrice: 0n, + /** Minted in a single purchase; the drop caps purchases per address. */ + quantity: 4, +} as const + +/** Zora 1155, minted through the fixed-price sales strategy. */ +export const ZORA_1155 = { + address: getAddress("0x373075bab7d668ed2473d8233ebdebcf49eb758e"), + minter: getAddress("0x5Ff5a77dD2214d863aCA809C0168941052d9b180"), + tokenId: 1n, + mintFee: parseUnits("0.000777", 18), + quantity: 5n, +} as const + +export const WETH_CONTRACT_ADDRESS = getAddress( + "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", +) + +/** ENS name used by the ENS-recipient tests in both suites. */ +export const ENS_NAME = "jeebay.eth" + +/** + * An arbitrary recipient. Deliberately NOT a Tokenbound contract: using the + * ERC-6551 registry here once made execution calldata targeting the registry + * look plausible in test output. + */ +export const RECIPIENT_ADDRESS = getAddress( + "0x000000000000000000000000000000000000d00d", +) + +export const ANVIL_RPC_URL = foundry.rpcUrls.default.http[0] + +export const ANVIL_ACCOUNTS = [ + { + name: "BJ", + address: getAddress("0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"), + privateKey: + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + }, + { + name: "Jayden", + address: getAddress("0x70997970c51812dc3a010c7d01b50e0d17dc79c8"), + privateKey: + "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d", + }, +] as const + +/** + * A 20-byte Ethereum address: 0x + 40 hex chars. + * + * NOTE: intentionally unanchored at the end — some existing assertions match an + * address appearing at the start of a longer string. Use ETH_ADDRESS_REGEX when + * the value must be exactly an address. + */ +export const ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}/ + +/** A 20-byte Ethereum address and nothing else. */ +export const ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/ + +/** A 32-byte transaction hash: 0x + 64 hex chars. */ +export const TX_HASH_REGEX = /^0x[a-fA-F0-9]{64}$/ + +/** An ECDSA signature: 0x + 65 bytes (r, s, v) as 130 hex chars. */ +export const ECDSA_SIGNATURE_REGEX = /^0x[a-fA-F0-9]{130}$/ + +export const ERC1167_HEADER = "363d3d373d3d3d363d73" +export const ERC1167_FOOTER = "5af43d82803e903d91602b57fd5bf3" + +/** + * Whether the suites should emit their progress logging. + * + * The fork-backed tests log balances, derived addresses and tx hashes, which is + * what you actually want when a mainnet-fork test fails. In a normal run it is + * just noise that buries real failures, so it is off unless asked for: + * + * USE_VERBOSE_TESTS=1 pnpm test + */ +export const TEST_VERBOSE = + process.env.USE_VERBOSE_TESTS === "1" || + process.env.USE_VERBOSE_TESTS === "true" + +/** console.log, but only when USE_VERBOSE_TESTS is set. */ +export const testLog = (...args: unknown[]): void => { + if (TEST_VERBOSE) console.log(...args) +} + +/** + * Compares two Ethereum addresses for equality, ignoring case. + * + * Addresses arrive from RPC responses, event logs and ethers/viem helpers in + * inconsistent casing, so `a === b` on raw strings gives false negatives. + * Checksumming both sides normalizes that. Returns false rather than throwing + * when either value is missing or is not a valid address, so it is safe to use + * directly in a filter or conditional. + */ +export const isAddressMatch = ( + a?: string | null, + b?: string | null, +): boolean => { + if (!a || !b) return false + try { + return getAddress(a) === getAddress(b) + } catch { + return false + } +} diff --git a/packages/sdk/src/test/wagmi-cli-hooks/generated.ts b/packages/test-fixtures/src/generated.ts similarity index 100% rename from packages/sdk/src/test/wagmi-cli-hooks/generated.ts rename to packages/test-fixtures/src/generated.ts diff --git a/packages/test-fixtures/src/index.ts b/packages/test-fixtures/src/index.ts new file mode 100644 index 0000000..6883388 --- /dev/null +++ b/packages/test-fixtures/src/index.ts @@ -0,0 +1,12 @@ +// Shared test fixtures for every Tokenbound suite. +// +// PRIVATE: this package is never published (see "private": true). It exists so +// the viem suite (packages/sdk) and the ethers suites (packages/ethers) assert +// against the SAME mainnet contracts, accounts, ABIs and anvil configuration. +// Importing these rather than copying literals is what actually prevents the +// suites drifting apart — a copied constant with a comment saying "keep in +// sync" does not. + +export * from "./anvil" +export * from "./fixtures" +export * from "./mints" diff --git a/packages/test-fixtures/src/mints.ts b/packages/test-fixtures/src/mints.ts new file mode 100644 index 0000000..ddb7ac7 --- /dev/null +++ b/packages/test-fixtures/src/mints.ts @@ -0,0 +1,48 @@ +// The contracts both suites transact against, each paired with the ABI used to +// call it. +// +// The ABIs come from ./generated.ts, which @wagmi/cli pulls from Etherscan at +// the verified deployment addresses (see packages/sdk/wagmi.config.ts) — they +// are never hand-written. Pairing each address with its ABI here means neither +// suite can call one contract while encoding against another's interface. + +import { + ERC1167_FOOTER, + ERC1167_HEADER, + RECIPIENT_ADDRESS, + WETH_CONTRACT_ADDRESS, + ZORA_721, + ZORA_1155, +} from "./fixtures" +import { wethABI, zora721DropABI, zora1155ABI } from "./generated" + +/** Zora "Webb's First Deep Field": https://zora.co/collect/eth:0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d */ +export const zora721 = { + abi: zora721DropABI, + proxyContractAddress: ZORA_721.address, + mintPrice: ZORA_721.mintPrice, + quantity: ZORA_721.quantity, +} + +/** https://zora.co/collect/eth:0x373075bab7d668ed2473d8233ebdebcf49eb758e/1 */ +export const zora1155 = { + abi: zora1155ABI, + fixedPriceSalesStrategy: ZORA_1155.minter, + proxyContractAddress: ZORA_1155.address, + tokenId: ZORA_1155.tokenId, + mintFee: ZORA_1155.mintFee, + quantity: ZORA_1155.quantity, +} + +/** WETH, used by the ERC-20 transfer tests. */ +export const weth = { + abi: wethABI, + contractAddress: WETH_CONTRACT_ADDRESS, +} + +/** Values the bytecode-deconstruction assertions compare against. */ +export const TEST_CONFIG = { + RECIPIENT_ADDRESS, + ERC1167_HEADER, + ERC1167_FOOTER, +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 754dd25..0a68d00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@walletconnect/logger>pino': 10.0.0 + importers: .: devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 2.5.14 + version: 2.5.14 '@changesets/cli': specifier: ^2.26.2 version: 2.31.1(@types/node@26.3.0) @@ -25,7 +28,7 @@ importers: dependencies: '@rainbow-me/rainbowkit': specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) @@ -37,7 +40,7 @@ importers: version: 6.0.3 connectkit: specifier: ^1.9.2 - version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -55,10 +58,10 @@ importers: version: 0.12.5 viem: specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -79,26 +82,23 @@ importers: specifier: ^5.4.21 version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) - examples/vite-wagmi-ethers-rainbowkit: + examples/vite-wagmi-ethers6: dependencies: - '@rainbow-me/rainbowkit': - specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) '@tokenbound/ethers': specifier: workspace:^ version: link:../../packages/ethers - '@wagmi/core': - specifier: ^2.13.9 - version: 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) buffer: specifier: ^6.0.3 version: 6.0.3 + connectkit: + specifier: ^1.9.2 + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: - specifier: ^5.8.0 - version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + specifier: ^6.17.0 + version: 6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) process: specifier: ^0.11.10 version: 0.11.10 @@ -113,10 +113,10 @@ importers: version: 0.12.5 viem: specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -137,23 +137,20 @@ importers: specifier: ^5.4.21 version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) - examples/vite-wagmi-ethers6: + examples/vite-wagmi-viem: dependencies: + '@rainbow-me/rainbowkit': + specifier: ^2.2.11 + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) - '@tokenbound/ethers': + '@tokenbound/sdk': specifier: workspace:^ - version: link:../../packages/ethers + version: link:../../packages/sdk buffer: specifier: ^6.0.3 version: 6.0.3 - connectkit: - specifier: ^1.9.2 - version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) - ethers: - specifier: ^6.17.0 - version: 6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) process: specifier: ^0.11.10 version: 0.11.10 @@ -168,10 +165,10 @@ importers: version: 0.12.5 viem: specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -192,11 +189,8 @@ importers: specifier: ^5.4.21 version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) - examples/vite-wagmi-viem: + examples/vite-wagmi3-viem: dependencies: - '@rainbow-me/rainbowkit': - specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) @@ -220,10 +214,10 @@ importers: version: 0.12.5 viem: specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) wagmi: - specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + specifier: ^3.7.7 + version: 3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -251,8 +245,11 @@ importers: version: link:../sdk devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 2.5.14 + version: 2.5.14 + '@tokenbound/test-fixtures': + specifier: workspace:* + version: link:../test-fixtures '@viem/anvil': specifier: ^0.0.10 version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -266,8 +263,8 @@ importers: specifier: ^5.6.3 version: 5.9.3 viem: - specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ~2.56.6 + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) vite: specifier: ^4.4.9 version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) @@ -284,12 +281,15 @@ importers: specifier: ^3.0.168 version: 3.0.168 viem: - specifier: ^2.56.5 - version: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ~2.56.6 + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 2.5.14 + version: 2.5.14 + '@tokenbound/test-fixtures': + specifier: workspace:* + version: link:../test-fixtures '@viem/anvil': specifier: ^0.0.10 version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -315,6 +315,16 @@ importers: specifier: ^1.6.0 version: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) + packages/test-fixtures: + dependencies: + viem: + specifier: ~2.56.6 + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + devDependencies: + '@viem/anvil': + specifier: ^0.0.10 + version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + packages: '@aave/account@0.2.1': @@ -452,45 +462,82 @@ packages: engines: {node: '>=14.21.3'} hasBin: true + '@biomejs/biome@2.5.14': + resolution: {integrity: sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==} + engines: {node: '>=14.21.3'} + hasBin: true + '@biomejs/cli-darwin-arm64@2.5.13': resolution: {integrity: sha512-nYSuDJ6zgVqZUkAkJkvhXxsF2PYIrUk/g638K4voCXz7foI9f7b6C2/7+oAihsHQlivZNMUrm/y8ywlcHQtZOw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] + '@biomejs/cli-darwin-arm64@2.5.14': + resolution: {integrity: sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + '@biomejs/cli-darwin-x64@2.5.13': resolution: {integrity: sha512-KVy1ceEDuJ3AzFxjT9kkxbVy+UANw1pjEMUS6lvKfxjJ+fmkRvc7sQn1Xo6ETgseEI7wUQoV03KSga3XfE8YRQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] + '@biomejs/cli-darwin-x64@2.5.14': + resolution: {integrity: sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + '@biomejs/cli-linux-arm64-musl@2.5.13': resolution: {integrity: sha512-CH32xpep3dNS5EVJpAHlYchkBYznxyVZQrx0b6YYYlPL9u9ZeD2NtqiK/6s64+HFS2a7hGnryLlqqZAOh8ax5g==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] + + '@biomejs/cli-linux-arm64-musl@2.5.14': + resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] '@biomejs/cli-linux-arm64@2.5.13': resolution: {integrity: sha512-VlNMtoxOqs0dUR6drxxHr18SNUvI7xxAuHZlH4s/dstYSf3g6RaqVgo8JRnhcOhKz9afWrvtJTboNG1JuYlIDQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] + + '@biomejs/cli-linux-arm64@2.5.14': + resolution: {integrity: sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] '@biomejs/cli-linux-x64-musl@2.5.13': resolution: {integrity: sha512-F3pmwl+VHoUuVJN/tbNLKeLt0SVK3EIyN1jXlMcNyQGYRQQTVqXF+GgkP0/CjGXFN87e/mv0sBfUnWqWza5PKQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] + + '@biomejs/cli-linux-x64-musl@2.5.14': + resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] '@biomejs/cli-linux-x64@2.5.13': resolution: {integrity: sha512-Fi6gIxbUaJ3ZCIXeG3ggIBPF76O2DjDN67WrPX/ODRv54GeXPm2gbEPC96Yb0yrJoiH0Eax1JLx1Pi0XbsNFZQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] + + '@biomejs/cli-linux-x64@2.5.14': + resolution: {integrity: sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] '@biomejs/cli-win32-arm64@2.5.13': resolution: {integrity: sha512-+WD13qshXrr0Icv4BfsAdzm8Fs3TL+nZ59zEQxsYNd8lcgZJ0A5+OrlwsL1PipVCmWeRpxgIPD6DAcEd7smkCQ==} @@ -498,12 +545,24 @@ packages: cpu: [arm64] os: [win32] + '@biomejs/cli-win32-arm64@2.5.14': + resolution: {integrity: sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + '@biomejs/cli-win32-x64@2.5.13': resolution: {integrity: sha512-VOofU/nW761XWzUeUNE8zzYNyPrxuMuNFMizL0qz7J75yeV8N7WFheUlk1/K6dOkaFpH9wJ+lDKlwjAbw0346w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] + '@biomejs/cli-win32-x64@2.5.14': + resolution: {integrity: sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -559,13 +618,13 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@coinbase/cdp-sdk@1.55.0': - resolution: {integrity: sha512-5PbUg3n3Jk9nm8nEStskRv6jTrVZKkgwxMFjW+i/xUDDzK1fXksKwXdjgUiHB1hf0FZx1LiYBosrh4IULxFyPA==} + '@coinbase/cdp-sdk@1.56.0': + resolution: {integrity: sha512-Fwq77OUHRfSihdi/IB3sp2eVplv9UQjiXoZfpU0mYmxD42CRbVINQT9PVrBbn6fxqS9Vlc4XdaB166IPBVfXkA==} peerDependencies: - '@x402/core': ^2.21.0 - '@x402/evm': ^2.21.0 - '@x402/extensions': ^2.21.0 - '@x402/svm': ^2.21.0 + '@x402/core': ^2.25.0 + '@x402/evm': ^2.25.0 + '@x402/extensions': ^2.25.0 + '@x402/svm': ^2.25.0 peerDependenciesMeta: '@x402/core': optional: true @@ -1342,7 +1401,6 @@ packages: engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] - libc: [glibc] '@noble/ciphers@1.2.1': resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} @@ -1493,42 +1551,36 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.5': resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.5': resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.5': resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.5': resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.5': resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.5': resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} @@ -1597,79 +1649,66 @@ packages: resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.63.0': resolution: {integrity: sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.63.0': resolution: {integrity: sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.63.0': resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.63.0': resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.63.0': resolution: {integrity: sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.63.0': resolution: {integrity: sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.63.0': resolution: {integrity: sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.63.0': resolution: {integrity: sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.63.0': resolution: {integrity: sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.63.0': resolution: {integrity: sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.63.0': resolution: {integrity: sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.63.0': resolution: {integrity: sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.63.0': resolution: {integrity: sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==} @@ -2275,6 +2314,37 @@ packages: typescript: optional: true + '@wagmi/connectors@8.2.0': + resolution: {integrity: sha512-hPwdmePYjQqSWlw9JmzrzVgmw2PJ+NJsUQ/BuPBYbzBS8+cW5vWdqiaKLB4qTF9m+yr+zSp7u91KBgvOWz50og==} + peerDependencies: + '@base-org/account': ^2.5.1 + '@coinbase/wallet-sdk': ^4.3.6 + '@metamask/connect-evm': ^2.1.0 + '@safe-global/safe-apps-provider': ~0.18.6 + '@safe-global/safe-apps-sdk': ^9.1.0 + '@wagmi/core': 3.6.5 + '@walletconnect/ethereum-provider': ^2.21.1 + accounts: ~0.18 + typescript: '>=5.9.3' + viem: 2.x + peerDependenciesMeta: + '@base-org/account': + optional: true + '@coinbase/wallet-sdk': + optional: true + '@metamask/connect-evm': + optional: true + '@safe-global/safe-apps-provider': + optional: true + '@safe-global/safe-apps-sdk': + optional: true + '@walletconnect/ethereum-provider': + optional: true + accounts: + optional: true + typescript: + optional: true + '@wagmi/core@2.22.1': resolution: {integrity: sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==} peerDependencies: @@ -2287,6 +2357,21 @@ packages: typescript: optional: true + '@wagmi/core@3.6.5': + resolution: {integrity: sha512-zfKvLNT1V1+/RgrrUcRvteKx+V+Iv9ZHPWseIVKFA9mX5WE0H8J6zWZGWXSQCKbz5xGSUoatNFCkNFSzqQp+AA==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + accounts: ~0.18 + typescript: '>=5.9.3' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + accounts: + optional: true + typescript: + optional: true + '@walletconnect/core@2.21.0': resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} engines: {node: '>=18'} @@ -2439,6 +2524,10 @@ packages: aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -2498,8 +2587,8 @@ packages: peerDependencies: axios: 0.x || 1.x - axios@1.16.0: - resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==} + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} babel-plugin-styled-components@2.3.0: resolution: {integrity: sha512-nP/y6PbBqS/qtKROnJCgpGo8hYUzlBAVXN1QAjSBANL6vZiQXPQN7FYW/nUwoxY7nZhBEGm9T5tjL9gbzwulDw==} @@ -2873,9 +2962,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - eciesjs@0.4.18: resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} engines: {bun: '>=1', deno: '>=2', node: '>=16'} @@ -3025,10 +3111,6 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -3201,8 +3283,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hono@4.13.7: - resolution: {integrity: sha512-c8/gF9ac8Y78/agExVocyLevgR+JlpNB444Py0FSX8pJoPdYUfUzRcXtYEYGwt6l19qIlVZPN5Mfsw9jFShmQQ==} + hono@4.13.8: + resolution: {integrity: sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==} engines: {node: '>=16.9.0'} html-encoding-sniffer@4.0.0: @@ -3220,6 +3302,10 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -3489,28 +3575,24 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - libc: [musl] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [glibc] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} @@ -3727,8 +3809,9 @@ packages: ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3874,14 +3957,14 @@ packages: resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} engines: {node: '>=10'} - pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} + pino@10.0.0: + resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==} hasBin: true pkg-types@1.3.1: @@ -3961,8 +4044,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + process-warning@5.1.0: + resolution: {integrity: sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -3994,11 +4077,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -4029,9 +4107,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.3.0: - resolution: {integrity: sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==} - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -4104,8 +4179,8 @@ packages: resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} engines: {node: '>= 20.19.0'} - real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} require-directory@2.1.1: @@ -4252,6 +4327,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slow-redact@0.3.2: + resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} + socket.io-client@4.8.3: resolution: {integrity: sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==} engines: {node: '>=10.0.0'} @@ -4260,8 +4338,8 @@ packages: resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} engines: {node: '>=10.0.0'} - sonic-boom@2.8.0: - resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} @@ -4295,9 +4373,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -4377,8 +4452,8 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - thread-stream@0.15.2: - resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==} + thread-stream@3.2.0: + resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -4419,9 +4494,6 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -4621,8 +4693,8 @@ packages: typescript: optional: true - viem@2.56.5: - resolution: {integrity: sha512-GuEf/oee0PHgy4D6JIA8u0rY1g+sM5nF+p7HyMHO3vjlHC5G/ljfrgnUOnrES9m5Ny/P3RwWCHjDuN2T6HUWzQ==} + viem@2.56.6: + resolution: {integrity: sha512-wa7bJ8CiYE4iYUFUNWn5RrjV2qhrkye0wKeqp4vDW6WsJZ0lGDvoPB6Hb1p7Q+DGR+8uK+QLAE8eC+iQTkONHg==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -4752,6 +4824,17 @@ packages: typescript: optional: true + wagmi@3.7.7: + resolution: {integrity: sha512-J9YTRKwOVt+L135nMiitwGALrJqpXFhLX8AZzbECWeAQ1aI9Uz8Pz0GGMqtbKe7xJtmOx838OChT7YkMs9k8OA==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.9.3' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + webextension-polyfill@0.10.0: resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} @@ -4954,12 +5037,12 @@ packages: snapshots: - '@aave/account@0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + '@aave/account@0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) '@adraffy/ens-normalize@1.11.1': {} @@ -5102,41 +5185,14 @@ snapshots: '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: - '@coinbase/cdp-sdk': 1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@coinbase/cdp-sdk': 1.56.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - transitivePeerDependencies: - - '@types/react' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - bufferutil - - debug - - fastestsmallesttextencoderdecoder - - immer - - react - - typescript - - use-sync-external-store - - utf-8-validate - - zod - - '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': - dependencies: - '@coinbase/cdp-sdk': 1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@noble/hashes': 1.4.0 - clsx: 1.2.1 - eventemitter3: 5.0.1 - idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) - preact: 10.24.2 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5149,6 +5205,7 @@ snapshots: - fastestsmallesttextencoderdecoder - immer - react + - supports-color - typescript - use-sync-external-store - utf-8-validate @@ -5167,30 +5224,65 @@ snapshots: '@biomejs/cli-win32-arm64': 2.5.13 '@biomejs/cli-win32-x64': 2.5.13 + '@biomejs/biome@2.5.14': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.5.14 + '@biomejs/cli-darwin-x64': 2.5.14 + '@biomejs/cli-linux-arm64': 2.5.14 + '@biomejs/cli-linux-arm64-musl': 2.5.14 + '@biomejs/cli-linux-x64': 2.5.14 + '@biomejs/cli-linux-x64-musl': 2.5.14 + '@biomejs/cli-win32-arm64': 2.5.14 + '@biomejs/cli-win32-x64': 2.5.14 + '@biomejs/cli-darwin-arm64@2.5.13': optional: true + '@biomejs/cli-darwin-arm64@2.5.14': + optional: true + '@biomejs/cli-darwin-x64@2.5.13': optional: true + '@biomejs/cli-darwin-x64@2.5.14': + optional: true + '@biomejs/cli-linux-arm64-musl@2.5.13': optional: true + '@biomejs/cli-linux-arm64-musl@2.5.14': + optional: true + '@biomejs/cli-linux-arm64@2.5.13': optional: true + '@biomejs/cli-linux-arm64@2.5.14': + optional: true + '@biomejs/cli-linux-x64-musl@2.5.13': optional: true + '@biomejs/cli-linux-x64-musl@2.5.14': + optional: true + '@biomejs/cli-linux-x64@2.5.13': optional: true + '@biomejs/cli-linux-x64@2.5.14': + optional: true + '@biomejs/cli-win32-arm64@2.5.13': optional: true + '@biomejs/cli-win32-arm64@2.5.14': + optional: true + '@biomejs/cli-win32-x64@2.5.13': optional: true + '@biomejs/cli-win32-x64@2.5.14': + optional: true + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -5334,24 +5426,25 @@ snapshots: human-id: 4.2.1 prettier: 2.8.8 - '@coinbase/cdp-sdk@1.55.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@coinbase/cdp-sdk@1.56.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: '@solana-program/system': 0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana-program/token': 0.9.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) '@solana/kit': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) abitype: 1.0.6(typescript@5.9.3)(zod@3.25.76) - axios: 1.16.0 - axios-retry: 4.5.0(axios@1.16.0) + axios: 1.20.0 + axios-retry: 4.5.0(axios@1.20.0) bs58: 6.0.0 jose: 6.2.12 md5: 2.3.0 uncrypto: 0.1.3 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - debug - fastestsmallesttextencoderdecoder + - supports-color - typescript - utf-8-validate @@ -5377,7 +5470,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5397,7 +5490,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) preact: 10.24.2 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5408,6 +5501,7 @@ snapshots: - use-sync-external-store - utf-8-validate - zod + optional: true '@csstools/color-helpers@5.1.0': optional: true @@ -5946,19 +6040,11 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 - '@gemini-wallet/core@0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': - dependencies: - '@metamask/rpc-errors': 7.0.2 - eventemitter3: 5.0.1 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - '@gemini-wallet/core@0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@gemini-wallet/core@0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@metamask/rpc-errors': 7.0.2 eventemitter3: 5.0.1 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -6152,7 +6238,7 @@ snapshots: pump: 3.0.4 readable-stream: 3.6.2 socket.io-client: 4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - tslib: 2.8.1 + tslib: 2.7.0 util: 0.12.5 uuid: 8.3.2 transitivePeerDependencies: @@ -6258,7 +6344,7 @@ snapshots: '@motionone/easing': 10.18.0 '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 - tslib: 2.8.1 + tslib: 2.7.0 '@motionone/dom@10.12.0': dependencies: @@ -6267,18 +6353,18 @@ snapshots: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 hey-listen: 1.0.8 - tslib: 2.8.1 + tslib: 2.7.0 '@motionone/easing@10.18.0': dependencies: '@motionone/utils': 10.18.0 - tslib: 2.8.1 + tslib: 2.7.0 '@motionone/generators@10.18.0': dependencies: '@motionone/types': 10.17.1 '@motionone/utils': 10.18.0 - tslib: 2.8.1 + tslib: 2.7.0 '@motionone/types@10.17.1': {} @@ -6286,7 +6372,7 @@ snapshots: dependencies: '@motionone/types': 10.17.1 hey-listen: 1.0.8 - tslib: 2.8.1 + tslib: 2.7.0 '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true @@ -6346,26 +6432,7 @@ snapshots: '@paulmillr/qr@0.2.1': {} - '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': - dependencies: - '@tanstack/react-query': 5.102.4(react@18.3.1) - '@vanilla-extract/css': 1.20.1 - '@vanilla-extract/dynamic': 2.1.5 - '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1) - clsx: 2.1.1 - cuer: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - ua-parser-js: 2.0.10 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - transitivePeerDependencies: - - '@types/react' - - babel-plugin-macros - - typescript - - '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))': + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) '@vanilla-extract/css': 1.20.1 @@ -6377,8 +6444,8 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) ua-parser-js: 2.0.10 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - babel-plugin-macros @@ -6388,7 +6455,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -6399,7 +6466,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -6410,12 +6477,13 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + optional: true '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6423,7 +6491,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6458,7 +6526,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6486,6 +6554,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6558,6 +6627,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-polyfills@1.7.8': dependencies: @@ -6636,6 +6706,7 @@ snapshots: - utf-8-validate - valtio - zod + optional: true '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6706,6 +6777,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': dependencies: @@ -6716,7 +6788,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6754,7 +6826,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6782,6 +6854,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: @@ -6808,7 +6881,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6851,7 +6924,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6879,6 +6952,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@rolldown/binding-android-arm-eabi@1.2.5': optional: true @@ -7064,11 +7138,12 @@ snapshots: - typescript - utf-8-validate - zod + optional: true '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -7078,12 +7153,13 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + optional: true '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} @@ -7781,7 +7857,7 @@ snapshots: picocolors: 1.1.1 picomatch: 3.0.2 prettier: 3.9.6 - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zod: 4.4.3 optionalDependencies: typescript: 5.9.3 @@ -7789,19 +7865,19 @@ snapshots: - bufferutil - utf-8-validate - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': dependencies: '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) - '@gemini-wallet/core': 0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@gemini-wallet/core': 0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -7846,68 +7922,22 @@ snapshots: - wagmi - zod - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': + '@wagmi/connectors@8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: - '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) - '@gemini-wallet/core': 0.3.2(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - optionalDependencies: typescript: 5.9.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/react-query' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - expo-auth-session - - expo-crypto - - expo-web-browser - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - react-native - - supports-color - - uploadthing - - use-sync-external-store - - utf-8-validate - - wagmi - - zod - '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.102.4 @@ -7918,11 +7948,11 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.102.4 @@ -8020,6 +8050,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8108,6 +8139,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/environment@1.0.1': dependencies: @@ -8194,6 +8226,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/events@1.0.1': dependencies: @@ -8270,7 +8303,7 @@ snapshots: '@walletconnect/logger@2.1.2': dependencies: '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 + pino: 10.0.0 '@walletconnect/relay-api@1.0.11': dependencies: @@ -8359,6 +8392,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8431,6 +8465,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/time@1.0.2': dependencies: @@ -8573,6 +8608,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8653,6 +8689,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8741,6 +8778,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8829,6 +8867,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/window-getters@1.0.1': dependencies: @@ -8853,6 +8892,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 zod: 4.4.3 + optional: true abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): optionalDependencies: @@ -8894,6 +8934,12 @@ snapshots: aes-js@4.0.0-beta.5: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + agent-base@7.1.4: optional: true @@ -8931,7 +8977,7 @@ snapshots: async-mutex@0.2.6: dependencies: - tslib: 2.8.1 + tslib: 2.7.0 asynckit@0.4.0: {} @@ -8941,27 +8987,29 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios-retry@4.5.0(axios@1.16.0): + axios-retry@4.5.0(axios@1.20.0): dependencies: - axios: 1.16.0 + axios: 1.20.0 is-retry-allowed: 2.2.0 - axios@1.16.0: + axios@1.20.0: dependencies: follow-redirects: 1.16.0 form-data: 4.0.6 + https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: - debug + - supports-color - babel-plugin-styled-components@2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1))(supports-color@5.5.0): + babel-plugin-styled-components@2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): dependencies: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) picomatch: 4.0.7 - styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1) + styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) transitivePeerDependencies: - supports-color @@ -9126,22 +9174,22 @@ snapshots: confbox@0.1.8: {} - connectkit@1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + connectkit@1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: - '@aave/account': 0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + '@aave/account': 0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': 5.102.4(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - qrcode: 1.5.4 + qrcode: 1.5.3 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-state: 1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 - styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@babel/core' - react-is @@ -9294,13 +9342,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - eciesjs@0.4.18: dependencies: '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) @@ -9593,8 +9634,6 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-redact@3.5.0: {} - fast-safe-stringify@2.1.1: {} fastq@1.20.3: @@ -9639,13 +9678,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) style-value-types: 5.0.0 - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@emotion/is-prop-valid': 0.8.8 framesync@6.0.1: dependencies: - tslib: 2.8.1 + tslib: 2.7.0 fs-extra@7.0.1: dependencies: @@ -9775,7 +9814,7 @@ snapshots: dependencies: react-is: 16.13.1 - hono@4.13.7: {} + hono@4.13.8: {} html-encoding-sniffer@4.0.0: dependencies: @@ -9800,6 +9839,13 @@ snapshots: transitivePeerDependencies: - debug + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -10249,7 +10295,7 @@ snapshots: node-fetch-native: 1.6.7 ufo: 1.6.4 - on-exit-leak-free@0.2.0: {} + on-exit-leak-free@2.1.2: {} once@1.4.0: dependencies: @@ -10345,6 +10391,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod + optional: true ox@0.6.9(typescript@5.9.3)(zod@3.25.76): dependencies: @@ -10373,6 +10420,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod + optional: true ox@0.9.17(typescript@5.9.3)(zod@4.4.3): dependencies: @@ -10452,26 +10500,25 @@ snapshots: pify@5.0.0: {} - pino-abstract-transport@0.5.0: + pino-abstract-transport@2.0.0: dependencies: - duplexify: 4.1.3 split2: 4.2.0 - pino-std-serializers@4.0.0: {} + pino-std-serializers@7.1.0: {} - pino@7.11.0: + pino@10.0.0: dependencies: atomic-sleep: 1.0.0 - fast-redact: 3.5.0 - on-exit-leak-free: 0.2.0 - pino-abstract-transport: 0.5.0 - pino-std-serializers: 4.0.0 - process-warning: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.1.0 quick-format-unescaped: 4.0.4 - real-require: 0.1.0 + real-require: 0.2.0 safe-stable-stringify: 2.5.0 - sonic-boom: 2.8.0 - thread-stream: 0.15.2 + slow-redact: 0.3.2 + sonic-boom: 4.2.1 + thread-stream: 3.2.0 pkg-types@1.3.1: dependencies: @@ -10488,43 +10535,23 @@ snapshots: framesync: 6.0.1 hey-listen: 1.0.8 style-value-types: 5.0.0 - tslib: 2.8.1 - - porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): - dependencies: - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - hono: 4.13.7 - idb-keyval: 6.3.0 - mipd: 0.0.7(typescript@5.9.3) - ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zod: 4.4.3 - zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - optionalDependencies: - '@tanstack/react-query': 5.102.4(react@18.3.1) - react: 18.3.1 - typescript: 5.9.3 - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - transitivePeerDependencies: - - '@types/react' - - immer - - use-sync-external-store + tslib: 2.7.0 - porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)): + porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - hono: 4.13.7 + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + hono: 4.13.8 idb-keyval: 6.3.0 mipd: 0.0.7(typescript@5.9.3) ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 4.4.3 zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) react: 18.3.1 typescript: 5.9.3 - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - immer @@ -10554,7 +10581,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@1.0.0: {} + process-warning@5.1.0: {} process@0.11.10: {} @@ -10583,12 +10610,6 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qrcode@1.5.4: - dependencies: - dijkstrajs: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - quansync@0.2.11: {} query-string@7.1.3: @@ -10617,15 +10638,13 @@ snapshots: react-is@18.3.1: {} - react-is@19.3.0: {} - react-refresh@0.17.0: {} react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@18.3.1): dependencies: react: 18.3.1 react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@types/react': 18.3.31 @@ -10634,7 +10653,7 @@ snapshots: react: 18.3.1 react-remove-scroll-bar: 2.3.8(@types/react@18.3.31)(react@18.3.1) react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) - tslib: 2.8.1 + tslib: 2.7.0 use-callback-ref: 1.3.3(@types/react@18.3.31)(react@18.3.1) use-sidecar: 1.1.3(@types/react@18.3.31)(react@18.3.1) optionalDependencies: @@ -10644,7 +10663,7 @@ snapshots: dependencies: get-nonce: 1.0.1 react: 18.3.1 - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@types/react': 18.3.31 @@ -10690,7 +10709,7 @@ snapshots: readdirp@5.1.1: {} - real-require@0.1.0: {} + real-require@0.2.0: {} require-directory@2.1.1: {} @@ -10860,6 +10879,8 @@ snapshots: slash@3.0.0: {} + slow-redact@0.3.2: {} + socket.io-client@4.8.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): dependencies: '@socket.io/component-emitter': 3.1.2 @@ -10878,7 +10899,7 @@ snapshots: transitivePeerDependencies: - supports-color - sonic-boom@2.8.0: + sonic-boom@4.2.1: dependencies: atomic-sleep: 1.0.0 @@ -10903,8 +10924,6 @@ snapshots: std-env@3.10.0: {} - stream-shift@1.0.3: {} - strict-uri-encode@2.0.0: {} string-argv@0.3.2: {} @@ -10940,21 +10959,21 @@ snapshots: style-value-types@5.0.0: dependencies: hey-listen: 1.0.8 - tslib: 2.8.1 + tslib: 2.7.0 - styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1): + styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.29.7(supports-color@5.5.0) '@babel/traverse': 7.29.8(supports-color@5.5.0) '@emotion/is-prop-valid': 1.4.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@19.3.0)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.3.0(@babel/core@7.29.7)(styled-components@5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 19.3.0 + react-is: 18.3.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: @@ -10987,9 +11006,9 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 - thread-stream@0.15.2: + thread-stream@3.2.0: dependencies: - real-require: 0.1.0 + real-require: 0.2.0 tiny-invariant@1.3.3: {} @@ -11028,8 +11047,6 @@ snapshots: tslib@2.7.0: {} - tslib@2.8.1: {} - type-detect@4.1.0: {} typed-array-buffer@1.0.3: @@ -11102,7 +11119,7 @@ snapshots: use-callback-ref@1.3.3(@types/react@18.3.31)(react@18.3.1): dependencies: react: 18.3.1 - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@types/react': 18.3.31 @@ -11110,7 +11127,7 @@ snapshots: dependencies: detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.8.1 + tslib: 2.7.0 optionalDependencies: '@types/react': 18.3.31 @@ -11184,8 +11201,9 @@ snapshots: - bufferutil - utf-8-validate - zod + optional: true - viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11202,7 +11220,7 @@ snapshots: - utf-8-validate - zod - viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11219,7 +11237,7 @@ snapshots: - utf-8-validate - zod - viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): + viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11343,14 +11361,14 @@ snapshots: xml-name-validator: 5.0.0 optional: true - wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): + wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) - '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -11392,54 +11410,27 @@ snapshots: - utf-8-validate - zod - wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3): + wagmi@3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)): dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) - '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/connectors': 8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.56.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' + - '@base-org/account' + - '@coinbase/wallet-sdk' + - '@metamask/connect-evm' + - '@safe-global/safe-apps-provider' + - '@safe-global/safe-apps-sdk' - '@tanstack/query-core' - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - expo-auth-session - - expo-crypto - - expo-web-browser - - fastestsmallesttextencoderdecoder + - '@walletconnect/ethereum-provider' + - accounts - immer - - ioredis - - react-native - - supports-color - - uploadthing - - utf-8-validate - - zod webextension-polyfill@0.10.0: {} From d53b6e9baecf431244ea157cb719614116c09a45 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 16 Sep 2026 20:47:45 -0700 Subject: [PATCH 03/30] add new checkProtocolDeployment method --- README.md | 30 +++- packages/ethers/src/TokenboundClient.ts | 30 +++- .../ethers/src/test/TestAllEthers.test.ts | 24 +++ packages/sdk/README.md | 120 ++++++++++++- packages/sdk/src/TokenboundClient.ts | 31 +++- packages/sdk/src/index.ts | 9 +- .../protocol/constants/tokenboundAddresses.ts | 8 + packages/sdk/src/protocol/core.ts | 57 +++++++ packages/sdk/src/test/TestAllViem.test.ts | 24 +++ .../test/unit/checkProtocolDeployment.test.ts | 157 ++++++++++++++++++ .../sdk/src/test/unit/viemExtension.test.ts | 26 +++ packages/sdk/src/viem/actions.ts | 37 ++++- packages/sdk/src/viem/index.ts | 2 + packages/sdk/src/viem/tokenboundActions.ts | 6 + 14 files changed, 545 insertions(+), 16 deletions(-) create mode 100644 packages/sdk/src/test/unit/checkProtocolDeployment.test.ts diff --git a/README.md b/README.md index 2e3a002..e771285 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,35 @@ await client.tokenbound.createAccount({ tokenContract, tokenId }) await client.tokenbound.execute({ account, to, value, data }) ``` -Public clients receive only the read-only actions; clients carrying an account get the full set. The extension reuses exactly the same protocol code as the class API. +The namespace keeps Tokenbound's methods from colliding with viem's own actions, and the +underlying client still works exactly as before: + +```ts copy +const addresses = await client.getAddresses() // viem's +const nft = await client.tokenbound.getNFT({ accountAddress: account }) // Tokenbound's +``` + +The read/write split is enforced by the types. A client carrying an account gets the full +set; a `PublicClient` is typed with the read-only subset, so a write is a compile-time +error rather than a runtime failure: + +```ts copy +const publicClient = createPublicClient({ chain: mainnet, transport: http() }) + .extend(tokenboundActions()) + +publicClient.tokenbound.getAccount({ tokenContract, tokenId }) // ✅ +publicClient.tokenbound.createAccount({ tokenContract, tokenId }) +// ❌ Property 'createAccount' does not exist on type 'TokenboundPublicActions' +``` + +Read actions: `getAccount`, `prepareCreateAccount`, `prepareExecution`, +`checkAccountDeployment`, `checkProtocolDeployment`, `deconstructBytecode`, `getNFT`, +`isValidSigner`. Write actions: `createAccount`, `execute`, `transferNFT`, `transferETH`, +`transferERC20`, `signMessage`. See the +[package README](https://github.com/tokenbound/sdk/tree/main/packages/sdk#readme) for +worked examples of each. + +The extension reuses exactly the same protocol code as the class API. ### Using Ethers.js diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts index 706da87..74438ff 100644 --- a/packages/ethers/src/TokenboundClient.ts +++ b/packages/ethers/src/TokenboundClient.ts @@ -20,15 +20,18 @@ import { encodeNFTTransfer, type GetAccountParams, getAccountAddress, + hasBytecode, type MultiCallTx, type NFTTransferParams, type PossibleENSAddress, + type ProtocolDeploymentStatus, prepareCreateAccountTx, type ResolvedDeployment, resolveDeployment, type SegmentedERC6551Bytecode, type TBImplementationVersion, type TokenboundAccountNFT, + toProtocolDeploymentStatus, VALID_SIGNER_MAGIC_VALUE, } from "@tokenbound/sdk" import type { Address, Chain, Hex } from "viem" @@ -241,8 +244,31 @@ export class TokenboundClient { }: { accountAddress: Address }): Promise { - const bytecode = await this.adapter.getCode(accountAddress) - return bytecode ? bytecode.length > 2 : false + return hasBytecode(await this.adapter.getCode(accountAddress)) + } + + /** + * Reports whether the ERC-6551 protocol contracts are deployed on the + * configured chain. This asks about the protocol, not about an individual + * account — use `checkAccountDeployment` for that. + */ + public async checkProtocolDeployment(): Promise { + const { registryAddress, implementationAddress } = this.deployment + + // Independent reads: one round trip rather than two on a slow transport. + const [registryCode, implementationCode] = await Promise.all([ + this.adapter.getCode(registryAddress), + this.adapter.getCode(implementationAddress), + ]) + + // The status is assembled by the shared protocol layer, so this client + // and the viem core cannot drift on what counts as deployed. + return toProtocolDeploymentStatus({ + registryCode, + implementationCode, + registryAddress, + implementationAddress, + }) } /** Splits a deployed account's bytecode into its ERC-6551 components. */ diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 8f1068e..eb7c717 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -526,6 +526,30 @@ describe.each(ENABLED_TESTS)( ).toBe(true) }) + it("can checkProtocolDeployment on the forked chain", async () => { + const status = await tokenboundClient.checkProtocolDeployment() + + testLog(`protocolDeployment ${testName}`, status) + + // The fork is mainnet, where both the V2 and V3 deployments exist. + expect(status.isFullyDeployed).toEqual(true) + expect(status.registry).toEqual(true) + expect(status.implementation).toEqual(true) + + // The addresses reported must be the ones this variant is pinned to. + expect(status.registryAddress).toEqual( + ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, + ) + // V3 resolves to the account proxy, not the upgradeable + // implementation behind it; V2 has no proxy and uses its + // implementation directly. + expect(status.implementationAddress).toEqual( + isV3 + ? ERC6551_DEPLOYMENT.ACCOUNT_PROXY?.ADDRESS + : ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, + ) + }) + it("can getNFT for the created account", async () => { await ensureTBA() const nft = await tokenboundClient.getNFT({ diff --git a/packages/sdk/README.md b/packages/sdk/README.md index 1161846..bdd07b0 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -35,7 +35,9 @@ There are two equivalent APIs. Both run the same protocol code, so pick whicheve ### The viem client extension (recommended) -Decorates a viem client, namespacing everything under `.tokenbound`: +`tokenboundActions()` is a standard viem decorator. Pass it to `.extend()` and every +Tokenbound method appears under a single `.tokenbound` namespace — so it can never +collide with viem's own actions, or with other decorators you're already using. ```ts import { createWalletClient, custom } from "viem" @@ -44,15 +46,125 @@ import { tokenboundActions } from "@tokenbound/sdk/viem" const client = createWalletClient({ chain: mainnet, - account, + account: "0x...", transport: custom(window.ethereum), }).extend(tokenboundActions()) +``` + +Everything hangs off `client.tokenbound`, and the underlying viem client is untouched — +you keep using it exactly as before: +```ts +// viem's own actions — still right there +const addresses = await client.getAddresses() + +// Tokenbound's, namespaced +const account = client.tokenbound.getAccount({ + tokenContract: "0x...", + tokenId: "1", +}) +``` + +#### Reading + +Read methods work on any client, including a `PublicClient` with no account. +`getAccount` is pure derivation — it does no network call and returns the address +whether or not the account has been deployed yet: + +```ts const account = client.tokenbound.getAccount({ tokenContract, tokenId }) -await client.tokenbound.createAccount({ tokenContract, tokenId }) + +// Has this particular account been deployed? +const isDeployed = await client.tokenbound.checkAccountDeployment({ + accountAddress: account, +}) + +// Which NFT controls it? +const { tokenContract, tokenId, chainId } = await client.tokenbound.getNFT({ + accountAddress: account, +}) + +// Is ERC-6551 itself available on this chain? +const status = await client.tokenbound.checkProtocolDeployment() +if (!status.isFullyDeployed) { + console.log(`Deploy the missing contracts at ${status.deployerUrl}`) +} +``` + +`checkProtocolDeployment` reports the registry and the account implementation separately, +because a chain can have one without the other. Gnosis is a live example — the ERC-6551 +registry is deployed there, but the Tokenbound account implementation is not: + +| Contract | Address on Gnosis | | +| --- | --- | --- | +| Registry | [`0x0000…5758`](https://gnosisscan.io/address/0x000000006551c19487814612e58FE06813775758) | deployed (`ERC6551Registry`) | +| Account implementation | [`0x5526…6E7F`](https://gnosisscan.io/address/0x55266d75D1a14E4572138116aF39863Ed6596E7F) | no bytecode | + +So on Gnosis you get `{ registry: true, implementation: false, isFullyDeployed: false }` +along with a `deployerUrl` — enough to tell a user precisely what is missing, rather than +just that something is. + +#### Writing + +Write methods need a client that can sign: + +```ts +const { account, txHash } = await client.tokenbound.createAccount({ + tokenContract, + tokenId, +}) + +await client.tokenbound.transferETH({ + account, + recipientAddress: "0x...", + amount: 0.01, +}) + +await client.tokenbound.transferNFT({ + account, + tokenType: "ERC721", + tokenContract: "0x...", + tokenId: "1", + recipientAddress: "vitalik.eth", // ENS names are resolved for you +}) + +await client.tokenbound.execute({ + account, + to: "0x...", + value: 0n, + data: "0x", +}) +``` + +#### The read/write split is enforced by types + +A client carrying an account gets the full surface. A client without one — a +`PublicClient` — is typed with the read-only subset, so reaching for a write method +is a compile-time error rather than a runtime failure: + +```ts +const publicClient = createPublicClient({ + chain: mainnet, + transport: http(), +}).extend(tokenboundActions()) + +publicClient.tokenbound.getAccount({ tokenContract, tokenId }) // ✅ +publicClient.tokenbound.createAccount({ tokenContract, tokenId }) +// ❌ Property 'createAccount' does not exist on type 'TokenboundPublicActions' ``` -A client without an account gets only the read actions; one carrying an account gets the full set. +#### Available methods + +| Any client | Requires an account | +| --- | --- | +| `getAccount` | `createAccount` | +| `prepareCreateAccount` | `execute` | +| `prepareExecution` | `transferNFT` | +| `checkAccountDeployment` | `transferETH` | +| `checkProtocolDeployment` | `transferERC20` | +| `deconstructBytecode` | `signMessage` | +| `getNFT` | | +| `isValidSigner` | | ### The TokenboundClient class diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index a96bffb..fb9e4ed 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -4,7 +4,6 @@ import { createPublicClient, custom, encodeFunctionData, - type GetCodeReturnType, type Hex, http, numberToHex, @@ -20,6 +19,7 @@ import { encodeExecuteCall, encodeNFTTransfer, getAccountAddress, + hasBytecode, prepareCreateAccountTx, type ResolvedDeployment, resolveDeployment, @@ -49,6 +49,10 @@ import { type ValidSignerParams, } from "./types" import { getImplementationName, resolvePossibleENS } from "./utils" +import { + checkProtocolDeployment, + type ProtocolDeploymentStatus, +} from "./viem/actions" declare global { interface Window { @@ -384,11 +388,26 @@ class TokenboundClient { public async checkAccountDeployment({ accountAddress, }: BytecodeParams): Promise { - return await this.publicClient - .getCode({ address: accountAddress }) - .then((bytecode: GetCodeReturnType) => { - return bytecode ? bytecode.length > 2 : false - }) + return hasBytecode( + await this.publicClient.getCode({ address: accountAddress }), + ) + } + + /** + * Check whether the ERC-6551 protocol contracts are deployed on the chain + * this client is configured for. + * + * This asks about the protocol, not about any individual account — use + * {@link checkAccountDeployment} for that. The addresses probed are the ones + * this client resolved at construction, so a custom implementation/registry + * or the legacy V2 version is checked instead of the current defaults. + * @returns a Promise resolving to the per-contract deployment status + */ + public async checkProtocolDeployment(): Promise { + return await checkProtocolDeployment(this.publicClient, { + implementationAddress: this.deployment.implementationAddress, + registryAddress: this.deployment.registryAddress, + }) } /** diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index c3b1662..a7ba51e 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -15,13 +15,20 @@ export { encodeNFTTransfer, getAccountAddress, getCreationCode, + hasBytecode, isCustomImplementation, + type ProtocolDeploymentStatus, prepareCreateAccountTx, type ResolvedDeployment, resolveDeployment, + toProtocolDeploymentStatus, VALID_SIGNER_MAGIC_VALUE, } from "./protocol" -export { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./protocol/constants" +export { + ERC_6551_DEFAULT, + ERC_6551_LEGACY_V2, + TOKENBOUND_V3_DEPLOYER_URL, +} from "./protocol/constants" // Legacy standalone functions, retained for backwards compatibility. export { diff --git a/packages/sdk/src/protocol/constants/tokenboundAddresses.ts b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts index e54fe08..125dde8 100644 --- a/packages/sdk/src/protocol/constants/tokenboundAddresses.ts +++ b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts @@ -14,6 +14,14 @@ type Standard6551Deployment = { ACCOUNT_PROXY?: ContractABIPair } +/** + * Where a user can deploy the ERC-6551 V3 contracts to a chain that does not + * yet have them. Surfaced by `checkProtocolDeployment` so a caller can point + * someone at the fix rather than only reporting the problem. + */ +export const TOKENBOUND_V3_DEPLOYER_URL = + "https://tokenbound-v3-deployer.vercel.app" + export const ERC_6551_LEGACY_V2: Standard6551Deployment = { IMPLEMENTATION: { ADDRESS: getAddress("0x2d25602551487c3f3354dd80d76d54383a243358"), diff --git a/packages/sdk/src/protocol/core.ts b/packages/sdk/src/protocol/core.ts index 9f4f2b6..71def26 100644 --- a/packages/sdk/src/protocol/core.ts +++ b/packages/sdk/src/protocol/core.ts @@ -29,6 +29,7 @@ import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2, MULTICALL_AUTHENTICATED_ADDRESS, + TOKENBOUND_V3_DEPLOYER_URL, } from "./constants" import { computeAccount, @@ -94,6 +95,62 @@ export function resolveDeployment(options: { } } +/** + * True when an `eth_getCode` result represents a contract rather than an empty + * account. Shared so the viem core and @tokenbound/ethers agree on what counts + * as deployed, even though each fetches the bytecode through its own transport. + */ +export function hasBytecode(bytecode: Hex | undefined | null): boolean { + return bytecode ? bytecode.length > 2 : false +} + +/** + * The result of probing a chain for the ERC-6551 contracts a client targets. + * Reports each contract separately so a partial deployment is distinguishable + * from no deployment at all. + */ +export type ProtocolDeploymentStatus = { + /** True when the ERC-6551 registry is live at `registryAddress`. */ + registry: boolean + /** True when the account implementation is live at `implementationAddress`. */ + implementation: boolean + /** True only when both contracts are present. */ + isFullyDeployed: boolean + registryAddress: Address + implementationAddress: Address + /** + * Where the missing contracts can be deployed. Present only when + * `isFullyDeployed` is false, so a caller can surface the fix alongside the + * problem; `undefined` on a fully deployed chain. + */ + deployerUrl?: string +} + +/** + * Assembles the deployment status from two already-fetched bytecode results. + * Pure: the caller does the fetching, so the viem core and @tokenbound/ethers + * share this logic without sharing a transport. + */ +export function toProtocolDeploymentStatus(params: { + registryCode: Hex | undefined | null + implementationCode: Hex | undefined | null + registryAddress: Address + implementationAddress: Address +}): ProtocolDeploymentStatus { + const registry = hasBytecode(params.registryCode) + const implementation = hasBytecode(params.implementationCode) + const isFullyDeployed = registry && implementation + + return { + registry, + implementation, + isFullyDeployed, + registryAddress: params.registryAddress, + implementationAddress: params.implementationAddress, + ...(isFullyDeployed ? {} : { deployerUrl: TOKENBOUND_V3_DEPLOYER_URL }), + } +} + /** * Deterministically derives a tokenbound account address. No network access. */ diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index 3d925cf..48ac96b 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -554,6 +554,30 @@ describe.each(ENABLED_TESTS)( expect(isAccountDeployed).toEqual(true) }) + it("can checkProtocolDeployment on the forked chain", async () => { + const status = await tokenboundClient.checkProtocolDeployment() + + testLog(`protocolDeployment ${testName}`, status) + + // The fork is mainnet, where both the V2 and V3 deployments exist. + expect(status.isFullyDeployed).toEqual(true) + expect(status.registry).toEqual(true) + expect(status.implementation).toEqual(true) + + // The addresses reported must be the ones this variant is pinned to. + expect(status.registryAddress).toEqual( + ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, + ) + // V3 resolves to the account proxy, not the upgradeable + // implementation behind it; V2 has no proxy and uses its + // implementation directly. + expect(status.implementationAddress).toEqual( + isV3 + ? ERC6551_DEPLOYMENT.ACCOUNT_PROXY?.ADDRESS + : ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, + ) + }) + it("can getNFT for the created account", async () => { await ensureTBA() const nft = await tokenboundClient.getNFT({ diff --git a/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts new file mode 100644 index 0000000..dd6eb33 --- /dev/null +++ b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts @@ -0,0 +1,157 @@ +// Unit coverage for checkProtocolDeployment. +// +// The forked-chain suites assert the positive case against mainnet, where both +// the V2 and V3 deployments exist. What cannot be exercised there is a chain +// that is missing the contracts, or one that has only some of them — so those +// paths are covered here with a stub transport, no network required. +// +// The partial case is not hypothetical: Gnosis (id 100) carries the ERC-6551 +// registry but no Tokenbound account implementation, which is exactly why the +// action reports each contract separately rather than a single boolean. + +import { type Address, createPublicClient, custom, type Hex } from "viem" +import { mainnet } from "viem/chains" +import { describe, expect, it } from "vitest" +import { + ERC_6551_DEFAULT, + ERC_6551_LEGACY_V2, + TOKENBOUND_V3_DEPLOYER_URL, +} from "../../protocol/constants" +import { TBVersion } from "../../types" +import { checkProtocolDeployment } from "../../viem/actions" + +const DEPLOYED_BYTECODE: Hex = "0x60806040523480156100" // non-empty +const EMPTY_BYTECODE: Hex = "0x" + +/** + * A client whose eth_getCode answers from `codeByAddress`, defaulting to empty. + * Addresses are compared lowercased so the stub is checksum-insensitive. + */ +const stubClient = (codeByAddress: Record) => { + const lookup = Object.fromEntries( + Object.entries(codeByAddress).map(([k, v]) => [k.toLowerCase(), v]), + ) + return createPublicClient({ + chain: mainnet, + transport: custom({ + request: async ({ method, params }) => { + if (method === "eth_getCode") { + const address = (params as [Address, string])[0] + return lookup[address.toLowerCase()] ?? EMPTY_BYTECODE + } + throw new Error(`Unexpected RPC call: ${method}`) + }, + }), + }) +} + +const V3_REGISTRY = ERC_6551_DEFAULT.REGISTRY.ADDRESS +// resolveDeployment pins V3 to the account proxy, not the upgradeable +// implementation behind it — accounts are deployed against the proxy, so that +// is the address whose presence actually gates the protocol on a chain. +const V3_IMPLEMENTATION = ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS as Address +const V2_REGISTRY = ERC_6551_LEGACY_V2.REGISTRY.ADDRESS +const V2_IMPLEMENTATION = ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS + +describe("checkProtocolDeployment", () => { + it("reports a fully deployed chain", async () => { + const client = stubClient({ + [V3_REGISTRY]: DEPLOYED_BYTECODE, + [V3_IMPLEMENTATION]: DEPLOYED_BYTECODE, + }) + + expect(await checkProtocolDeployment(client)).toEqual({ + registry: true, + implementation: true, + isFullyDeployed: true, + registryAddress: V3_REGISTRY, + implementationAddress: V3_IMPLEMENTATION, + // No deployer link when there is nothing to deploy. + }) + }) + + it("reports a chain with no deployment at all", async () => { + const status = await checkProtocolDeployment(stubClient({})) + + expect(status.registry).toBe(false) + expect(status.implementation).toBe(false) + expect(status.isFullyDeployed).toBe(false) + }) + + it("distinguishes a partial deployment (registry only, as on Gnosis)", async () => { + const status = await checkProtocolDeployment( + stubClient({ [V3_REGISTRY]: DEPLOYED_BYTECODE }), + ) + + // The whole point of the split return: this is not simply "not deployed". + expect(status.registry).toBe(true) + expect(status.implementation).toBe(false) + expect(status.isFullyDeployed).toBe(false) + }) + + it("points at the deployer only when something is missing", async () => { + const missing = await checkProtocolDeployment(stubClient({})) + expect(missing.deployerUrl).toBe(TOKENBOUND_V3_DEPLOYER_URL) + + const partial = await checkProtocolDeployment( + stubClient({ [V3_REGISTRY]: DEPLOYED_BYTECODE }), + ) + expect(partial.deployerUrl).toBe(TOKENBOUND_V3_DEPLOYER_URL) + + const complete = await checkProtocolDeployment( + stubClient({ + [V3_REGISTRY]: DEPLOYED_BYTECODE, + [V3_IMPLEMENTATION]: DEPLOYED_BYTECODE, + }), + ) + expect(complete.deployerUrl).toBeUndefined() + }) + + it("treats empty bytecode as not deployed", async () => { + const status = await checkProtocolDeployment( + stubClient({ + [V3_REGISTRY]: EMPTY_BYTECODE, + [V3_IMPLEMENTATION]: EMPTY_BYTECODE, + }), + ) + + expect(status.isFullyDeployed).toBe(false) + }) + + it("probes the V2 addresses when pinned to the legacy version", async () => { + const client = stubClient({ + [V2_REGISTRY]: DEPLOYED_BYTECODE, + [V2_IMPLEMENTATION]: DEPLOYED_BYTECODE, + // The V3 contracts are absent, so a V2 client must not consult them. + }) + + const status = await checkProtocolDeployment(client, { + version: TBVersion.V2, + }) + + expect(status.registryAddress).toBe(V2_REGISTRY) + expect(status.implementationAddress).toBe(V2_IMPLEMENTATION) + expect(status.isFullyDeployed).toBe(true) + }) + + it("probes custom addresses when the deployment is overridden", async () => { + const customRegistry = "0x1111111111111111111111111111111111111111" as const + const customImplementation = + "0x2222222222222222222222222222222222222222" as const + + const status = await checkProtocolDeployment( + stubClient({ + [customRegistry]: DEPLOYED_BYTECODE, + [customImplementation]: DEPLOYED_BYTECODE, + }), + { + registryAddress: customRegistry, + implementationAddress: customImplementation, + }, + ) + + expect(status.registryAddress).toBe(customRegistry) + expect(status.implementationAddress).toBe(customImplementation) + expect(status.isFullyDeployed).toBe(true) + }) +}) diff --git a/packages/sdk/src/test/unit/viemExtension.test.ts b/packages/sdk/src/test/unit/viemExtension.test.ts index 2e1587a..47e99e8 100644 --- a/packages/sdk/src/test/unit/viemExtension.test.ts +++ b/packages/sdk/src/test/unit/viemExtension.test.ts @@ -6,6 +6,7 @@ import { type Address, createPublicClient, createWalletClient, + custom, http, isAddress, } from "viem" @@ -61,6 +62,7 @@ describe("tokenboundActions decorator", () => { "prepareCreateAccount", "prepareExecution", "checkAccountDeployment", + "checkProtocolDeployment", "deconstructBytecode", "getNFT", "isValidSigner", @@ -69,6 +71,30 @@ describe("tokenboundActions decorator", () => { } }) + it("executes a network read on an account-less public client", async () => { + // The read methods are not merely present on a PublicClient — they run. + // A stub transport stands in for the RPC so this stays a unit test; what + // matters is that no account is required anywhere on the path. + const client = createPublicClient({ + chain: mainnet, + transport: custom({ + request: async ({ method }) => + method === "eth_getCode" ? "0x60806040" : null, + }), + }).extend(tokenboundActions()) + + expect(client.account).toBeUndefined() + + const status = await client.tokenbound.checkProtocolDeployment() + expect(status.isFullyDeployed).toBe(true) + + expect( + await client.tokenbound.checkAccountDeployment({ + accountAddress: TOKEN_CONTRACT, + }), + ).toBe(true) + }) + it("exposes write actions on a wallet client", () => { const client = walletClient.extend(tokenboundActions()) for (const method of [ diff --git a/packages/sdk/src/viem/actions.ts b/packages/sdk/src/viem/actions.ts index 2bed325..084248e 100644 --- a/packages/sdk/src/viem/actions.ts +++ b/packages/sdk/src/viem/actions.ts @@ -40,9 +40,12 @@ import { encodeETHTransfer, encodeNFTTransfer, getAccountAddress, + hasBytecode, + type ProtocolDeploymentStatus, prepareCreateAccountTx, type ResolvedDeployment, resolveDeployment, + toProtocolDeploymentStatus, VALID_SIGNER_MAGIC_VALUE, } from "../protocol" import { ERC_6551_DEFAULT } from "../protocol/constants" @@ -349,8 +352,37 @@ export async function checkAccountDeployment( client: Client, params: { accountAddress: Address }, ): Promise { - const bytecode = await getCode(client, { address: params.accountAddress }) - return bytecode ? bytecode.length > 2 : false + return hasBytecode(await getCode(client, { address: params.accountAddress })) +} + +/** + * Checks whether the ERC-6551 protocol contracts are deployed on the chain the + * client is connected to. + * + * This is about the protocol, not about any individual account: use + * `checkAccountDeployment` to ask whether a particular tokenbound account + * exists. The addresses probed are the ones `config` resolves to, so pinning a + * custom implementation/registry or the legacy V2 version checks those instead + * of the current defaults. + */ +export async function checkProtocolDeployment( + client: Client, + config: TokenboundConfig = {}, +): Promise { + const { registryAddress, implementationAddress } = resolveDeployment(config) + + // Independent reads: one round trip rather than two on a slow transport. + const [registryCode, implementationCode] = await Promise.all([ + getCode(client, { address: registryAddress }), + getCode(client, { address: implementationAddress }), + ]) + + return toProtocolDeploymentStatus({ + registryCode, + implementationCode, + registryAddress, + implementationAddress, + }) } /** Splits a deployed account's bytecode into its ERC-6551 components. */ @@ -449,4 +481,5 @@ async function sendTx< } as Parameters[1]) } +export type { ProtocolDeploymentStatus } from "../protocol" export type { ResolvedDeployment } diff --git a/packages/sdk/src/viem/index.ts b/packages/sdk/src/viem/index.ts index 1925091..5df53a4 100644 --- a/packages/sdk/src/viem/index.ts +++ b/packages/sdk/src/viem/index.ts @@ -2,6 +2,7 @@ export { checkAccountDeployment, + checkProtocolDeployment, createAccount, deconstructBytecode, type ExecuteActionParams, @@ -11,6 +12,7 @@ export { getNFT, isValidSigner, type PrepareCreateAccountActionParams, + type ProtocolDeploymentStatus, prepareCreateAccount, prepareExecution, signMessage, diff --git a/packages/sdk/src/viem/tokenboundActions.ts b/packages/sdk/src/viem/tokenboundActions.ts index bef6c2d..65525fb 100644 --- a/packages/sdk/src/viem/tokenboundActions.ts +++ b/packages/sdk/src/viem/tokenboundActions.ts @@ -25,6 +25,7 @@ import type { } from "../types" import { checkAccountDeployment, + checkProtocolDeployment, createAccount, deconstructBytecode, type ExecuteActionParams, @@ -34,6 +35,7 @@ import { getNFT, isValidSigner, type PrepareCreateAccountActionParams, + type ProtocolDeploymentStatus, prepareCreateAccount, prepareExecution, signMessage, @@ -61,6 +63,8 @@ export type TokenboundPublicActions = { checkAccountDeployment: (params: { accountAddress: Address }) => Promise + /** Reports whether the ERC-6551 contracts are deployed on the connected chain. */ + checkProtocolDeployment: () => Promise /** Splits a deployed account's bytecode into its ERC-6551 components. */ deconstructBytecode: (params: { accountAddress: Address @@ -135,6 +139,8 @@ export function tokenboundActions(config: TokenboundConfig = {}) { prepareExecution(viemClient, params, config), checkAccountDeployment: (params) => checkAccountDeployment(viemClient, params), + checkProtocolDeployment: () => + checkProtocolDeployment(viemClient, config), deconstructBytecode: (params) => deconstructBytecode(viemClient, params), getNFT: (params) => getNFT(viemClient, params), isValidSigner: (params) => isValidSigner(viemClient, params, config), From 740db7d36a63e896bb1c1811f6391128176dcee9 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Tue, 29 Sep 2026 15:32:06 -0700 Subject: [PATCH 04/30] support pinning the anvil fork block, and document the tradeoffs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER was documented in .env.example and the README but read by no code, on this branch and on main alike — the fork always used the chain head. Wire it into CREATE_ANVIL_OPTIONS, validated and omitted entirely when unset so the default behaviour is unchanged. Pinning is left off by default because it requires an archive endpoint: public RPCs refuse historical state, and anvil then fails before genesis with "Archive requests require a personal token". Anvil's on-disk cache masks this locally, so a machine that has already fetched the block passes while a clean checkout or CI fails. Also record why the Zora 721 fixture is an open edition: an unpinned fork keeps minting from it, so a drop that could sell out would fail these suites over time with no code change. Co-Authored-By: Claude Opus 5 (1M context) --- packages/sdk/.env.example | 50 +++++++++++++++++++++----- packages/test-fixtures/src/anvil.ts | 37 +++++++++++++++++++ packages/test-fixtures/src/fixtures.ts | 8 +++++ 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/packages/sdk/.env.example b/packages/sdk/.env.example index b34adf4..7a8aaf9 100644 --- a/packages/sdk/.env.example +++ b/packages/sdk/.env.example @@ -1,10 +1,44 @@ -# VITE_ prefix is required for Vitest to pick up the env vars +# All of these are OPTIONAL. The test suite runs with no env file at all: +# the mainnet fork falls back to a public RPC endpoint. +# +# Copy to `.env.test` (gitignored) if you want to override anything. +# The VITE_ prefix is required for Vitest to pick up the vars. -# PUBLIC ENV VARS, add to `.env`: -VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.alchemyapi.io/v2/$PRIVATE_ALCHEMY_API_KEY -VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER=21023556 +# Mainnet fork endpoint. The fallback (ethereum-rpc.publicnode.com) works, but +# it rate-limits — which is the usual cause of intermittent test failures. +# Point this at your own provider for faster, more reliable runs. +# VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.g.alchemy.com/v2/ -# PRIVATE KEYS, add to .env.local, do not commit: -VITE_PRIVATE_ALCHEMY_API_KEY= -# MAINNET_PRIVATE_KEY -VITE_MAINNET_PRIVATE_KEY='0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' # This is the private key of Anvil account #0 \ No newline at end of file +# Pin the fork to a fixed block, making runs deterministic. +# +# REQUIRES AN ARCHIVE ENDPOINT. Serving state at a past block is an archive +# request, and public RPCs refuse it — anvil then fails before genesis with +# "Archive requests require a personal token". Set this ONLY alongside an +# archive-capable VITE_ANVIL_MAINNET_FORK_ENDPOINT above. +# +# Note that anvil caches forked state in ~/.foundry/cache/rpc, so a machine that +# has already cached the block can pass while a clean checkout or CI fails. +# +# Pins also go stale: as the block recedes, providers prune it and the mainnet +# state the tests assert against drifts. The failure looks like unrelated test +# errors, not a bad block number. Refresh it periodically rather than setting +# it once. +# VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER=25835325 + +# Anvil's account #0 — a well-known key, safe to commit. Only used by tests. +# VITE_MAINNET_PRIVATE_KEY='0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' + +# Only needed to regenerate ABIs via `pnpm wagmi generate`. +# ETHERSCAN_API_KEY= + +# --------------------------------------------------------------------------- +# USE_VERBOSE_TESTS — detailed test diagnostics (quiet by default) +# +# This one does NOT belong in this file. It is read straight from process.env +# (no VITE_ prefix), and Vite only loads VITE_-prefixed vars, so setting it +# here has no effect. Pass it inline instead: +# +# USE_VERBOSE_TESTS=true pnpm test +# +# Accepts "1" or "true". +# --------------------------------------------------------------------------- diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts index 6a16839..7d66765 100644 --- a/packages/test-fixtures/src/anvil.ts +++ b/packages/test-fixtures/src/anvil.ts @@ -22,6 +22,39 @@ export const FORK_URL = process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? "https://ethereum-rpc.publicnode.com" +/** + * Optional block to pin the fork at. Pinning makes runs deterministic — the + * suites assert against live mainnet state (Zora drops, ENS, WETH), so an + * unpinned fork re-reads a moving chain on every run. + * + * Requires an ARCHIVE endpoint. Serving state at a past block is an archive + * request, and public RPCs refuse it: forking a pinned block against + * ethereum-rpc.publicnode.com fails before genesis with "Archive requests + * require a personal token". Anvil's on-disk cache (~/.foundry/cache/rpc) can + * mask this locally — a machine that has already cached the block will pass + * while a clean checkout or CI fails. + * + * Pins also go stale: as the block recedes, providers prune it and the mainnet + * state these suites assert against drifts further from the assertions. That + * surfaces as unrelated test failures rather than anything naming the block. + * + * So: set VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER only alongside an archive-capable + * VITE_ANVIL_MAINNET_FORK_ENDPOINT (e.g. Alchemy), and refresh it periodically. + * Leave it unset to fork from the chain head, which works on any endpoint. + */ +export const FORK_BLOCK_NUMBER = (() => { + const raw = process.env.VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER?.trim() + if (!raw) return undefined + + const parsed = Number(raw) + if (!Number.isSafeInteger(parsed) || parsed <= 0) { + throw new Error( + `VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER must be a positive integer, got "${raw}"`, + ) + } + return parsed +})() + export const ANVIL_CONFIG = { TIMEOUT: 60000, // default 10000 ACTIVE_CHAIN, @@ -34,4 +67,8 @@ export const ANVIL_CONFIG = { */ export const CREATE_ANVIL_OPTIONS: CreateAnvilOptions = { forkUrl: FORK_URL, + // Omitted entirely when unset, so anvil forks from the head as before. + ...(FORK_BLOCK_NUMBER === undefined + ? {} + : { forkBlockNumber: FORK_BLOCK_NUMBER }), } diff --git a/packages/test-fixtures/src/fixtures.ts b/packages/test-fixtures/src/fixtures.ts index a9f685f..c82ab1b 100644 --- a/packages/test-fixtures/src/fixtures.ts +++ b/packages/test-fixtures/src/fixtures.ts @@ -10,6 +10,14 @@ import { getAddress, parseUnits } from "viem" import { foundry } from "viem/chains" /** Zora "Webb's First Deep Field" 721 drop — open, free public mint. */ +/** + * Zora 721 drop the fork-backed suites mint from. + * + * Chosen because it is an open edition: no supply cap and no sale end date, so + * an unpinned fork (the default) can keep minting from it indefinitely. A drop + * that could sell out or close would make these suites fail over time with no + * code change, so preserve that property if this address is ever swapped. + */ export const ZORA_721 = { address: getAddress("0x28ee638f2fcb66b4106acab7efd225aeb2bd7e8d"), mintPrice: 0n, From 730f6621626f53b82b0b98c5e1c3e58aeb7984c7 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Tue, 29 Sep 2026 15:35:20 -0700 Subject: [PATCH 05/30] make the examples usable by anyone, not just the NFT's owner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every example was hardcoded to MoonTrees #0 and the tokenbound account derived from it. That NFT belongs to the original author, so clicking any write action as anyone else opened MetaMask and reverted with NotAuthorized() — the account only accepts calls from the holder of its NFT. Nothing signalled why. Replace the hardcoded values with inputs and derive the account instead: - chain picker (Base Sepolia first, so the default costs nothing; mainnets are labelled), which also exercises the SDK now taking any viem Chain - NFT contract + token id inputs, starting empty so no misleading defaults - the account address comes from getAccount(), recomputed as you type - ownership, deployment (via checkAccountDeployment) and balance are shown before anything is clickable Structure the actions as numbered steps, each owning the fields it needs, and gate each on its own precondition: create needs an NFT, execute needs a deployed account the connected wallet holds, transfer needs a funded account. Disabled buttons say which precondition is missing. Also fixes, found along the way: - baseGoerli was the cross-chain destination in both viem examples, but it was sunset in 2023 and the client runs on Base Sepolia. The destination now comes from the chain picker. - the ethers examples built a client with sepolia while wagmi was configured for baseSepolia, so the signer's network never matched. - @tokenbound/ethers throws without a signer, which the hook lacks until a wallet connects — the client is now built lazily instead of throwing during render. - Account no longer reprints the connected address the connect button already shows, and a non-owner's address is abbreviated. Co-Authored-By: Claude Opus 5 (1M context) --- examples/vite-wagmi-ethers/src/App.tsx | 487 +++++++++++++---- .../src/components/Account.tsx | 13 +- examples/vite-wagmi-ethers/src/wagmi.ts | 15 +- examples/vite-wagmi-ethers6/src/App.tsx | 476 ++++++++++++---- .../src/components/Account.tsx | 13 +- examples/vite-wagmi-ethers6/src/main.tsx | 19 +- examples/vite-wagmi-viem/src/App.tsx | 515 ++++++++++++++---- .../src/components/Account.tsx | 13 +- examples/vite-wagmi-viem/src/main.tsx | 21 +- examples/vite-wagmi3-viem/src/App.tsx | 515 ++++++++++++++---- .../src/components/Account.tsx | 13 +- examples/vite-wagmi3-viem/src/main.tsx | 19 +- 12 files changed, 1660 insertions(+), 459 deletions(-) diff --git a/examples/vite-wagmi-ethers/src/App.tsx b/examples/vite-wagmi-ethers/src/App.tsx index be56ce6..16e571d 100644 --- a/examples/vite-wagmi-ethers/src/App.tsx +++ b/examples/vite-wagmi-ethers/src/App.tsx @@ -1,130 +1,413 @@ import { TokenboundClient } from "@tokenbound/ethers" import { ConnectKitButton } from "connectkit" -import { useCallback, useEffect } from "react" -import { getAddress, parseUnits } from "viem" -import { sepolia } from "viem/chains" +import { useCallback, useEffect, useMemo, useState } from "react" + +import { + createPublicClient, + formatEther, + getAddress, + http, + isAddress, + parseAbi, + parseUnits, +} from "viem" import { useAccount } from "wagmi" import { Account } from "./components" import { useEthersSigner } from "./hooks" +import { SUPPORTED_CHAINS } from "./wagmi" -// Origin NFT: MoonTrees #0 on Base Sepolia -const originNFT = { - tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), - tokenId: "0", +declare global { + interface Window { + ethereum?: any // CoinbaseWalletSDK also defines window.ethereum, so we have to work around that :( + } } -// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia -const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") -const recipientAddress = getAddress( - "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", -) -const ethAmount = 0.005 -const ethAmountWei = parseUnits(`${ethAmount}`, 18) +const erc721Abi = parseAbi(["function ownerOf(uint256) view returns (address)"]) + +/** 0x1234…cdef — enough to compare against a wallet without repeating it in full. */ +const shortAddress = (value: string) => + `${value.slice(0, 6)}…${value.slice(-4)}` export function App() { const { isConnected, address } = useAccount() - const signer = useEthersSigner({ chainId: sepolia.id }) - // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() - const tokenboundClient = new TokenboundClient({ - signer, - chain: sepolia, - }) + const [chainId, setChainId] = useState(SUPPORTED_CHAINS[0].id) + const [tokenContract, setTokenContract] = useState("") + const [tokenId, setTokenId] = useState("") + const [executeTo, setExecuteTo] = useState("") + const [transferTo, setTransferTo] = useState("") + const [ethAmount, setEthAmount] = useState("0.005") - useEffect(() => { - console.log("signer", signer) - async function testTokenboundClass() { - if (!tokenboundClient) return + const signer = useEthersSigner({ chainId }) - const tokenboundAccount = tokenboundClient.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) + const chain = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id === chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) + + // @tokenbound/ethers mirrors the SDK's class API, so an ethers Signer is the + // only difference from the viem example. The client requires a signer, and + // the hook has none until a wallet connects — so it is built lazily rather + // than throwing on first render. + const tokenboundClient = useMemo( + () => (signer ? new TokenboundClient({ signer, chain }) : undefined), + [signer, chain], + ) - const preparedExecution = await tokenboundClient.prepareExecution({ - account: tokenboundAccount, - to: recipientAddress, - value: 0n, - data: "0x", + const publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) + + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" + + // getAccount() is pure derivation: no network call, and it returns an address + // whether or not the account has been deployed yet. + const tokenboundAccount = useMemo(() => { + if (!nftIsValid || !tokenboundClient) return undefined + try { + return tokenboundClient.getAccount({ + tokenContract: getAddress(tokenContract), + tokenId, }) + } catch { + return undefined + } + }, [tokenboundClient, tokenContract, tokenId, nftIsValid]) + + const [nftOwner, setNftOwner] = useState() + const [isDeployed, setIsDeployed] = useState() + const [tbaBalance, setTbaBalance] = useState() + const [status, setStatus] = useState() - const preparedCreateAccount = await tokenboundClient.prepareCreateAccount( - { - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }, - ) - - console.log("getAccount", tokenboundAccount) - console.log("preparedExecuteCall", preparedExecution) - console.log("preparedAccount", preparedCreateAccount) - - // if (address) { - // walletClient?.sendTransaction(preparedCreateAccount) - // walletClient?.sendTransaction(preparedExecuteCall) - // } + // Deployment status comes from the SDK's own checkAccountDeployment, and the + // balance decides whether the account has anything to send. Both gate the + // action sections below, so they are resolved before anything is clickable. + useEffect(() => { + let cancelled = false + setNftOwner(undefined) + setIsDeployed(undefined) + setTbaBalance(undefined) + if (!nftIsValid || !tokenboundAccount || !tokenboundClient) return + ;(async () => { + const [owner, deployed, balance] = await Promise.all([ + publicClient + .readContract({ + address: getAddress(tokenContract), + abi: erc721Abi, + functionName: "ownerOf", + args: [BigInt(tokenId)], + }) + .catch(() => undefined), + tokenboundClient + .checkAccountDeployment({ accountAddress: tokenboundAccount }) + .catch(() => false), + publicClient.getBalance({ address: tokenboundAccount }).catch(() => 0n), + ]) + if (cancelled) return + setNftOwner(owner) + setIsDeployed(deployed) + setTbaBalance(balance) + })() + return () => { + cancelled = true } + }, [ + publicClient, + tokenboundClient, + tokenContract, + tokenId, + tokenboundAccount, + nftIsValid, + ]) + + const isOwner = + !!nftOwner && !!address && nftOwner.toLowerCase() === address.toLowerCase() + + const run = useCallback( + async (label: string, fn: () => Promise) => { + try { + setStatus(`${label}…`) + const hash = await fn() + setStatus(hash ? `${label}: ${hash}` : `${label}: done`) + } catch (error) { + setStatus( + `${label} failed: ${ + error instanceof Error ? error.message.split("\n")[0] : error + }`, + ) + } + }, + [], + ) + + const createAccount = useCallback( + () => + run("Create account", async () => { + if (!tokenboundClient) return + const created = await tokenboundClient.createAccount({ + tokenContract: getAddress(tokenContract), + tokenId, + }) + return created.txHash + }), + [run, tokenboundClient, tokenContract, tokenId], + ) + + const execute = useCallback( + () => + run("Execute", async () => { + if (!tokenboundClient || !tokenboundAccount) return + return await tokenboundClient.execute({ + account: tokenboundAccount, + to: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), + data: "0x", + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) + + const transferETH = useCallback( + () => + run("Transfer ETH", async () => { + if (!tokenboundClient || !tokenboundAccount) return + return await tokenboundClient.transferETH({ + account: tokenboundAccount, + recipientAddress: getAddress(transferTo || address || tokenContract), + amount: Number(ethAmount || "0"), + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) + + // Each action has its own precondition, so each section is enabled + // independently rather than behind one catch-all check. + const canCreate = nftIsValid && !!address && !!tokenboundClient + const canExecute = isOwner && isDeployed === true + const canTransfer = canExecute && !!tbaBalance && tbaBalance > 0n - testTokenboundClass() - }, [tokenboundClient, signer]) - - const createAccount = useCallback(async () => { - if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.createAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) - console.log(`new account: ${createdAccount}`) - alert(`new account: ${createdAccount}`) - }, [tokenboundClient, address]) - - const execute = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.execute({ - account: sendingTBA, - to: recipientAddress, - value: ethAmountWei, - data: "0x", - }) - executedCall && alert(`Executed: ${executedCall}`) - }, [tokenboundClient, address]) - - const transferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.transferETH({ - account: sendingTBA, - recipientAddress, - amount: ethAmount, - }) - executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) - }, [tokenboundClient, address]) + const step = { + border: "1px solid #e5e7eb", + borderRadius: "8px", + padding: "16px", + } + const stepTitle = { margin: "0 0 4px", fontSize: "15px" } + const hint = { margin: "0 0 12px", fontSize: "13px", color: "#4b5563" } + const note = { display: "block", marginTop: "6px", color: "#6b7280" } + const field = { + display: "flex", + flexDirection: "column" as const, + gap: "4px", + fontFamily: "Arial, Helvetica, sans-serif", + marginBlock: "0.5rem", + } + const mono = { + fontFamily: "monospace", + fontSize: "13px", + wordBreak: "break-all" as const, + } return ( <> -

Ethers 5 Signer + ConnectKit + Vite

+

@tokenbound/ethers (ethers v5) + ConnectKit + Vite

{isConnected && } - {address && ( -
- - - -
+ +
+
+

1 · Pick a chain and an NFT you own

+

+ A tokenbound account belongs to an NFT. Its address is derived from + the chain, contract and token id — no network call needed. +

+ + + + + {nftIsValid && tokenboundAccount && ( +
+
+ Derived account: {tokenboundAccount} +
+
+ NFT owner:{" "} + {nftOwner + ? isOwner + ? "✅ you" + : `${shortAddress(nftOwner)} — not you` + : "looking up…"} +
+ {isDeployed !== undefined && ( +
+ Status:{" "} + {isDeployed + ? `deployed · ${formatEther(tbaBalance ?? 0n)} ETH` + : "not deployed yet"} +
+ )} +
+ )} +
+ + {address && ( + <> +
+

2 · Create the account

+

+ Deploys the account on-chain. Permissionless — anyone can deploy + an account for any NFT. +

+ + + {!nftIsValid + ? "Fill in the contract and token id above." + : isDeployed === true + ? "Already deployed — nothing to do." + : "Ready to deploy."} + +
+ +
+

3 · Execute a call from the account

+

+ Sends a call as the account. Only the NFT holder can authorize + it, and the account must exist first. +

+ +
+ +
+ + {isDeployed !== true + ? "Create the account first." + : !isOwner + ? "Only the NFT holder can execute." + : "Ready."} + + + Cross-chain execution is viem-only: it needs a fee quote from + the LayerZero executor, which @tokenbound/ethers has no client + for. See the vite-wagmi-viem example. + +
+ +
+

4 · Transfer ETH out of the account

+

+ The ETH comes from the tokenbound account, not your wallet — so + the account needs a balance first. +

+ + + + + {!canExecute + ? "Needs a deployed account you hold the NFT for." + : !tbaBalance || tbaBalance === 0n + ? `The account has no ETH. Send some to ${tokenboundAccount ?? "it"} first.` + : `Account holds ${formatEther(tbaBalance)} ETH.`} + +
+ + )} +
+ + {!tokenboundClient && isConnected && ( +

+ Waiting for a signer — @tokenbound/ethers needs one to build the + client. +

)} + + {status &&

{status}

} ) } diff --git a/examples/vite-wagmi-ethers/src/components/Account.tsx b/examples/vite-wagmi-ethers/src/components/Account.tsx index 83409e4..c6bee76 100644 --- a/examples/vite-wagmi-ethers/src/components/Account.tsx +++ b/examples/vite-wagmi-ethers/src/components/Account.tsx @@ -1,13 +1,14 @@ import { useAccount, useEnsName } from "wagmi" +/** + * The connect button already shows the connected address, so this only adds + * what it does not: the ENS name, when one resolves. + */ export function Account() { const { address } = useAccount() const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + if (!ensName) return null + + return
{ensName}
} diff --git a/examples/vite-wagmi-ethers/src/wagmi.ts b/examples/vite-wagmi-ethers/src/wagmi.ts index a7da002..c690caf 100644 --- a/examples/vite-wagmi-ethers/src/wagmi.ts +++ b/examples/vite-wagmi-ethers/src/wagmi.ts @@ -1,9 +1,20 @@ import { getDefaultConfig } from "connectkit" import type { Chain } from "viem" import { createConfig } from "wagmi" -import { baseSepolia } from "wagmi/chains" +import { base, baseSepolia, mainnet, sepolia, zora } from "wagmi/chains" -const chains: readonly [Chain, ...Chain[]] = [baseSepolia] +// Chains offered in the app's chain picker. Base Sepolia is first, so it is +// wagmi's default: the write actions cost real funds on a mainnet, and the +// testnet keeps the demo free to click through. +export const SUPPORTED_CHAINS = [ + baseSepolia, + sepolia, + base, + mainnet, + zora, +] as const + +const chains: readonly [Chain, ...Chain[]] = [...SUPPORTED_CHAINS] export const wagmiConfig = createConfig( getDefaultConfig({ diff --git a/examples/vite-wagmi-ethers6/src/App.tsx b/examples/vite-wagmi-ethers6/src/App.tsx index b984107..cd8956d 100644 --- a/examples/vite-wagmi-ethers6/src/App.tsx +++ b/examples/vite-wagmi-ethers6/src/App.tsx @@ -1,123 +1,413 @@ import { TokenboundClient } from "@tokenbound/ethers" import { ConnectKitButton } from "connectkit" -import { useCallback, useEffect } from "react" -import { getAddress, parseUnits } from "viem" -import { sepolia } from "viem/chains" +import { useCallback, useEffect, useMemo, useState } from "react" + +import { + createPublicClient, + formatEther, + getAddress, + http, + isAddress, + parseAbi, + parseUnits, +} from "viem" import { useAccount } from "wagmi" import { Account } from "./components" import { useEthers6Signer } from "./hooks" +import { SUPPORTED_CHAINS } from "./main" -// Origin NFT: MoonTrees #0 on Base Sepolia -const originNFT = { - tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), - tokenId: "0", +declare global { + interface Window { + ethereum?: any // CoinbaseWalletSDK also defines window.ethereum, so we have to work around that :( + } } -// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia -const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") -const recipientAddress = getAddress( - "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", -) -const ethAmount = 0.005 -const ethAmountWei = parseUnits(`${ethAmount}`, 18) +const erc721Abi = parseAbi(["function ownerOf(uint256) view returns (address)"]) + +/** 0x1234…cdef — enough to compare against a wallet without repeating it in full. */ +const shortAddress = (value: string) => + `${value.slice(0, 6)}…${value.slice(-4)}` export function App() { const { isConnected, address } = useAccount() - const signer = useEthers6Signer({ chainId: sepolia.id }) - // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() + const [chainId, setChainId] = useState(SUPPORTED_CHAINS[0].id) + const [tokenContract, setTokenContract] = useState("") + const [tokenId, setTokenId] = useState("") + const [executeTo, setExecuteTo] = useState("") + const [transferTo, setTransferTo] = useState("") + const [ethAmount, setEthAmount] = useState("0.005") - console.log("SIGNER", signer) - const tokenboundClient = new TokenboundClient({ signer, chain: sepolia }) + const signer = useEthers6Signer({ chainId }) - useEffect(() => { - async function testTokenboundClass() { - const account = tokenboundClient.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) + const chain = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id === chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) - const preparedExecution = await tokenboundClient.prepareExecution({ - account: account, - to: account, - value: 0n, - data: "0x", - }) + // @tokenbound/ethers mirrors the SDK's class API, so an ethers Signer is the + // only difference from the viem example. The client requires a signer, and + // the hook has none until a wallet connects — so it is built lazily rather + // than throwing on first render. + const tokenboundClient = useMemo( + () => (signer ? new TokenboundClient({ signer, chain }) : undefined), + [signer, chain], + ) - const preparedAccount = await tokenboundClient.prepareCreateAccount({ - tokenContract: "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb", - tokenId: "1", + const publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) + + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" + + // getAccount() is pure derivation: no network call, and it returns an address + // whether or not the account has been deployed yet. + const tokenboundAccount = useMemo(() => { + if (!nftIsValid || !tokenboundClient) return undefined + try { + return tokenboundClient.getAccount({ + tokenContract: getAddress(tokenContract), + tokenId, }) + } catch { + return undefined + } + }, [tokenboundClient, tokenContract, tokenId, nftIsValid]) - console.log("getAccount", account) - console.log("preparedExecution", preparedExecution) - console.log("preparedAccount", preparedAccount) + const [nftOwner, setNftOwner] = useState() + const [isDeployed, setIsDeployed] = useState() + const [tbaBalance, setTbaBalance] = useState() + const [status, setStatus] = useState() - // if (signer) { - // signer?.sendTransaction(preparedAccount) - // signer?.sendTransaction(preparedExecuteCall) - // } + // Deployment status comes from the SDK's own checkAccountDeployment, and the + // balance decides whether the account has anything to send. Both gate the + // action sections below, so they are resolved before anything is clickable. + useEffect(() => { + let cancelled = false + setNftOwner(undefined) + setIsDeployed(undefined) + setTbaBalance(undefined) + if (!nftIsValid || !tokenboundAccount || !tokenboundClient) return + ;(async () => { + const [owner, deployed, balance] = await Promise.all([ + publicClient + .readContract({ + address: getAddress(tokenContract), + abi: erc721Abi, + functionName: "ownerOf", + args: [BigInt(tokenId)], + }) + .catch(() => undefined), + tokenboundClient + .checkAccountDeployment({ accountAddress: tokenboundAccount }) + .catch(() => false), + publicClient.getBalance({ address: tokenboundAccount }).catch(() => 0n), + ]) + if (cancelled) return + setNftOwner(owner) + setIsDeployed(deployed) + setTbaBalance(balance) + })() + return () => { + cancelled = true } + }, [ + publicClient, + tokenboundClient, + tokenContract, + tokenId, + tokenboundAccount, + nftIsValid, + ]) - testTokenboundClass() - }, [tokenboundClient]) - - const createAccount = useCallback(async () => { - if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.createAccount({ - tokenContract: "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb", - tokenId: "1", - }) - alert(`new account: ${createdAccount}`) - }, [tokenboundClient, address]) - - const execute = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.execute({ - account: sendingTBA, - to: recipientAddress, - value: ethAmountWei, - data: "0x", - }) - executedCall && alert(`Executed: ${executedCall}`) - }, [tokenboundClient, address]) - - const transferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.transferETH({ - account: sendingTBA, - recipientAddress, - amount: ethAmount, - }) - executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) - }, [tokenboundClient, address]) + const isOwner = + !!nftOwner && !!address && nftOwner.toLowerCase() === address.toLowerCase() + + const run = useCallback( + async (label: string, fn: () => Promise) => { + try { + setStatus(`${label}…`) + const hash = await fn() + setStatus(hash ? `${label}: ${hash}` : `${label}: done`) + } catch (error) { + setStatus( + `${label} failed: ${ + error instanceof Error ? error.message.split("\n")[0] : error + }`, + ) + } + }, + [], + ) + + const createAccount = useCallback( + () => + run("Create account", async () => { + if (!tokenboundClient) return + const created = await tokenboundClient.createAccount({ + tokenContract: getAddress(tokenContract), + tokenId, + }) + return created.txHash + }), + [run, tokenboundClient, tokenContract, tokenId], + ) + + const execute = useCallback( + () => + run("Execute", async () => { + if (!tokenboundClient || !tokenboundAccount) return + return await tokenboundClient.execute({ + account: tokenboundAccount, + to: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), + data: "0x", + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) + + const transferETH = useCallback( + () => + run("Transfer ETH", async () => { + if (!tokenboundClient || !tokenboundAccount) return + return await tokenboundClient.transferETH({ + account: tokenboundAccount, + recipientAddress: getAddress(transferTo || address || tokenContract), + amount: Number(ethAmount || "0"), + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) + + // Each action has its own precondition, so each section is enabled + // independently rather than behind one catch-all check. + const canCreate = nftIsValid && !!address && !!tokenboundClient + const canExecute = isOwner && isDeployed === true + const canTransfer = canExecute && !!tbaBalance && tbaBalance > 0n + + const step = { + border: "1px solid #e5e7eb", + borderRadius: "8px", + padding: "16px", + } + const stepTitle = { margin: "0 0 4px", fontSize: "15px" } + const hint = { margin: "0 0 12px", fontSize: "13px", color: "#4b5563" } + const note = { display: "block", marginTop: "6px", color: "#6b7280" } + const field = { + display: "flex", + flexDirection: "column" as const, + gap: "4px", + fontFamily: "Arial, Helvetica, sans-serif", + marginBlock: "0.5rem", + } + const mono = { + fontFamily: "monospace", + fontSize: "13px", + wordBreak: "break-all" as const, + } return ( <> -

Ethers 6 Signer + ConnectKit + Vite

+

@tokenbound/ethers (ethers v6) + ConnectKit + Vite

{isConnected && } - {address && ( -
- - - -
+ +
+
+

1 · Pick a chain and an NFT you own

+

+ A tokenbound account belongs to an NFT. Its address is derived from + the chain, contract and token id — no network call needed. +

+ + + + + {nftIsValid && tokenboundAccount && ( +
+
+ Derived account: {tokenboundAccount} +
+
+ NFT owner:{" "} + {nftOwner + ? isOwner + ? "✅ you" + : `${shortAddress(nftOwner)} — not you` + : "looking up…"} +
+ {isDeployed !== undefined && ( +
+ Status:{" "} + {isDeployed + ? `deployed · ${formatEther(tbaBalance ?? 0n)} ETH` + : "not deployed yet"} +
+ )} +
+ )} +
+ + {address && ( + <> +
+

2 · Create the account

+

+ Deploys the account on-chain. Permissionless — anyone can deploy + an account for any NFT. +

+ + + {!nftIsValid + ? "Fill in the contract and token id above." + : isDeployed === true + ? "Already deployed — nothing to do." + : "Ready to deploy."} + +
+ +
+

3 · Execute a call from the account

+

+ Sends a call as the account. Only the NFT holder can authorize + it, and the account must exist first. +

+ +
+ +
+ + {isDeployed !== true + ? "Create the account first." + : !isOwner + ? "Only the NFT holder can execute." + : "Ready."} + + + Cross-chain execution is viem-only: it needs a fee quote from + the LayerZero executor, which @tokenbound/ethers has no client + for. See the vite-wagmi-viem example. + +
+ +
+

4 · Transfer ETH out of the account

+

+ The ETH comes from the tokenbound account, not your wallet — so + the account needs a balance first. +

+ + + + + {!canExecute + ? "Needs a deployed account you hold the NFT for." + : !tbaBalance || tbaBalance === 0n + ? `The account has no ETH. Send some to ${tokenboundAccount ?? "it"} first.` + : `Account holds ${formatEther(tbaBalance)} ETH.`} + +
+ + )} +
+ + {!tokenboundClient && isConnected && ( +

+ Waiting for a signer — @tokenbound/ethers needs one to build the + client. +

)} + + {status &&

{status}

} ) } diff --git a/examples/vite-wagmi-ethers6/src/components/Account.tsx b/examples/vite-wagmi-ethers6/src/components/Account.tsx index 83409e4..c6bee76 100644 --- a/examples/vite-wagmi-ethers6/src/components/Account.tsx +++ b/examples/vite-wagmi-ethers6/src/components/Account.tsx @@ -1,13 +1,14 @@ import { useAccount, useEnsName } from "wagmi" +/** + * The connect button already shows the connected address, so this only adds + * what it does not: the ENS name, when one resolves. + */ export function Account() { const { address } = useAccount() const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + if (!ensName) return null + + return
{ensName}
} diff --git a/examples/vite-wagmi-ethers6/src/main.tsx b/examples/vite-wagmi-ethers6/src/main.tsx index 423277b..865a9dd 100644 --- a/examples/vite-wagmi-ethers6/src/main.tsx +++ b/examples/vite-wagmi-ethers6/src/main.tsx @@ -4,16 +4,31 @@ import * as React from "react" import * as ReactDOM from "react-dom/client" import { http } from "viem" import { createConfig, WagmiProvider } from "wagmi" -import { baseSepolia } from "wagmi/chains" +import { base, baseSepolia, mainnet, sepolia, zora } from "wagmi/chains" import { App } from "./App" const queryClient = new QueryClient() +// Chains offered in the app's chain picker. Base Sepolia is first, so it is +// wagmi's default: the write actions cost real funds on a mainnet, and the +// testnet keeps the demo free to click through. +export const SUPPORTED_CHAINS = [ + baseSepolia, + sepolia, + base, + mainnet, + zora, +] as const + export const config = createConfig({ - chains: [baseSepolia], + chains: SUPPORTED_CHAINS, transports: { [baseSepolia.id]: http(), + [sepolia.id]: http(), + [base.id]: http(), + [mainnet.id]: http(), + [zora.id]: http(), }, }) diff --git a/examples/vite-wagmi-viem/src/App.tsx b/examples/vite-wagmi-viem/src/App.tsx index 68f779b..d2dbe93 100644 --- a/examples/vite-wagmi-viem/src/App.tsx +++ b/examples/vite-wagmi-viem/src/App.tsx @@ -1,11 +1,21 @@ import { ConnectButton } from "@rainbow-me/rainbowkit" import { tokenboundActions } from "@tokenbound/sdk/viem" -import { useCallback, useEffect } from "react" +import { useCallback, useEffect, useMemo, useState } from "react" -import { createWalletClient, custom, getAddress, http, parseUnits } from "viem" -import { baseGoerli, baseSepolia } from "viem/chains" +import { + createPublicClient, + createWalletClient, + custom, + formatEther, + getAddress, + http, + isAddress, + parseAbi, + parseUnits, +} from "viem" import { useAccount } from "wagmi" import { Account } from "./components" +import { SUPPORTED_CHAINS } from "./main" declare global { interface Window { @@ -13,146 +23,419 @@ declare global { } } -// Origin NFT: MoonTrees #0 on Base Sepolia -const originNFT = { - tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), - tokenId: "0", -} +const erc721Abi = parseAbi(["function ownerOf(uint256) view returns (address)"]) -// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia -const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") -const recipientAddress = getAddress( - "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", -) -const ethAmount = 0.005 -const ethAmountWei = parseUnits(`${ethAmount}`, 18) +/** 0x1234…cdef — enough to compare against a wallet without repeating it in full. */ +const shortAddress = (value: string) => + `${value.slice(0, 6)}…${value.slice(-4)}` export function App() { const { isConnected, address } = useAccount() + const [chainId, setChainId] = useState(SUPPORTED_CHAINS[0].id) + const [tokenContract, setTokenContract] = useState("") + const [tokenId, setTokenId] = useState("") + const [executeTo, setExecuteTo] = useState("") + const [transferTo, setTransferTo] = useState("") + const [ethAmount, setEthAmount] = useState("0.005") + + const chain = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id === chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) + // The modern viem-first API: extend a viem client and call through // `client.tokenbound.*`. The extension reuses the same protocol logic as the // standalone functions, and preserves viem's type inference. - const tokenboundClient = createWalletClient({ - chain: baseSepolia, - account: address, - transport: window.ethereum ? custom(window.ethereum) : http(), - }).extend(tokenboundActions()) + const tokenboundClient = useMemo( + () => + createWalletClient({ + chain, + account: address, + transport: window.ethereum ? custom(window.ethereum) : http(), + }).extend(tokenboundActions()), + [chain, address], + ) - useEffect(() => { - async function testTokenboundClass() { - if (!tokenboundClient) return + const publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) + + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" - const tokenboundAccount = tokenboundClient.tokenbound.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, + // getAccount() is pure derivation: no network call, and it returns an address + // whether or not the account has been deployed yet. + const tokenboundAccount = useMemo(() => { + if (!nftIsValid) return undefined + try { + return tokenboundClient.tokenbound.getAccount({ + tokenContract: getAddress(tokenContract), + tokenId, }) + } catch { + return undefined + } + }, [tokenboundClient, tokenContract, tokenId, nftIsValid]) - const preparedExecution = - await tokenboundClient.tokenbound.prepareExecution({ + const [nftOwner, setNftOwner] = useState() + const [isDeployed, setIsDeployed] = useState() + const [tbaBalance, setTbaBalance] = useState() + const [status, setStatus] = useState() + + // Deployment status comes from the SDK's own checkAccountDeployment, and the + // balance decides whether the account has anything to send. Both gate the + // action sections below, so they are resolved before anything is clickable. + useEffect(() => { + let cancelled = false + setNftOwner(undefined) + setIsDeployed(undefined) + setTbaBalance(undefined) + if (!nftIsValid || !tokenboundAccount) return + ;(async () => { + const [owner, deployed, balance] = await Promise.all([ + publicClient + .readContract({ + address: getAddress(tokenContract), + abi: erc721Abi, + functionName: "ownerOf", + args: [BigInt(tokenId)], + }) + .catch(() => undefined), + tokenboundClient.tokenbound + .checkAccountDeployment({ accountAddress: tokenboundAccount }) + .catch(() => false), + publicClient.getBalance({ address: tokenboundAccount }).catch(() => 0n), + ]) + if (cancelled) return + setNftOwner(owner) + setIsDeployed(deployed) + setTbaBalance(balance) + })() + return () => { + cancelled = true + } + }, [ + publicClient, + tokenboundClient, + tokenContract, + tokenId, + tokenboundAccount, + nftIsValid, + ]) + + const isOwner = + !!nftOwner && !!address && nftOwner.toLowerCase() === address.toLowerCase() + + const run = useCallback( + async (label: string, fn: () => Promise) => { + try { + setStatus(`${label}…`) + const hash = await fn() + setStatus(hash ? `${label}: ${hash}` : `${label}: done`) + } catch (error) { + setStatus( + `${label} failed: ${ + error instanceof Error ? error.message.split("\n")[0] : error + }`, + ) + } + }, + [], + ) + + const createAccount = useCallback( + () => + run("Create account", async () => { + const created = await tokenboundClient.tokenbound.createAccount({ + tokenContract: getAddress(tokenContract), + tokenId, + }) + return created.txHash + }), + [run, tokenboundClient, tokenContract, tokenId], + ) + + const execute = useCallback( + () => + run("Execute", async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.execute({ account: tokenboundAccount, - to: recipientAddress, - value: 0n, + to: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), data: "0x", }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) - const preparedCreateAccount = - await tokenboundClient.tokenbound.prepareCreateAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, + const transferETH = useCallback( + () => + run("Transfer ETH", async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.transferETH({ + account: tokenboundAccount, + recipientAddress: getAddress(transferTo || address || tokenContract), + amount: Number(ethAmount || "0"), }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) - console.log("getAccount", tokenboundAccount) - console.log("preparedExecution", preparedExecution) - console.log("preparedAccount", preparedCreateAccount) - - // if (address) { - // walletClient?.sendTransaction(preparedCreateAccount) - // walletClient?.sendTransaction(preparedExecuteCall) - // } - } + // Cross-chain execution: the destination chain is whichever entry in the + // picker is not the one the client is on, so it stays valid when the chain + // selection changes. + const crossChainDestination = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id !== chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) - testTokenboundClass() - }, [tokenboundClient]) - - const createAccount = useCallback(async () => { - if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.tokenbound.createAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) - console.log(`new account: ${createdAccount}`) - alert(`new account: ${createdAccount}`) - }, [tokenboundClient, address]) - - const execute = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.tokenbound.execute({ - account: sendingTBA, - to: recipientAddress, - value: ethAmountWei, - data: "0x", - }) - executedCall && alert(`Executed: ${executedCall}`) - }, [tokenboundClient, address]) - - const transferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.tokenbound.transferETH({ - account: sendingTBA, - recipientAddress, - amount: ethAmount, - }) - executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) - }, [tokenboundClient, address]) - - const crossChainTransferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - - const execution = { - account: sendingTBA, - to: originNFT.tokenContract, - value: 0n, - data: "0x" as const, - chainId: baseGoerli.id, - } + const crossChainTransferETH = useCallback( + () => + run(`Cross-chain execute on ${crossChainDestination.name}`, async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.execute({ + account: tokenboundAccount, + to: getAddress(executeTo || address || tokenContract), + value: 0n, + data: "0x", + chainId: crossChainDestination.id, + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + executeTo, + address, + tokenContract, + crossChainDestination, + ], + ) - const executedCallTxHash = - await tokenboundClient.tokenbound.execute(execution) + // Each action has its own precondition, so each section is enabled + // independently rather than behind one catch-all check. + const canCreate = nftIsValid && !!address + const canExecute = isOwner && isDeployed === true + const canTransfer = canExecute && !!tbaBalance && tbaBalance > 0n - executedCallTxHash && - alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) - }, [tokenboundClient, address]) + const step = { + border: "1px solid #e5e7eb", + borderRadius: "8px", + padding: "16px", + } + const stepTitle = { margin: "0 0 4px", fontSize: "15px" } + const hint = { margin: "0 0 12px", fontSize: "13px", color: "#4b5563" } + const note = { display: "block", marginTop: "6px", color: "#6b7280" } + const field = { + display: "flex", + flexDirection: "column" as const, + gap: "4px", + fontFamily: "Arial, Helvetica, sans-serif", + marginBlock: "0.5rem", + } + const mono = { + fontFamily: "monospace", + fontSize: "13px", + wordBreak: "break-all" as const, + } return ( <>

viem .extend(tokenboundActions()) + RainbowKit + Vite

{isConnected && } - {address && ( -
- - - - -
- )} + +
+
+

1 · Pick a chain and an NFT you own

+

+ A tokenbound account belongs to an NFT. Its address is derived from + the chain, contract and token id — no network call needed. +

+ + + + + {nftIsValid && tokenboundAccount && ( +
+
+ Derived account: {tokenboundAccount} +
+
+ NFT owner:{" "} + {nftOwner + ? isOwner + ? "✅ you" + : `${shortAddress(nftOwner)} — not you` + : "looking up…"} +
+ {isDeployed !== undefined && ( +
+ Status:{" "} + {isDeployed + ? `deployed · ${formatEther(tbaBalance ?? 0n)} ETH` + : "not deployed yet"} +
+ )} +
+ )} +
+ + {address && ( + <> +
+

2 · Create the account

+

+ Deploys the account on-chain. Permissionless — anyone can deploy + an account for any NFT. +

+ + + {!nftIsValid + ? "Fill in the contract and token id above." + : isDeployed === true + ? "Already deployed — nothing to do." + : "Ready to deploy."} + +
+ +
+

3 · Execute a call from the account

+

+ Sends a call as the account. Only the NFT holder can authorize + it, and the account must exist first. +

+ +
+ + +
+ + {isDeployed !== true + ? "Create the account first." + : !isOwner + ? "Only the NFT holder can execute." + : "Ready."} + +
+ +
+

4 · Transfer ETH out of the account

+

+ The ETH comes from the tokenbound account, not your wallet — so + the account needs a balance first. +

+ + + + + {!canExecute + ? "Needs a deployed account you hold the NFT for." + : !tbaBalance || tbaBalance === 0n + ? `The account has no ETH. Send some to ${tokenboundAccount ?? "it"} first.` + : `Account holds ${formatEther(tbaBalance)} ETH.`} + +
+ + )} +
+ + {status &&

{status}

} ) } diff --git a/examples/vite-wagmi-viem/src/components/Account.tsx b/examples/vite-wagmi-viem/src/components/Account.tsx index 83409e4..c6bee76 100644 --- a/examples/vite-wagmi-viem/src/components/Account.tsx +++ b/examples/vite-wagmi-viem/src/components/Account.tsx @@ -1,13 +1,14 @@ import { useAccount, useEnsName } from "wagmi" +/** + * The connect button already shows the connected address, so this only adds + * what it does not: the ENS name, when one resolves. + */ export function Account() { const { address } = useAccount() const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + if (!ensName) return null + + return
{ensName}
} diff --git a/examples/vite-wagmi-viem/src/main.tsx b/examples/vite-wagmi-viem/src/main.tsx index 4e29374..e002bfb 100644 --- a/examples/vite-wagmi-viem/src/main.tsx +++ b/examples/vite-wagmi-viem/src/main.tsx @@ -6,7 +6,7 @@ import * as React from "react" import * as ReactDOM from "react-dom/client" import { http } from "viem" import { createConfig, WagmiProvider } from "wagmi" -import { baseSepolia } from "wagmi/chains" +import { base, baseSepolia, mainnet, sepolia, zora } from "wagmi/chains" import { coinbaseWallet, injected, walletConnect } from "wagmi/connectors" import { App } from "./App" @@ -19,8 +19,19 @@ const queryClient = new QueryClient() // here: without one the example still runs, just without mobile-wallet support. const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID +// Chains offered in the app's chain picker. Base Sepolia is first, so it is +// wagmi's default: the write actions cost real funds on a mainnet, and the +// testnet keeps the demo free to click through. +export const SUPPORTED_CHAINS = [ + baseSepolia, + sepolia, + base, + mainnet, + zora, +] as const + export const config = createConfig({ - chains: [baseSepolia], + chains: SUPPORTED_CHAINS, connectors: [ // EIP-6963 discovery: MetaMask, Rabby, Phantom, Brave — any injected wallet // the browser announces. Without an explicit connector list wagmi falls back @@ -31,8 +42,14 @@ export const config = createConfig({ ? [walletConnect({ projectId: walletConnectProjectId })] : []), ], + // Listed explicitly rather than derived: wagmi types `transports` against the + // literal chain ids in `chains`, which a mapped object erases. transports: { [baseSepolia.id]: http(), + [sepolia.id]: http(), + [base.id]: http(), + [mainnet.id]: http(), + [zora.id]: http(), }, }) diff --git a/examples/vite-wagmi3-viem/src/App.tsx b/examples/vite-wagmi3-viem/src/App.tsx index 678e4c6..6a0e5ad 100644 --- a/examples/vite-wagmi3-viem/src/App.tsx +++ b/examples/vite-wagmi3-viem/src/App.tsx @@ -1,10 +1,20 @@ import { tokenboundActions } from "@tokenbound/sdk/viem" -import { useCallback, useEffect } from "react" +import { useCallback, useEffect, useMemo, useState } from "react" -import { createWalletClient, custom, getAddress, http, parseUnits } from "viem" -import { baseGoerli, baseSepolia } from "viem/chains" +import { + createPublicClient, + createWalletClient, + custom, + formatEther, + getAddress, + http, + isAddress, + parseAbi, + parseUnits, +} from "viem" import { useAccount } from "wagmi" import { Account, ConnectWallet } from "./components" +import { SUPPORTED_CHAINS } from "./main" declare global { interface Window { @@ -12,146 +22,419 @@ declare global { } } -// Origin NFT: MoonTrees #0 on Base Sepolia -const originNFT = { - tokenContract: getAddress("0xcf7ea35b7421a8ff2ff460a939e294ac13a05342"), - tokenId: "0", -} +const erc721Abi = parseAbi(["function ownerOf(uint256) view returns (address)"]) -// TBA: Tokenbound Account derived from MoonTrees #0 on Base Sepolia -const sendingTBA = getAddress("0x5F50CAf6244d10C32965354F8c4d84D84503D42D") -const recipientAddress = getAddress( - "0x9FefE8a875E7a9b0574751E191a2AF205828dEA4", -) -const ethAmount = 0.005 -const ethAmountWei = parseUnits(`${ethAmount}`, 18) +/** 0x1234…cdef — enough to compare against a wallet without repeating it in full. */ +const shortAddress = (value: string) => + `${value.slice(0, 6)}…${value.slice(-4)}` export function App() { const { isConnected, address } = useAccount() + const [chainId, setChainId] = useState(SUPPORTED_CHAINS[0].id) + const [tokenContract, setTokenContract] = useState("") + const [tokenId, setTokenId] = useState("") + const [executeTo, setExecuteTo] = useState("") + const [transferTo, setTransferTo] = useState("") + const [ethAmount, setEthAmount] = useState("0.005") + + const chain = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id === chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) + // The modern viem-first API: extend a viem client and call through // `client.tokenbound.*`. The extension reuses the same protocol logic as the // standalone functions, and preserves viem's type inference. - const tokenboundClient = createWalletClient({ - chain: baseSepolia, - account: address, - transport: window.ethereum ? custom(window.ethereum) : http(), - }).extend(tokenboundActions()) + const tokenboundClient = useMemo( + () => + createWalletClient({ + chain, + account: address, + transport: window.ethereum ? custom(window.ethereum) : http(), + }).extend(tokenboundActions()), + [chain, address], + ) - useEffect(() => { - async function testTokenboundClass() { - if (!tokenboundClient) return + const publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) + + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" - const tokenboundAccount = tokenboundClient.tokenbound.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, + // getAccount() is pure derivation: no network call, and it returns an address + // whether or not the account has been deployed yet. + const tokenboundAccount = useMemo(() => { + if (!nftIsValid) return undefined + try { + return tokenboundClient.tokenbound.getAccount({ + tokenContract: getAddress(tokenContract), + tokenId, }) + } catch { + return undefined + } + }, [tokenboundClient, tokenContract, tokenId, nftIsValid]) - const preparedExecution = - await tokenboundClient.tokenbound.prepareExecution({ + const [nftOwner, setNftOwner] = useState() + const [isDeployed, setIsDeployed] = useState() + const [tbaBalance, setTbaBalance] = useState() + const [status, setStatus] = useState() + + // Deployment status comes from the SDK's own checkAccountDeployment, and the + // balance decides whether the account has anything to send. Both gate the + // action sections below, so they are resolved before anything is clickable. + useEffect(() => { + let cancelled = false + setNftOwner(undefined) + setIsDeployed(undefined) + setTbaBalance(undefined) + if (!nftIsValid || !tokenboundAccount) return + ;(async () => { + const [owner, deployed, balance] = await Promise.all([ + publicClient + .readContract({ + address: getAddress(tokenContract), + abi: erc721Abi, + functionName: "ownerOf", + args: [BigInt(tokenId)], + }) + .catch(() => undefined), + tokenboundClient.tokenbound + .checkAccountDeployment({ accountAddress: tokenboundAccount }) + .catch(() => false), + publicClient.getBalance({ address: tokenboundAccount }).catch(() => 0n), + ]) + if (cancelled) return + setNftOwner(owner) + setIsDeployed(deployed) + setTbaBalance(balance) + })() + return () => { + cancelled = true + } + }, [ + publicClient, + tokenboundClient, + tokenContract, + tokenId, + tokenboundAccount, + nftIsValid, + ]) + + const isOwner = + !!nftOwner && !!address && nftOwner.toLowerCase() === address.toLowerCase() + + const run = useCallback( + async (label: string, fn: () => Promise) => { + try { + setStatus(`${label}…`) + const hash = await fn() + setStatus(hash ? `${label}: ${hash}` : `${label}: done`) + } catch (error) { + setStatus( + `${label} failed: ${ + error instanceof Error ? error.message.split("\n")[0] : error + }`, + ) + } + }, + [], + ) + + const createAccount = useCallback( + () => + run("Create account", async () => { + const created = await tokenboundClient.tokenbound.createAccount({ + tokenContract: getAddress(tokenContract), + tokenId, + }) + return created.txHash + }), + [run, tokenboundClient, tokenContract, tokenId], + ) + + const execute = useCallback( + () => + run("Execute", async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.execute({ account: tokenboundAccount, - to: recipientAddress, - value: 0n, + to: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), data: "0x", }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) - const preparedCreateAccount = - await tokenboundClient.tokenbound.prepareCreateAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, + const transferETH = useCallback( + () => + run("Transfer ETH", async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.transferETH({ + account: tokenboundAccount, + recipientAddress: getAddress(transferTo || address || tokenContract), + amount: Number(ethAmount || "0"), }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + transferTo, + address, + tokenContract, + ethAmount, + ], + ) - console.log("getAccount", tokenboundAccount) - console.log("preparedExecution", preparedExecution) - console.log("preparedAccount", preparedCreateAccount) - - // if (address) { - // walletClient?.sendTransaction(preparedCreateAccount) - // walletClient?.sendTransaction(preparedExecuteCall) - // } - } + // Cross-chain execution: the destination chain is whichever entry in the + // picker is not the one the client is on, so it stays valid when the chain + // selection changes. + const crossChainDestination = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id !== chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) - testTokenboundClass() - }, [tokenboundClient]) - - const createAccount = useCallback(async () => { - if (!tokenboundClient || !address) return - const createdAccount = await tokenboundClient.tokenbound.createAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) - console.log(`new account: ${createdAccount}`) - alert(`new account: ${createdAccount}`) - }, [tokenboundClient, address]) - - const execute = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedCall = await tokenboundClient.tokenbound.execute({ - account: sendingTBA, - to: recipientAddress, - value: ethAmountWei, - data: "0x", - }) - executedCall && alert(`Executed: ${executedCall}`) - }, [tokenboundClient, address]) - - const transferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - const executedTransfer = await tokenboundClient.tokenbound.transferETH({ - account: sendingTBA, - recipientAddress, - amount: ethAmount, - }) - executedTransfer && alert(`Sent ${ethAmount} ETH to ${recipientAddress}`) - }, [tokenboundClient, address]) - - const crossChainTransferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - - const execution = { - account: sendingTBA, - to: originNFT.tokenContract, - value: 0n, - data: "0x" as const, - chainId: baseGoerli.id, - } + const crossChainTransferETH = useCallback( + () => + run(`Cross-chain execute on ${crossChainDestination.name}`, async () => { + if (!tokenboundAccount) return + return await tokenboundClient.tokenbound.execute({ + account: tokenboundAccount, + to: getAddress(executeTo || address || tokenContract), + value: 0n, + data: "0x", + chainId: crossChainDestination.id, + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + executeTo, + address, + tokenContract, + crossChainDestination, + ], + ) - const executedCallTxHash = - await tokenboundClient.tokenbound.execute(execution) + // Each action has its own precondition, so each section is enabled + // independently rather than behind one catch-all check. + const canCreate = nftIsValid && !!address + const canExecute = isOwner && isDeployed === true + const canTransfer = canExecute && !!tbaBalance && tbaBalance > 0n - executedCallTxHash && - alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) - }, [tokenboundClient, address]) + const step = { + border: "1px solid #e5e7eb", + borderRadius: "8px", + padding: "16px", + } + const stepTitle = { margin: "0 0 4px", fontSize: "15px" } + const hint = { margin: "0 0 12px", fontSize: "13px", color: "#4b5563" } + const note = { display: "block", marginTop: "6px", color: "#6b7280" } + const field = { + display: "flex", + flexDirection: "column" as const, + gap: "4px", + fontFamily: "Arial, Helvetica, sans-serif", + marginBlock: "0.5rem", + } + const mono = { + fontFamily: "monospace", + fontSize: "13px", + wordBreak: "break-all" as const, + } return ( <>

viem .extend(tokenboundActions()) + wagmi 3 + Vite

{isConnected && } - {address && ( -
- - - - -
- )} + +
+
+

1 · Pick a chain and an NFT you own

+

+ A tokenbound account belongs to an NFT. Its address is derived from + the chain, contract and token id — no network call needed. +

+ + + + + {nftIsValid && tokenboundAccount && ( +
+
+ Derived account: {tokenboundAccount} +
+
+ NFT owner:{" "} + {nftOwner + ? isOwner + ? "✅ you" + : `${shortAddress(nftOwner)} — not you` + : "looking up…"} +
+ {isDeployed !== undefined && ( +
+ Status:{" "} + {isDeployed + ? `deployed · ${formatEther(tbaBalance ?? 0n)} ETH` + : "not deployed yet"} +
+ )} +
+ )} +
+ + {address && ( + <> +
+

2 · Create the account

+

+ Deploys the account on-chain. Permissionless — anyone can deploy + an account for any NFT. +

+ + + {!nftIsValid + ? "Fill in the contract and token id above." + : isDeployed === true + ? "Already deployed — nothing to do." + : "Ready to deploy."} + +
+ +
+

3 · Execute a call from the account

+

+ Sends a call as the account. Only the NFT holder can authorize + it, and the account must exist first. +

+ +
+ + +
+ + {isDeployed !== true + ? "Create the account first." + : !isOwner + ? "Only the NFT holder can execute." + : "Ready."} + +
+ +
+

4 · Transfer ETH out of the account

+

+ The ETH comes from the tokenbound account, not your wallet — so + the account needs a balance first. +

+ + + + + {!canExecute + ? "Needs a deployed account you hold the NFT for." + : !tbaBalance || tbaBalance === 0n + ? `The account has no ETH. Send some to ${tokenboundAccount ?? "it"} first.` + : `Account holds ${formatEther(tbaBalance)} ETH.`} + +
+ + )} +
+ + {status &&

{status}

} ) } diff --git a/examples/vite-wagmi3-viem/src/components/Account.tsx b/examples/vite-wagmi3-viem/src/components/Account.tsx index 83409e4..c6bee76 100644 --- a/examples/vite-wagmi3-viem/src/components/Account.tsx +++ b/examples/vite-wagmi3-viem/src/components/Account.tsx @@ -1,13 +1,14 @@ import { useAccount, useEnsName } from "wagmi" +/** + * The connect button already shows the connected address, so this only adds + * what it does not: the ENS name, when one resolves. + */ export function Account() { const { address } = useAccount() const { data: ensName } = useEnsName({ address }) - return ( -
- {ensName ?? address} - {ensName ? ` (${address})` : null} -
- ) + if (!ensName) return null + + return
{ensName}
} diff --git a/examples/vite-wagmi3-viem/src/main.tsx b/examples/vite-wagmi3-viem/src/main.tsx index ee6da88..206d61e 100644 --- a/examples/vite-wagmi3-viem/src/main.tsx +++ b/examples/vite-wagmi3-viem/src/main.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as ReactDOM from "react-dom/client" import { http } from "viem" import { createConfig, WagmiProvider } from "wagmi" -import { baseSepolia } from "wagmi/chains" +import { base, baseSepolia, mainnet, sepolia, zora } from "wagmi/chains" import { coinbaseWallet, injected, walletConnect } from "wagmi/connectors" import { App } from "./App" @@ -16,8 +16,19 @@ const queryClient = new QueryClient() // here: without one the example still runs, just without mobile-wallet support. const walletConnectProjectId = import.meta.env.VITE_WALLETCONNECT_PROJECT_ID +// Chains offered in the app's chain picker. Base Sepolia is first, so it is +// wagmi's default: the write actions cost real funds on a mainnet, and the +// testnet keeps the demo free to click through. +export const SUPPORTED_CHAINS = [ + baseSepolia, + sepolia, + base, + mainnet, + zora, +] as const + export const config = createConfig({ - chains: [baseSepolia], + chains: SUPPORTED_CHAINS, connectors: [ // EIP-6963 discovery: MetaMask, Rabby, Phantom, Brave — any injected wallet // the browser announces. Without an explicit connector list wagmi falls back @@ -30,6 +41,10 @@ export const config = createConfig({ ], transports: { [baseSepolia.id]: http(), + [sepolia.id]: http(), + [base.id]: http(), + [mainnet.id]: http(), + [zora.id]: http(), }, }) From 4f24fd4c8d6b7d917530ce7a42be43b75f31f960 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Tue, 29 Sep 2026 15:36:48 -0700 Subject: [PATCH 06/30] correct the contributor setup instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Run Tests section opened with "Set up environment variables in .env.test" and an Alchemy key, implying the suites could not run without one. They can: the mainnet fork falls back to a public RPC, verified by moving .env.test and .env.local aside and running the fork suite green. Other corrections in that section: - Foundry was never listed as a prerequisite, though anvil is the one genuinely required install - it recommended setting VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER, which breaks a clean checkout unless the endpoint serves archive requests - `pnpm prep` and `pnpm wagmi` were given as root commands; they only exist in packages/sdk - it described integration tests rendered with renderWithWagmiConfig, which no longer exists - USE_VERBOSE_TESTS was documented as an env var, but it is read from process.env with no VITE_ prefix, so Vite never loads it from .env.test — it only works inline Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 76 +++++++++++++++++++++---------------------------------- 1 file changed, 29 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index e771285..6ce874d 100644 --- a/README.md +++ b/README.md @@ -38,86 +38,68 @@ NOTE: Any local changes to SDK methods in `TokenboundClient.ts` require a rebuil ## Unit/integration tests -Tests are using [Vitest](https://vitest.dev), and can be performed via multiple pipelines: +Tests use [Vitest](https://vitest.dev). The fork-backed suites spin up a local Anvil instance via [@viem/anvil](https://www.npmjs.com/package/@viem/anvil) and transact against a fork of mainnet, so **[Foundry](https://book.getfoundry.sh/getting-started/installation) must be installed and `anvil` on your `PATH`**. -- Unit tests spin up a local Anvil instance using [viem/anvil](https://www.npmjs.com/package/@viem/anvil) and transact against a local fork of mainnet. -- Integration tests are rendered with a [custom `render` function](https://testing-library.com/docs/react-testing-library/setup/#custom-render) from React Testing Library that integrates with Anvil. See usage of `renderWithWagmiConfig` in `packages/sdk/src/tests`. - -`@tokenbound/sdk`'s suite is viem-only. `@tokenbound/ethers` runs its own suite, exercising ethers v5 and ethers v6 independently against separate Anvil forks, so a behavioural difference in one major version can't be masked by the other. Both packages cover the ERC-6551 V2 (legacy) and V3 deployments. - -These tests require a local Anvil node so test transactions can be run against a mainnet fork. +`@tokenbound/sdk`'s suite is viem-only. `@tokenbound/ethers` runs its own, exercising ethers v5 and v6 independently against separate Anvil forks, so a behavioural difference in one major version can't be masked by the other. Both packages cover the ERC-6551 V2 (legacy) and V3 deployments — six variants in total. Thanks to [@tmm](https://github.com/tmm) for sharing [testing-wagmi](https://github.com/tmm/testing-wagmi) for reference. ### Run Tests -1. Set up environment variables in `.env.test` - -```ts copy -# VITE_ prefix is required for Vite to pick up the env vars - -# PRIVATE KEYS CAN GO HERE -VITE_PRIVATE_ALCHEMY_API_KEY=REPLACE_WITH_YOUR_ALCHEMY_API_KEY +**No environment setup is required.** The mainnet fork falls back to a public RPC endpoint -# PUBLIC ENV VARS, add to `.env`: -VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.alchemyapi.io/v2/$VITE_PRIVATE_ALCHEMY_API_KEY -VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER=21023556 +```bash copy +pnpm install +pnpm build +pnpm test ``` -2. Build the SDK from `/packages/sdk` +Running only one side, or skipping the network entirely: ```bash copy -pnpm clean && pnpm i && pnpm build +pnpm test:viem # @tokenbound/sdk only +pnpm test:ethers # @tokenbound/ethers only +pnpm test:unit # no Anvil, no network calls ``` -3. Generate ABIs using [Wagmi CLI](https://wagmi.sh/cli/getting-started) +Output is quiet by default. For detailed diagnostics, pass `USE_VERBOSE_TESTS` inline — it is read from `process.env` and takes no `VITE_` prefix, so it cannot be set in `.env.test`: ```bash copy -pnpm wagmi +USE_VERBOSE_TESTS=true pnpm test ``` -For convenience, you can also execute all commands from steps 2 and 3 using `pnpm prep`. +### Optional: use your own RPC endpoint -4. Spin up an Anvil instance and start Vitest from the SDK root: +The public fallback (`ethereum-rpc.publicnode.com`) works but rate-limits, which is the usual cause of intermittent failures. To use your own provider, create `packages/sdk/.env.test` (gitignored): ```bash copy -pnpm test +VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.g.alchemy.com/v2/ ``` -All unit tests will be executed. - -#### Running one package's tests - -From the repository root: +You can optionally pin the fork to a fixed block. Every run then sees identical chain state, which removes a potential source of flakiness: suites assert against live mainnet (Zora drops, ENS, WETH), so an unpinned fork re-reads a moving chain each time: ```bash copy -pnpm test # both packages -pnpm test:viem # @tokenbound/sdk only -pnpm test:ethers # @tokenbound/ethers only -pnpm test:unit # the SDK's unit tests only (no Anvil fork needed) +VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER=25835325 ``` -The ethers suites are split one file per command, so the v5 and v6 forks never -share a process. `pnpm test:ethers` runs all four in sequence; to run just one, -use these from `packages/ethers`: +Pinning is **off by default**, so the suites fork from the chain head. -```bash copy -pnpm test:all # ethers v5 + v6 against the V3 deployment -pnpm test:v2 # ethers v5 + v6 against the legacy V2 deployment -pnpm test:versions # version detection and message normalization (no chain) -pnpm test:fixtures # shared fixtures are wired up correctly -``` +Note: An unpinned test run depends on drops still being mintable on terms the fixtures assume. Eg. if a drop sells out or a sales window closes, tests would start to fail. The current ERC-721 fixture is an open edition with no supply cap or end date, so this issue shouldn't arise, but worth noting if modifying tests. -#### Verbose test output +Pinning to a known-good block is the fix for that — which is the tradeoff: a pin protects from chain drift, but comes with the cost of needing an archive endpoint and periodic refreshing. -The fork-backed suites log derived addresses, balances and transaction hashes, -which is what you want when a mainnet-fork test fails but noise otherwise. It is -off by default — set `USE_VERBOSE_TESTS` to turn it on: +See [`packages/sdk/.env.example`](packages/sdk/.env.example) for the full list of supported variables. + +### Regenerating ABIs + +Test ABIs are generated from verified mainnet deployments with the [Wagmi CLI](https://wagmi.sh/cli/getting-started). They are committed, so this is only needed when the contracts change: ```bash copy -USE_VERBOSE_TESTS=1 pnpm test +cd packages/sdk && pnpm wagmi ``` +This requires `ETHERSCAN_API_KEY` in `packages/sdk/.env.test`. + ### Pre-commit Hooks Husky has been configured to run a pre-commit hook to ensure tests pass. From f3c62bf51471f52c1b085ae5c506862099ca0c86 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Tue, 29 Sep 2026 16:53:01 -0700 Subject: [PATCH 07/30] support cross-chain execution through @tokenbound/ethers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit encodeCrossChainCall needed a viem PublicClient for one read — the LayerZero fee quote — so the ethers client could not use it and threw instead. Take a one-method interface instead: type ProtocolCaller = { call: (tx) => Promise } A viem client satisfies it with a thin wrapper; the ethers adapter already had exactly this shape, so @tokenbound/ethers still constructs no viem client and protocol/ no longer quietly requires one. The quote is assembled with encodeFunctionData + call + decodeFunctionResult rather than readContract, which is client-only. A revert then arrives as a bare call failure, so it is wrapped with the executor and destination chain. The LayerZero fee is paid by the sender, so it rides on the outer transaction. encodeExecution zeroes that (correct for same-chain, where the account spends its own balance), so the cross-chain path sets it explicitly. Tests run against LayerZero's deployed executor on the mainnet fork rather than a stub: 6 cases via a viem client, 8 via the ethers adapter across v5 and v6, with the calldata compared byte-for-byte between the two. Delivery is still uncovered — the executor is origin-side only and the fork is one chain. Co-Authored-By: Claude Opus 5 (1M context) --- packages/ethers/src/TokenboundClient.ts | 28 ++- .../ethers/src/test/TestCrossChain.test.ts | 172 ++++++++++++++++ packages/sdk/src/TokenboundClient.ts | 10 +- packages/sdk/src/index.ts | 2 + packages/sdk/src/protocol/core.ts | 18 +- .../sdk/src/protocol/functions/crossChain.ts | 55 ++++- packages/sdk/src/test/crossChain.test.ts | 188 ++++++++++++++++++ packages/sdk/src/test/unit/crossChain.test.ts | 144 ++++++++++++++ packages/sdk/src/viem/actions.ts | 22 +- packages/test-fixtures/src/fixtures.ts | 13 ++ 10 files changed, 622 insertions(+), 30 deletions(-) create mode 100644 packages/ethers/src/test/TestCrossChain.test.ts create mode 100644 packages/sdk/src/test/crossChain.test.ts create mode 100644 packages/sdk/src/test/unit/crossChain.test.ts diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts index 74438ff..8cbbb5d 100644 --- a/packages/ethers/src/TokenboundClient.ts +++ b/packages/ethers/src/TokenboundClient.ts @@ -13,6 +13,7 @@ import { type ERC20TransferParams, type ETHTransferParams, type ExecuteParams, + encodeCrossChainCall, encodeERC20Transfer, encodeETHTransfer, encodeExecuteCall, @@ -180,7 +181,8 @@ export class TokenboundClient { /** * Returns prepared transaction to execute on a tokenbound account. - * Cross-chain execution is not supported through the ethers adapter. + * + * A `chainId` other than the client's routes the call through LayerZero. */ public async prepareExecution(params: ExecuteParams): Promise { const { account, to, value, data, chainId = this.chainId } = params @@ -190,9 +192,27 @@ export class TokenboundClient { } if (chainId !== this.chainId) { - throw new Error( - "Cross-chain execution is not supported via @tokenbound/ethers. Use @tokenbound/sdk with a viem client.", - ) + const crossChain = await encodeCrossChainCall({ + caller: this.adapter, + account, + to, + value, + data: data as Hex, + originChainId: this.chainId, + destinationChainId: chainId, + }) + + // The account executes the LayerZero call, so it wraps like any other — + // but the LayerZero fee is paid by the sender, so it has to ride on the + // outer transaction too. encodeExecution always zeroes that. + const execution = encodeExecution({ + account, + to: crossChain.to, + value: crossChain.value, + data: crossChain.data as Hex, + }) + + return { ...execution, value: crossChain.value } } return encodeExecution({ diff --git a/packages/ethers/src/test/TestCrossChain.test.ts b/packages/ethers/src/test/TestCrossChain.test.ts new file mode 100644 index 0000000..58026b5 --- /dev/null +++ b/packages/ethers/src/test/TestCrossChain.test.ts @@ -0,0 +1,172 @@ +// Cross-chain execution through @tokenbound/ethers, against the real executor. +// +// The mainnet fork carries LayerZero's deployed executor, so the fee quote here +// is a genuine eth_call made through the ethers adapter — the same path +// production takes. The calldata is then compared against the viem core's, which +// is what "supported on both" has to mean. + +import { + encodeCrossChainCall, + encodeExecution, + getAccountAddress, + resolveDeployment, +} from "@tokenbound/sdk" +import { + ANVIL_ACCOUNTS, + CREATE_ANVIL_OPTIONS, + CROSS_CHAIN_SENDER_NFT, + RECIPIENT_ADDRESS, +} from "@tokenbound/test-fixtures" +import { createAnvil } from "@viem/anvil" +import { ethers } from "ethers" +import { JsonRpcProvider, Wallet } from "ethers6" +import { createPublicClient, type Hex, http, type PublicClient } from "viem" +import { base, mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../index" + +const TIMEOUT = 60000 + +const SENDING_TBA = getAccountAddress( + { ...CROSS_CHAIN_SENDER_NFT, chainId: mainnet.id }, + resolveDeployment({}), +) + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version — cross-chain execution", + ({ version }) => { + const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + const rpcUrl = `http://127.0.0.1:${anvil.port}` + + let tokenboundClient: TokenboundClient + let publicClient: PublicClient + + beforeAll(async () => { + await anvil.start() + + publicClient = createPublicClient({ + chain: mainnet, + transport: http(rpcUrl), + }) as PublicClient + + const signer = + version === 5 + ? new ethers.Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + : new Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new JsonRpcProvider(rpcUrl), + ) + + tokenboundClient = new TokenboundClient({ signer, chain: mainnet }) + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + }) + + const prepareCrossChain = () => + tokenboundClient.prepareExecution({ + account: SENDING_TBA, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x", + chainId: base.id, + }) + + it( + "quotes the fee through the ethers adapter", + async () => { + const prepared = await prepareCrossChain() + + // The fee is fetched via adapter.call against the forked executor, so + // a zero value would mean the quote never happened. + expect(prepared.value).toBeGreaterThan(0n) + expect(prepared.value).toBeLessThan(10n ** 18n) + }, + TIMEOUT, + ) + + it( + "targets the account, not the LayerZero executor", + async () => { + const prepared = await prepareCrossChain() + + // The account executes the LayerZero call, so the outer transaction + // goes to the account. Sending straight to the executor would bypass + // the tokenbound account entirely. + expect(prepared.to).toBe(SENDING_TBA) + // execute(address,uint256,bytes,uint8) + expect(prepared.data.slice(0, 10)).toBe("0x51945447") + }, + TIMEOUT, + ) + + it( + "encodes identically to the viem core", + async () => { + const prepared = await prepareCrossChain() + + // What @tokenbound/sdk produces for the same inputs, quoted through a + // viem client instead of the adapter. + const crossChain = await encodeCrossChainCall({ + caller: { + call: async (tx) => { + const { data } = await publicClient.call(tx) + if (data === undefined) { + throw new Error("no data") + } + return data + }, + }, + account: SENDING_TBA, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x", + originChainId: mainnet.id, + destinationChainId: base.id, + }) + // The fee rides on the outer transaction, which encodeExecution zeroes. + const expected = { + ...encodeExecution({ + account: SENDING_TBA, + to: crossChain.to, + value: crossChain.value, + data: crossChain.data as Hex, + }), + value: crossChain.value, + } + + expect(prepared.to).toBe(expected.to) + expect(prepared.data).toBe(expected.data) + // The quotes are independent calls, so the fees can differ by the + // executor's per-block pricing — compare within a tolerance. + const delta = + prepared.value > expected.value + ? prepared.value - expected.value + : expected.value - prepared.value + expect(delta).toBeLessThan(expected.value / 100n + 100n) + }, + TIMEOUT, + ) + + it( + "leaves same-chain execution unchanged", + async () => { + const sameChain = await tokenboundClient.prepareExecution({ + account: SENDING_TBA, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x", + }) + + expect(sameChain.to).toBe(SENDING_TBA) + // No LayerZero fee on a same-chain call. + expect(sameChain.value).toBe(0n) + }, + TIMEOUT, + ) + }, +) diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index fb9e4ed..5af1541 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -311,7 +311,15 @@ class TokenboundClient { value: crossChainValue, data: crossChainData, } = await encodeCrossChainCall({ - publicClient: this.publicClient, + caller: { + call: async (tx) => { + const { data: returnData } = await this.publicClient.call(tx) + if (returnData === undefined) { + throw new Error(`Call to ${tx.to} returned no data`) + } + return returnData + }, + }, account, to, value, diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index a7ba51e..5d7e8ed 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -8,6 +8,7 @@ export { computeAccount, deconstructBytecode, + encodeCrossChainCall, encodeERC20Transfer, encodeETHTransfer, encodeExecuteCall, @@ -17,6 +18,7 @@ export { getCreationCode, hasBytecode, isCustomImplementation, + type ProtocolCaller, type ProtocolDeploymentStatus, prepareCreateAccountTx, type ResolvedDeployment, diff --git a/packages/sdk/src/protocol/core.ts b/packages/sdk/src/protocol/core.ts index 71def26..0238780 100644 --- a/packages/sdk/src/protocol/core.ts +++ b/packages/sdk/src/protocol/core.ts @@ -95,11 +95,7 @@ export function resolveDeployment(options: { } } -/** - * True when an `eth_getCode` result represents a contract rather than an empty - * account. Shared so the viem core and @tokenbound/ethers agree on what counts - * as deployed, even though each fetches the bytecode through its own transport. - */ +/** True when `eth_getCode` returned contract bytecode rather than an empty account. */ export function hasBytecode(bytecode: Hex | undefined | null): boolean { return bytecode ? bytecode.length > 2 : false } @@ -118,19 +114,11 @@ export type ProtocolDeploymentStatus = { isFullyDeployed: boolean registryAddress: Address implementationAddress: Address - /** - * Where the missing contracts can be deployed. Present only when - * `isFullyDeployed` is false, so a caller can surface the fix alongside the - * problem; `undefined` on a fully deployed chain. - */ + /** Where to deploy the missing contracts. Set only when not fully deployed. */ deployerUrl?: string } -/** - * Assembles the deployment status from two already-fetched bytecode results. - * Pure: the caller does the fetching, so the viem core and @tokenbound/ethers - * share this logic without sharing a transport. - */ +/** Builds the deployment status from two already-fetched bytecode results. */ export function toProtocolDeploymentStatus(params: { registryCode: Hex | undefined | null implementationCode: Hex | undefined | null diff --git a/packages/sdk/src/protocol/functions/crossChain.ts b/packages/sdk/src/protocol/functions/crossChain.ts index e51174f..d1ea32e 100644 --- a/packages/sdk/src/protocol/functions/crossChain.ts +++ b/packages/sdk/src/protocol/functions/crossChain.ts @@ -1,11 +1,27 @@ import { Options } from "@layerzerolabs/lz-v2-utilities" -import { encodeFunctionData, type PublicClient, parseAbi } from "viem" +import { + type Address, + decodeFunctionResult, + encodeFunctionData, + type Hex, + parseAbi, +} from "viem" import type { CallData, Prettify } from "../../types" import { ERC_6551_DEFAULT, LZ_EIDS, LZ_EXECUTORS } from "../constants" +/** + * A read-only `eth_call` returning raw return data. + * + * Satisfied by a viem client and by @tokenbound/ethers' adapter, so cross-chain + * encoding works on either. + */ +export type ProtocolCaller = { + call: (tx: { to: Address; data: Hex }) => Promise +} + type CrossChainCallParams = Prettify< { - publicClient: PublicClient + caller: ProtocolCaller account: `0x${string}` originChainId: number destinationChainId: number @@ -22,7 +38,7 @@ export async function encodeCrossChainCall( value, data, account, - publicClient, + caller, } = params const lzExecutorAbi = parseAbi([ @@ -43,14 +59,39 @@ export async function encodeCrossChainCall( const txOptionsHex = txOptions.toHex() as `0x${string}` - const quoteData = await publicClient.readContract({ - address: lzExecutor, + // Encoded by hand rather than via readContract(), which is viem-only. A + // revert arrives as a bare call failure, so it is given context. + let quoteResult: Hex + try { + quoteResult = await caller.call({ + to: lzExecutor, + data: encodeFunctionData({ + abi: lzExecutorAbi, + functionName: "quote", + args: [lzEid, account, destinationExecutionData, txOptionsHex], + }), + }) + } catch (error) { + throw new Error( + `Failed to quote the LayerZero fee for chain ${destinationChainId} (executor ${lzExecutor}): ${ + error instanceof Error ? error.message : String(error) + }`, + ) + } + + if (quoteResult === "0x") { + throw new Error( + `The LayerZero executor at ${lzExecutor} returned no fee quote for chain ${destinationChainId}. Is cross-chain execution supported from chain ${originChainId}?`, + ) + } + + const [nativeFee] = decodeFunctionResult({ abi: lzExecutorAbi, functionName: "quote", - args: [lzEid, account, destinationExecutionData, txOptionsHex], + data: quoteResult, }) - const txValue = quoteData.at(0) || 0n + const txValue = nativeFee ?? 0n const encodedLzCall = encodeFunctionData({ abi: lzExecutorAbi, diff --git a/packages/sdk/src/test/crossChain.test.ts b/packages/sdk/src/test/crossChain.test.ts new file mode 100644 index 0000000..7bca048 --- /dev/null +++ b/packages/sdk/src/test/crossChain.test.ts @@ -0,0 +1,188 @@ +// Cross-chain encoding against the real LayerZero executor. +// +// The mainnet fork carries LayerZero's deployed executor, so the fee quote is a +// genuine eth_call rather than a stub: these assert against the contract that +// production talks to. Delivery itself still isn't covered — that needs a second +// chain — but everything up to the signed transaction is real. + +import { + ANVIL_CONFIG, + CREATE_ANVIL_OPTIONS, + CROSS_CHAIN_SENDER_NFT, + RECIPIENT_ADDRESS, +} from "@tokenbound/test-fixtures" +import { createAnvil } from "@viem/anvil" +import { + createPublicClient, + decodeFunctionData, + type Hex, + http, + type PublicClient, + parseAbi, +} from "viem" +import { base, mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { getAccountAddress, resolveDeployment } from "../protocol" +import { LZ_EIDS, LZ_EXECUTORS } from "../protocol/constants" +import { encodeCrossChainCall } from "../protocol/functions" + +const TIMEOUT = 60000 + +const SENDING_TBA = getAccountAddress( + { ...CROSS_CHAIN_SENDER_NFT, chainId: mainnet.id }, + resolveDeployment({}), +) + +const quoteAbi = parseAbi([ + "function quote(uint32 eid, address sender, bytes calldata payload, bytes calldata options) external view returns (uint256 nativeFee, uint256 lzTokenFee)", +]) +const executeAbi = parseAbi([ + "function execute(uint32 eid, bytes calldata payload, bytes calldata options) external payable", +]) + +describe("encodeCrossChainCall against the forked executor", () => { + const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + let publicClient: PublicClient + /** Records what was sent, while still performing the real call. */ + let sent: Array<{ to: string; data: Hex }> + let caller: { call: (tx: { to: `0x${string}`; data: Hex }) => Promise } + + beforeAll(async () => { + await anvil.start() + publicClient = createPublicClient({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + transport: http(`http://127.0.0.1:${anvil.port}`), + }) as PublicClient + + sent = [] + caller = { + call: async (tx) => { + sent.push({ to: tx.to, data: tx.data }) + const { data } = await publicClient.call(tx) + if (data === undefined) { + throw new Error(`Call to ${tx.to} returned no data`) + } + return data + }, + } + }, TIMEOUT) + + afterAll(async () => { + await anvil.stop() + }) + + const encode = () => + encodeCrossChainCall({ + caller, + account: SENDING_TBA, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x", + originChainId: mainnet.id, + destinationChainId: base.id, + }) + + it( + "quotes a non-zero fee from the deployed executor", + async () => { + const result = await encode() + + // A real quote, so the exact figure moves with gas — assert the shape + // rather than a literal. Zero would mean the quote silently failed. + expect(result.value).toBeGreaterThan(0n) + expect(result.value).toBeLessThan(10n ** 18n) // sanity: under 1 ETH + }, + TIMEOUT, + ) + + it( + "sends the quote to the origin chain's executor", + async () => { + sent.length = 0 + await encode() + + expect(sent).toHaveLength(1) + expect(sent[0].to).toBe(LZ_EXECUTORS[mainnet.id]) + + const decoded = decodeFunctionData({ abi: quoteAbi, data: sent[0].data }) + expect(decoded.functionName).toBe("quote") + // The destination is identified by its LayerZero endpoint id. + expect(decoded.args[0]).toBe(LZ_EIDS[base.id]) + expect(decoded.args[1]).toBe(SENDING_TBA) + }, + TIMEOUT, + ) + + it( + "returns an execute() call on the executor carrying the quoted fee", + async () => { + const result = await encode() + + expect(result.to).toBe(LZ_EXECUTORS[mainnet.id]) + + const decoded = decodeFunctionData({ abi: executeAbi, data: result.data }) + expect(decoded.functionName).toBe("execute") + expect(decoded.args[0]).toBe(LZ_EIDS[base.id]) + }, + TIMEOUT, + ) + + it( + "quotes and executes with the same payload and options", + async () => { + sent.length = 0 + const result = await encode() + + // Paying for one configuration and requesting another would leave the + // message underfunded, so the two must agree. + const quoted = decodeFunctionData({ abi: quoteAbi, data: sent[0].data }) + const executed = decodeFunctionData({ + abi: executeAbi, + data: result.data, + }) + + expect(executed.args[1]).toBe(quoted.args[2]) // payload + expect(executed.args[2]).toBe(quoted.args[3]) // options + }, + TIMEOUT, + ) + + it( + "covers the quoted fee, with the encoder's buffer on top", + async () => { + sent.length = 0 + const result = await encode() + + // Re-quote directly to confirm the value carried is the fee the + // executor actually asked for, not a stale or invented number. + const [nativeFee] = await publicClient.readContract({ + address: LZ_EXECUTORS[mainnet.id], + abi: quoteAbi, + functionName: "quote", + args: decodeFunctionData({ abi: quoteAbi, data: sent[0].data }) + .args as [number, `0x${string}`, Hex, Hex], + }) + + expect(result.value).toBeGreaterThanOrEqual(nativeFee) + }, + TIMEOUT, + ) + + it( + "fails informatively when the destination has no endpoint id", + async () => { + await expect( + encodeCrossChainCall({ + caller, + account: SENDING_TBA, + to: RECIPIENT_ADDRESS, + value: 0n, + data: "0x", + originChainId: mainnet.id, + destinationChainId: 999999, // not a LayerZero chain + }), + ).rejects.toThrow() + }, + TIMEOUT, + ) +}) diff --git a/packages/sdk/src/test/unit/crossChain.test.ts b/packages/sdk/src/test/unit/crossChain.test.ts new file mode 100644 index 0000000..b1c1efd --- /dev/null +++ b/packages/sdk/src/test/unit/crossChain.test.ts @@ -0,0 +1,144 @@ +// Cross-chain encoding, with the fee quote served by a stub. +// +// The fork-backed suites run a single anvil instance, so a genuine two-chain +// flow is out of reach there — but the encoding is deterministic given a quote, +// which is what these cover. ProtocolCaller exists precisely so the read can be +// stubbed without a client. + +import { decodeFunctionData, type Hex, parseAbi } from "viem" +import { describe, expect, it } from "vitest" +import { LZ_EIDS, LZ_EXECUTORS } from "../../protocol/constants" +import { + encodeCrossChainCall, + type ProtocolCaller, +} from "../../protocol/functions" + +const ORIGIN_CHAIN_ID = 1 +const DESTINATION_CHAIN_ID = 8453 +const ACCOUNT = "0x5F50CAf6244d10C32965354F8c4d84D84503D42D" as const +const TARGET = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" as const + +const NATIVE_FEE = 1_000_000_000_000_000n // 0.001 ETH +const LZ_TOKEN_FEE = 0n + +/** quote() returns (uint256 nativeFee, uint256 lzTokenFee). */ +const encodeQuote = (nativeFee: bigint, lzTokenFee = 0n): Hex => + `0x${nativeFee.toString(16).padStart(64, "0")}${lzTokenFee + .toString(16) + .padStart(64, "0")}` + +/** Records the call it was asked to make, and answers with a fixed quote. */ +const stubCaller = ( + returnData: Hex = encodeQuote(NATIVE_FEE, LZ_TOKEN_FEE), +): ProtocolCaller & { calls: Array<{ to: string; data: Hex }> } => { + const calls: Array<{ to: string; data: Hex }> = [] + return { + calls, + call: async (tx) => { + calls.push({ to: tx.to, data: tx.data }) + return returnData + }, + } +} + +const params = { + account: ACCOUNT, + to: TARGET, + value: 0n, + data: "0x" as Hex, + originChainId: ORIGIN_CHAIN_ID, + destinationChainId: DESTINATION_CHAIN_ID, +} + +describe("encodeCrossChainCall", () => { + it("targets the origin chain's LayerZero executor", async () => { + const result = await encodeCrossChainCall({ + caller: stubCaller(), + ...params, + }) + expect(result.to).toBe(LZ_EXECUTORS[ORIGIN_CHAIN_ID]) + }) + + it("carries the quoted native fee as the tx value", async () => { + const result = await encodeCrossChainCall({ + caller: stubCaller(), + ...params, + }) + // The encoder adds a small buffer over the quote. + expect(result.value).toBe(NATIVE_FEE + 10n) + }) + + it("quotes against the executor before encoding", async () => { + const caller = stubCaller() + await encodeCrossChainCall({ caller, ...params }) + + expect(caller.calls).toHaveLength(1) + expect(caller.calls[0].to).toBe(LZ_EXECUTORS[ORIGIN_CHAIN_ID]) + + // The quote is made with the destination's endpoint id, not its chain id. + const quoteAbi = parseAbi([ + "function quote(uint32 eid, address sender, bytes calldata payload, bytes calldata options) external view returns (uint256 nativeFee, uint256 lzTokenFee)", + ]) + const decoded = decodeFunctionData({ + abi: quoteAbi, + data: caller.calls[0].data, + }) + expect(decoded.functionName).toBe("quote") + expect(decoded.args[0]).toBe(LZ_EIDS[DESTINATION_CHAIN_ID]) + expect(decoded.args[1]).toBe(ACCOUNT) + }) + + it("encodes an execute() call on the executor", async () => { + const result = await encodeCrossChainCall({ + caller: stubCaller(), + ...params, + }) + + const executeAbi = parseAbi([ + "function execute(uint32 eid, bytes calldata payload, bytes calldata options) external payable", + ]) + const decoded = decodeFunctionData({ abi: executeAbi, data: result.data }) + expect(decoded.functionName).toBe("execute") + expect(decoded.args[0]).toBe(LZ_EIDS[DESTINATION_CHAIN_ID]) + }) + + it("sends the same options blob to quote() and execute()", async () => { + const caller = stubCaller() + const result = await encodeCrossChainCall({ caller, ...params }) + + // A mismatch here would mean paying for one configuration and requesting + // another, so the two must agree. + const quoteAbi = parseAbi([ + "function quote(uint32 eid, address sender, bytes calldata payload, bytes calldata options) external view returns (uint256 nativeFee, uint256 lzTokenFee)", + ]) + const executeAbi = parseAbi([ + "function execute(uint32 eid, bytes calldata payload, bytes calldata options) external payable", + ]) + const quoted = decodeFunctionData({ + abi: quoteAbi, + data: caller.calls[0].data, + }) + const executed = decodeFunctionData({ abi: executeAbi, data: result.data }) + + expect(executed.args[2]).toBe(quoted.args[3]) + // Same payload, too. + expect(executed.args[1]).toBe(quoted.args[2]) + }) + + it("reports an empty quote rather than failing in the decoder", async () => { + await expect( + encodeCrossChainCall({ caller: stubCaller("0x"), ...params }), + ).rejects.toThrow(/returned no fee quote/) + }) + + it("gives context when the quote call reverts", async () => { + const failing: ProtocolCaller = { + call: async () => { + throw new Error("execution reverted") + }, + } + await expect( + encodeCrossChainCall({ caller: failing, ...params }), + ).rejects.toThrow(/Failed to quote the LayerZero fee/) + }) +}) diff --git a/packages/sdk/src/viem/actions.ts b/packages/sdk/src/viem/actions.ts index 084248e..7c6fd84 100644 --- a/packages/sdk/src/viem/actions.ts +++ b/packages/sdk/src/viem/actions.ts @@ -11,7 +11,6 @@ import type { Chain, Client, Hex, - PublicClient, SignableMessage, Transport, WalletClient, @@ -28,6 +27,7 @@ export type TokenboundWalletClient< > = Client import { + call, getCode, readContract, sendTransaction, @@ -49,7 +49,10 @@ import { VALID_SIGNER_MAGIC_VALUE, } from "../protocol" import { ERC_6551_DEFAULT } from "../protocol/constants" -import { encodeCrossChainCall } from "../protocol/functions" +import { + encodeCrossChainCall, + type ProtocolCaller, +} from "../protocol/functions" import type { Call3, CallData, @@ -236,7 +239,7 @@ export async function prepareExecution( value: crossChainValue, data: crossChainData, } = await encodeCrossChainCall({ - publicClient: client as PublicClient, + caller: toProtocolCaller(client), account, to, value, @@ -347,6 +350,19 @@ export async function transferERC20< ) } +/** Adapts a viem client to ProtocolCaller, unwrapping `call`'s `{ data }`. */ +function toProtocolCaller(client: Client): ProtocolCaller { + return { + call: async (tx) => { + const { data } = await call(client, tx) + if (data === undefined) { + throw new Error(`Call to ${tx.to} returned no data`) + } + return data + }, + } +} + /** Returns true when a tokenbound account has been deployed on-chain. */ export async function checkAccountDeployment( client: Client, diff --git a/packages/test-fixtures/src/fixtures.ts b/packages/test-fixtures/src/fixtures.ts index c82ab1b..e91fe9b 100644 --- a/packages/test-fixtures/src/fixtures.ts +++ b/packages/test-fixtures/src/fixtures.ts @@ -50,6 +50,19 @@ export const RECIPIENT_ADDRESS = getAddress( "0x000000000000000000000000000000000000d00d", ) +/** + * The NFT the cross-chain suites derive their sending account from. + * + * Shared as inputs rather than a derived address: deriving needs + * getAccountAddress() from @tokenbound/sdk, and this package cannot import it + * without both packages depending on each other. Each suite derives locally + * from these, which also keeps the derivation itself under test. + */ +export const CROSS_CHAIN_SENDER_NFT = { + tokenContract: ZORA_721.address, + tokenId: "1", +} as const + export const ANVIL_RPC_URL = foundry.rpcUrls.default.http[0] export const ANVIL_ACCOUNTS = [ From 4ecaf8ea04db4f6733deb4a48d5d0f24454c8100 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Tue, 29 Sep 2026 16:54:57 -0700 Subject: [PATCH 08/30] typecheck the test trees Both packages' tsconfig excludes src/test, so nothing checked the test files: the SDK's vitest typecheck covers only *.test-d.ts, and ethers had no test tsconfig at all. Add one for ethers, and run both packages' test configs through tsc as part of `typecheck` and `test`. That surfaced one existing error: a v6 signer mock in TestEthersVersions whose provider was missing the call/getCode the adapter routes reads through. Version detection ignores them, but EthersProvider requires them. Co-Authored-By: Claude Opus 5 (1M context) --- package.json | 2 +- packages/ethers/package.json | 6 ++++-- packages/ethers/src/test/TestEthersVersions.test.ts | 8 +++++++- packages/ethers/tsconfig.test.json | 10 ++++++++++ packages/sdk/package.json | 5 +++-- 5 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 packages/ethers/tsconfig.test.json diff --git a/package.json b/package.json index 2057f7f..9f15f40 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "test:viem": "pnpm --filter @tokenbound/sdk test", "test:ethers": "pnpm --filter @tokenbound/ethers test", "test:unit": "pnpm --filter @tokenbound/sdk exec vitest --watch=false --typecheck run src/test/unit/", - "typecheck": "pnpm --filter @tokenbound/sdk exec tsc --noEmit && pnpm --filter @tokenbound/ethers exec tsc --noEmit", + "typecheck": "pnpm --filter @tokenbound/sdk typecheck && pnpm --filter @tokenbound/ethers typecheck", "validate:packages": "node scripts/validate-package-contents.mjs", "clean": "rm -rf node_modules", "prepare": "husky install", diff --git a/packages/ethers/package.json b/packages/ethers/package.json index 5354684..fb537d3 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -38,14 +38,16 @@ }, "scripts": { "build": "tsc --noEmit && vite build", - "test": "pnpm test:versions && pnpm test:fixtures && pnpm test:all && pnpm test:v2", + "test": "pnpm typecheck && pnpm test:versions && pnpm test:fixtures && pnpm test:crosschain && pnpm test:all && pnpm test:v2", "clean": "rm -rf node_modules/ dist/", "lint": "biome lint .", "format": "biome format .", "test:v2": "vitest --watch=false run src/test/TestAllEthersV2.test.ts", "test:fixtures": "vitest --watch=false run src/test/TestSharedFixtures.test.ts", "test:versions": "vitest --watch=false run src/test/TestEthersVersions.test.ts", - "test:all": "vitest --watch=false run src/test/TestAllEthers.test.ts" + "test:all": "vitest --watch=false run src/test/TestAllEthers.test.ts", + "test:crosschain": "vitest --watch=false run src/test/TestCrossChain.test.ts", + "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json" }, "dependencies": { "@tokenbound/sdk": "workspace:^" diff --git a/packages/ethers/src/test/TestEthersVersions.test.ts b/packages/ethers/src/test/TestEthersVersions.test.ts index 9325de1..2062e1f 100644 --- a/packages/ethers/src/test/TestEthersVersions.test.ts +++ b/packages/ethers/src/test/TestEthersVersions.test.ts @@ -22,7 +22,13 @@ const makeV6Signer = (overrides: Record = {}) => ({ sendTransaction: vi.fn(async () => ({ hash: "0xv6hash" })), signMessage: vi.fn(async () => "0xv6sig"), getAddress: vi.fn(async () => "0x000000000000000000000000000000000000c0de"), - provider: { getNetwork: vi.fn() }, + // A v6 signer's provider must satisfy EthersProvider, so the reads the + // adapter routes through it are present even though detection ignores them. + provider: { + getNetwork: vi.fn(), + call: vi.fn(async () => "0x"), + getCode: vi.fn(async () => "0x"), + }, ...overrides, }) diff --git a/packages/ethers/tsconfig.test.json b/packages/ethers/tsconfig.test.json new file mode 100644 index 0000000..6ba6fed --- /dev/null +++ b/packages/ethers/tsconfig.test.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noUnusedLocals": false, + "noUnusedParameters": false, + "types": ["vitest/globals", "vite/client"] + }, + "include": ["src"], + "exclude": [] +} diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 4e7671e..01da5ae 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -50,7 +50,7 @@ "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "test": "vitest --watch=false", + "test": "pnpm typecheck && vitest --watch=false", "coverage": "vitest run --coverage", "clean": "rm -rf node_modules/ dist/", "wagmi": "wagmi generate", @@ -58,7 +58,8 @@ "lint": "biome lint .", "lint:fix": "biome lint --write --unsafe .", "format": "biome format .", - "format:fix": "biome format --write ." + "format:fix": "biome format --write .", + "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json" }, "dependencies": { "@layerzerolabs/lz-v2-utilities": "^3.0.168", From a7489c5dd0698450cc79ef6c3ece82f373e1ecb7 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 14:18:39 -0700 Subject: [PATCH 09/30] remove deployerUrl from response --- .../ethers/src/test/TestAllEthers.test.ts | 4 +- packages/sdk/README.md | 11 ++++-- packages/sdk/src/index.ts | 1 - .../protocol/constants/tokenboundAddresses.ts | 8 ---- packages/sdk/src/protocol/core.ts | 20 ++++------ packages/sdk/src/test/TestAllViem.test.ts | 4 +- .../test/unit/checkProtocolDeployment.test.ts | 37 ++++--------------- 7 files changed, 25 insertions(+), 60 deletions(-) diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index eb7c717..d379e98 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -533,8 +533,8 @@ describe.each(ENABLED_TESTS)( // The fork is mainnet, where both the V2 and V3 deployments exist. expect(status.isFullyDeployed).toEqual(true) - expect(status.registry).toEqual(true) - expect(status.implementation).toEqual(true) + expect(status.isRegistryDeployed).toEqual(true) + expect(status.isImplementationDeployed).toEqual(true) // The addresses reported must be the ones this variant is pinned to. expect(status.registryAddress).toEqual( diff --git a/packages/sdk/README.md b/packages/sdk/README.md index bdd07b0..9f4b264 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -87,7 +87,10 @@ const { tokenContract, tokenId, chainId } = await client.tokenbound.getNFT({ // Is ERC-6551 itself available on this chain? const status = await client.tokenbound.checkProtocolDeployment() if (!status.isFullyDeployed) { - console.log(`Deploy the missing contracts at ${status.deployerUrl}`) + console.log( + `Missing: ${status.isRegistryDeployed ? "" : "registry "}` + + `${status.isImplementationDeployed ? "" : "implementation"}`, + ) } ``` @@ -100,9 +103,9 @@ registry is deployed there, but the Tokenbound account implementation is not: | Registry | [`0x0000…5758`](https://gnosisscan.io/address/0x000000006551c19487814612e58FE06813775758) | deployed (`ERC6551Registry`) | | Account implementation | [`0x5526…6E7F`](https://gnosisscan.io/address/0x55266d75D1a14E4572138116aF39863Ed6596E7F) | no bytecode | -So on Gnosis you get `{ registry: true, implementation: false, isFullyDeployed: false }` -along with a `deployerUrl` — enough to tell a user precisely what is missing, rather than -just that something is. +So on Gnosis you get `{ isRegistryDeployed: true, isImplementationDeployed: false, +isFullyDeployed: false }` — +enough to tell a user precisely what is missing, rather than just that something is. #### Writing diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 5d7e8ed..3d079e5 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -29,7 +29,6 @@ export { export { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2, - TOKENBOUND_V3_DEPLOYER_URL, } from "./protocol/constants" // Legacy standalone functions, retained for backwards compatibility. diff --git a/packages/sdk/src/protocol/constants/tokenboundAddresses.ts b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts index 125dde8..e54fe08 100644 --- a/packages/sdk/src/protocol/constants/tokenboundAddresses.ts +++ b/packages/sdk/src/protocol/constants/tokenboundAddresses.ts @@ -14,14 +14,6 @@ type Standard6551Deployment = { ACCOUNT_PROXY?: ContractABIPair } -/** - * Where a user can deploy the ERC-6551 V3 contracts to a chain that does not - * yet have them. Surfaced by `checkProtocolDeployment` so a caller can point - * someone at the fix rather than only reporting the problem. - */ -export const TOKENBOUND_V3_DEPLOYER_URL = - "https://tokenbound-v3-deployer.vercel.app" - export const ERC_6551_LEGACY_V2: Standard6551Deployment = { IMPLEMENTATION: { ADDRESS: getAddress("0x2d25602551487c3f3354dd80d76d54383a243358"), diff --git a/packages/sdk/src/protocol/core.ts b/packages/sdk/src/protocol/core.ts index 0238780..7a48918 100644 --- a/packages/sdk/src/protocol/core.ts +++ b/packages/sdk/src/protocol/core.ts @@ -29,7 +29,6 @@ import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2, MULTICALL_AUTHENTICATED_ADDRESS, - TOKENBOUND_V3_DEPLOYER_URL, } from "./constants" import { computeAccount, @@ -107,15 +106,13 @@ export function hasBytecode(bytecode: Hex | undefined | null): boolean { */ export type ProtocolDeploymentStatus = { /** True when the ERC-6551 registry is live at `registryAddress`. */ - registry: boolean + isRegistryDeployed: boolean /** True when the account implementation is live at `implementationAddress`. */ - implementation: boolean + isImplementationDeployed: boolean /** True only when both contracts are present. */ isFullyDeployed: boolean registryAddress: Address implementationAddress: Address - /** Where to deploy the missing contracts. Set only when not fully deployed. */ - deployerUrl?: string } /** Builds the deployment status from two already-fetched bytecode results. */ @@ -125,17 +122,14 @@ export function toProtocolDeploymentStatus(params: { registryAddress: Address implementationAddress: Address }): ProtocolDeploymentStatus { - const registry = hasBytecode(params.registryCode) - const implementation = hasBytecode(params.implementationCode) - const isFullyDeployed = registry && implementation - + const isRegistryDeployed = hasBytecode(params.registryCode) + const isImplementationDeployed = hasBytecode(params.implementationCode) return { - registry, - implementation, - isFullyDeployed, + isRegistryDeployed, + isImplementationDeployed, + isFullyDeployed: isRegistryDeployed && isImplementationDeployed, registryAddress: params.registryAddress, implementationAddress: params.implementationAddress, - ...(isFullyDeployed ? {} : { deployerUrl: TOKENBOUND_V3_DEPLOYER_URL }), } } diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index 48ac96b..7e24504 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -561,8 +561,8 @@ describe.each(ENABLED_TESTS)( // The fork is mainnet, where both the V2 and V3 deployments exist. expect(status.isFullyDeployed).toEqual(true) - expect(status.registry).toEqual(true) - expect(status.implementation).toEqual(true) + expect(status.isRegistryDeployed).toEqual(true) + expect(status.isImplementationDeployed).toEqual(true) // The addresses reported must be the ones this variant is pinned to. expect(status.registryAddress).toEqual( diff --git a/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts index dd6eb33..675e1f3 100644 --- a/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts +++ b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts @@ -12,11 +12,7 @@ import { type Address, createPublicClient, custom, type Hex } from "viem" import { mainnet } from "viem/chains" import { describe, expect, it } from "vitest" -import { - ERC_6551_DEFAULT, - ERC_6551_LEGACY_V2, - TOKENBOUND_V3_DEPLOYER_URL, -} from "../../protocol/constants" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../../protocol/constants" import { TBVersion } from "../../types" import { checkProtocolDeployment } from "../../viem/actions" @@ -61,20 +57,19 @@ describe("checkProtocolDeployment", () => { }) expect(await checkProtocolDeployment(client)).toEqual({ - registry: true, - implementation: true, + isRegistryDeployed: true, + isImplementationDeployed: true, isFullyDeployed: true, registryAddress: V3_REGISTRY, implementationAddress: V3_IMPLEMENTATION, - // No deployer link when there is nothing to deploy. }) }) it("reports a chain with no deployment at all", async () => { const status = await checkProtocolDeployment(stubClient({})) - expect(status.registry).toBe(false) - expect(status.implementation).toBe(false) + expect(status.isRegistryDeployed).toBe(false) + expect(status.isImplementationDeployed).toBe(false) expect(status.isFullyDeployed).toBe(false) }) @@ -84,29 +79,11 @@ describe("checkProtocolDeployment", () => { ) // The whole point of the split return: this is not simply "not deployed". - expect(status.registry).toBe(true) - expect(status.implementation).toBe(false) + expect(status.isRegistryDeployed).toBe(true) + expect(status.isImplementationDeployed).toBe(false) expect(status.isFullyDeployed).toBe(false) }) - it("points at the deployer only when something is missing", async () => { - const missing = await checkProtocolDeployment(stubClient({})) - expect(missing.deployerUrl).toBe(TOKENBOUND_V3_DEPLOYER_URL) - - const partial = await checkProtocolDeployment( - stubClient({ [V3_REGISTRY]: DEPLOYED_BYTECODE }), - ) - expect(partial.deployerUrl).toBe(TOKENBOUND_V3_DEPLOYER_URL) - - const complete = await checkProtocolDeployment( - stubClient({ - [V3_REGISTRY]: DEPLOYED_BYTECODE, - [V3_IMPLEMENTATION]: DEPLOYED_BYTECODE, - }), - ) - expect(complete.deployerUrl).toBeUndefined() - }) - it("treats empty bytecode as not deployed", async () => { const status = await checkProtocolDeployment( stubClient({ From ed67f07caf353e20977b650fd0108f9f123f6872 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 15:12:51 -0700 Subject: [PATCH 10/30] remove getEthersVersion, re-implement getSDKVersion for method parity --- MIGRATION.md | 13 ++----------- packages/ethers/README.md | 15 +++++++++------ packages/ethers/src/TokenboundClient.ts | 7 ++++--- packages/ethers/src/test/TestAllEthers.test.ts | 9 +++------ packages/ethers/src/test/TestAllEthersV2.test.ts | 4 ---- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index 89f0e48..76af486 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -24,8 +24,7 @@ longer imports every chain from `viem/chains`. | 2 | `chain` is now **required**; the constructor `chainId` option is removed | everyone | | 3 | Ethers message types removed from the SDK's public types | ethers users | | 4 | `signMessage` accepts only viem's `SignableMessage` | viem users passing raw bytes | -| 5 | Cross-chain `execute` is viem-only | ethers users using cross-chain | -| 6 | Package entry points changed (`dist/index.js`, subpath exports) | deep-importers | +| 5 | Package entry points changed (`dist/index.js`, subpath exports) | deep-importers | Everything else — method names, parameter shapes, return values — is unchanged. @@ -211,15 +210,7 @@ on an unconnected signer throw a clear error. `@tokenbound/sdk` is unaffected — it still takes `publicClient`/`publicClientRPCUrl`. -## 5. Cross-chain execution - -Cross-chain `execute` requires a viem public client for LayerZero fee quoting -and is therefore **viem-only**. Calling it through `@tokenbound/ethers` throws a -clear error. Same-chain execution is unaffected. - ---- - -## 6. New entry points +## 5. New entry points ```text @tokenbound/sdk the TokenboundClient class + protocol utilities diff --git a/packages/ethers/README.md b/packages/ethers/README.md index 6d84789..823949c 100644 --- a/packages/ethers/README.md +++ b/packages/ethers/README.md @@ -107,20 +107,23 @@ and v6. ### Version detection +The ethers major is detected once, at construction, and handled internally — +message normalization differs between majors (v6 rejects `ArrayLike`, +v5 accepts it). `detectEthersVersion()` is exported if you need it directly. + ```ts -tokenboundClient.getEthersVersion() // 5 | 6 +tokenboundClient.getSDKVersion() // this package's version, e.g. "0.1.0" ``` -Detection happens once, at construction. Message normalization differs between -majors (v6 rejects `ArrayLike`, v5 accepts it) and is handled internally. - ## Limitations - The signer must be connected to a Provider for any read operation. -- **Cross-chain execution** is not supported through the ethers adapter. Use - `@tokenbound/sdk` with a viem client for cross-chain calls. - `chain` is required — passing only `chainId` is no longer supported, because mapping a chain id to a `Chain` forced every viem chain into consumer bundles. +- `publicClient` and `publicClientRPCUrl` are not accepted. Reads go through the + signer's provider, so point that at the RPC you want. +- Cross-chain execution needs a LayerZero executor on the origin chain, and the + destination's executor gas is fixed at 200,000. See [MIGRATION.md](../../MIGRATION.md) for full migration notes. diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts index 8cbbb5d..5766ae3 100644 --- a/packages/ethers/src/TokenboundClient.ts +++ b/packages/ethers/src/TokenboundClient.ts @@ -37,6 +37,7 @@ import { } from "@tokenbound/sdk" import type { Address, Chain, Hex } from "viem" import { encodeFunctionData, getAddress, numberToHex } from "viem/utils" +import { version as TB_ETHERS_VERSION } from "../package.json" import { type EthersAdapter, resolveAdapter } from "./adapter" import type { EthersSignableMessage } from "./types" @@ -104,9 +105,9 @@ export class TokenboundClient { this.isInitialized = true } - /** The detected ethers major version (5 or 6). */ - public getEthersVersion(): 5 | 6 { - return this.adapter.version + /** This package's version. Mirrors @tokenbound/sdk's getSDKVersion(). */ + public getSDKVersion(): string { + return TB_ETHERS_VERSION } /** diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index d379e98..9dc792d 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -393,8 +393,9 @@ describe.each(ENABLED_TESTS)( describe("client", () => { it("can get the SDK version", () => { - // ethers counterpart: the client reports the ethers major detected. - expect(tokenboundClient.getEthersVersion()).toBe(version) + // Mirrors @tokenbound/sdk's getSDKVersion(), so a consumer migrating + // between the two does not lose the method. + expect(tokenboundClient.getSDKVersion()).toMatch(/^\d+\.\d+\.\d+/) }) }) @@ -1024,10 +1025,6 @@ describe.each(ENABLED_TESTS)( }) describe("ethers-specific", () => { - it("detects the correct ethers version", () => { - expect(tokenboundClient.getEthersVersion()).toBe(version) - }) - it("rejects out-of-range ERC-20 decimals", async () => { await expect( tokenboundClient.transferERC20({ diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index f66d80e..d8875f1 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -107,10 +107,6 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( await anvil.stop() }) - it("detects the correct ethers version", () => { - expect(tokenboundClient.getEthersVersion()).toBe(version) - }) - it("derives a V2 account address", () => { const account = tokenboundClient.getAccount({ tokenContract: zora721.proxyContractAddress, From 927084f3a4410e40fdfdb7e6ac9839911d6b7f7b Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 16:01:30 -0700 Subject: [PATCH 11/30] fix stale executeTo dependency in the examples' execute callback --- examples/vite-wagmi-ethers/src/App.tsx | 2 +- examples/vite-wagmi-ethers6/src/App.tsx | 2 +- examples/vite-wagmi-viem/src/App.tsx | 2 +- examples/vite-wagmi3-viem/src/App.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/vite-wagmi-ethers/src/App.tsx b/examples/vite-wagmi-ethers/src/App.tsx index 16e571d..44c87c7 100644 --- a/examples/vite-wagmi-ethers/src/App.tsx +++ b/examples/vite-wagmi-ethers/src/App.tsx @@ -169,7 +169,7 @@ export function App() { run, tokenboundClient, tokenboundAccount, - transferTo, + executeTo, address, tokenContract, ethAmount, diff --git a/examples/vite-wagmi-ethers6/src/App.tsx b/examples/vite-wagmi-ethers6/src/App.tsx index cd8956d..d6f6827 100644 --- a/examples/vite-wagmi-ethers6/src/App.tsx +++ b/examples/vite-wagmi-ethers6/src/App.tsx @@ -169,7 +169,7 @@ export function App() { run, tokenboundClient, tokenboundAccount, - transferTo, + executeTo, address, tokenContract, ethAmount, diff --git a/examples/vite-wagmi-viem/src/App.tsx b/examples/vite-wagmi-viem/src/App.tsx index d2dbe93..effe75e 100644 --- a/examples/vite-wagmi-viem/src/App.tsx +++ b/examples/vite-wagmi-viem/src/App.tsx @@ -171,7 +171,7 @@ export function App() { run, tokenboundClient, tokenboundAccount, - transferTo, + executeTo, address, tokenContract, ethAmount, diff --git a/examples/vite-wagmi3-viem/src/App.tsx b/examples/vite-wagmi3-viem/src/App.tsx index 6a0e5ad..68161a4 100644 --- a/examples/vite-wagmi3-viem/src/App.tsx +++ b/examples/vite-wagmi3-viem/src/App.tsx @@ -170,7 +170,7 @@ export function App() { run, tokenboundClient, tokenboundAccount, - transferTo, + executeTo, address, tokenContract, ethAmount, From be02d823b5e5617b516e569e829f668028a815f8 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 16:06:28 -0700 Subject: [PATCH 12/30] fix biome ci failures --- .changeset/config.json | 18 +++++++++--------- biome.json | 2 +- packages/sdk/wagmi.config.ts | 18 +++++++++++++++--- tsconfig.json | 36 ++++++++++++++++++------------------ 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index 6a2dde7..fa15567 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,11 +1,11 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": ["vite-wagmi"] + "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["vite-wagmi"] } diff --git a/biome.json b/biome.json index 1449b01..81aec9e 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.5.13/schema.json", + "$schema": "https://biomejs.dev/schemas/2.5.14/schema.json", "files": { "includes": ["**", "!**/node_modules/**/*", "!**/dist/**/*"] }, diff --git a/packages/sdk/wagmi.config.ts b/packages/sdk/wagmi.config.ts index cbc99c6..47bd40c 100644 --- a/packages/sdk/wagmi.config.ts +++ b/packages/sdk/wagmi.config.ts @@ -3,12 +3,24 @@ import { etherscan } from "@wagmi/cli/plugins" import { goerli, mainnet } from "viem/chains" import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "./src/protocol/constants" +// ACCOUNT_PROXY is optional on Standard6551Deployment, but generation cannot +// proceed without it — fail loudly here rather than emitting a bad address. +const ACCOUNT_PROXY_ADDRESS = ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS +if (!ACCOUNT_PROXY_ADDRESS) { + throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") +} + +const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY +if (!ETHERSCAN_API_KEY) { + throw new Error("ETHERSCAN_API_KEY is required to generate ABIs") +} + export default defineConfig({ out: "../test-fixtures/src/generated.ts", contracts: [], plugins: [ etherscan({ - apiKey: process.env.ETHERSCAN_API_KEY!, // Tokenbound SDK, user bjfutureprimitive + apiKey: ETHERSCAN_API_KEY, // Tokenbound SDK, user bjfutureprimitive chainId: mainnet.id, // chainId: goerli.id, @@ -37,8 +49,8 @@ export default defineConfig({ { name: "ERC6551AccountProxy_V3_", address: { - [mainnet.id]: ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS!, - [goerli.id]: ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS!, + [mainnet.id]: ACCOUNT_PROXY_ADDRESS, + [goerli.id]: ACCOUNT_PROXY_ADDRESS, }, }, { diff --git a/tsconfig.json b/tsconfig.json index 7bd949a..194bc11 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ESNext", "DOM"], - "moduleResolution": "Bundler", - "strict": true, - "jsx": "preserve", - "resolveJsonModule": true, - "isolatedModules": true, - "esModuleInterop": true, - "noEmit": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "skipLibCheck": true - }, - "include": ["packages", "examples"] + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ESNext", "DOM"], + "moduleResolution": "Bundler", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "noEmit": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "skipLibCheck": true + }, + "include": ["packages", "examples"] } From 1543da35c457055dee77ec918cea2957cc03840b Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 16:11:24 -0700 Subject: [PATCH 13/30] point @tokenbound/ethers types at the emitted declarations --- MIGRATION.md | 7 ++----- packages/ethers/package.json | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/MIGRATION.md b/MIGRATION.md index 76af486..aea5fff 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -161,11 +161,8 @@ unchanged, and ethers v5 `Signer` objects are accepted exactly as before. Identical to the v5 migration — the same import change and the same `chain` requirement. The package detects which ethers major version your signer comes -from and adapts automatically: - -```ts -tokenboundClient.getEthersVersion() // 5 | 6 -``` +from and adapts automatically — `detectEthersVersion()` is exported if you ever +need to inspect it yourself. You do **not** need to migrate from ethers v5 to v6. Both are supported and tested independently. diff --git a/packages/ethers/package.json b/packages/ethers/package.json index fb537d3..04334b8 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -25,12 +25,12 @@ "files": [ "dist" ], - "types": "./dist/index.d.ts", + "types": "./dist/src/index.d.ts", "main": "./dist/tokenbound-ethers.umd.cjs", "module": "./dist/tokenbound-ethers.js", "exports": { ".": { - "types": "./dist/index.d.ts", + "types": "./dist/src/index.d.ts", "import": "./dist/tokenbound-ethers.js", "require": "./dist/tokenbound-ethers.umd.cjs" }, From 79d4afbe75d09ca1ed79134c0a47ff2008e36446 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 16:22:58 -0700 Subject: [PATCH 14/30] fall back to the public RPC when the fork endpoint is empty, not just unset --- packages/test-fixtures/src/anvil.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts index 7d66765..a3dc696 100644 --- a/packages/test-fixtures/src/anvil.ts +++ b/packages/test-fixtures/src/anvil.ts @@ -19,7 +19,9 @@ export const ACTIVE_CHAIN = mainnet * it rate-limits and retains only recent blocks. */ export const FORK_URL = - process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT ?? + // Trimmed, and `||` rather than `??`: CI renders an unset secret as an empty + // string, which `??` would pass straight through to anvil's --fork-url. + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT?.trim() || "https://ethereum-rpc.publicnode.com" /** From ade807d3d667f3e2829ce49367dc6be1c600c916 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 16:45:12 -0700 Subject: [PATCH 15/30] await receipts before reading balances; fall back when fork endpoint is empty --- packages/sdk/src/test/TestAllViem.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index 7e24504..e2bdf66 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -787,6 +787,9 @@ describe.each(ENABLED_TESTS)( account: walletClient.account.address, ...preparedETHTransfer, }) + // sendTransaction resolves on submission, not on mining, so the + // balance must not be read until the receipt exists. + await getReceipt(transferHash) const balanceAfter = await publicClient.getBalance({ address: ZORA721_TBA_ADDRESS, @@ -923,6 +926,8 @@ describe.each(ENABLED_TESTS)( amount: 0.25, recipientAddress: "jeebay.eth", }) + // Wait for mining: the send resolves on submission. + await getReceipt(ethTransferHash) const balanceAfter = await publicClient.getBalance({ address: ZORA721_TBA_ADDRESS, }) @@ -965,6 +970,8 @@ describe.each(ENABLED_TESTS)( tokenId: TOKENID1_IN_TBA, recipientAddress: ANVIL_USER_1, }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) const anvilAccount1NFTBalance = await getZora721Balance({ publicClient, @@ -987,6 +994,8 @@ describe.each(ENABLED_TESTS)( tokenId: TOKENID2_IN_TBA, recipientAddress: "jeebay.eth", }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) const addr = await resolvePossibleENS(publicClient, "jeebay.eth") @@ -1092,6 +1101,8 @@ describe.each(ENABLED_TESTS)( recipientAddress: ANVIL_USER_1, amount: transferAmount, }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) const anvilAccount1_1155Balance = await getZora1155Balance({ publicClient, @@ -1244,6 +1255,8 @@ describe.each(ENABLED_TESTS)( value: 0n, data: wethTransferCallData, }) + // Wait for mining: the send resolves on submission. + await getReceipt(wethTransferHash) const tbaWETHReceived = await getWETHBalance({ publicClient, @@ -1267,6 +1280,8 @@ describe.each(ENABLED_TESTS)( erc20tokenAddress: WETH_CONTRACT_ADDRESS, erc20tokenDecimals: 18, }) + // Wait for mining: the send resolves on submission. + await getReceipt(ensTransferredERC20Hash) const tbaWETHFinal = await getWETHBalance({ publicClient, From b020b3ed0cfbfac1e543b01bb8f4567bd3401556 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 17:00:24 -0700 Subject: [PATCH 16/30] await receipts before reading balances in the minting tests --- packages/sdk/src/test/TestAllViem.test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index e2bdf66..a0b70f7 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -1030,6 +1030,8 @@ describe.each(ENABLED_TESTS)( const mintToTBATxHash = isV3 ? await tokenboundClient.execute(execution) : await tokenboundClient.executeCall(execution) + // Wait for mining: the send resolves on submission. + await getReceipt(mintToTBATxHash) const zoraBalanceInTBA = await getZora721Balance({ publicClient, @@ -1075,6 +1077,8 @@ describe.each(ENABLED_TESTS)( const mint1155TxHash = isV3 ? await tokenboundClient.execute(execution) : await tokenboundClient.executeCall(execution) + // Wait for mining: the send resolves on submission. + await getReceipt(mint1155TxHash) const zora1155BalanceInTBA = await getZora1155Balance({ publicClient, From a0a91c09037c04d97412771ffbbcf8301f93b1da Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 17:50:45 -0700 Subject: [PATCH 17/30] read the mint nonce from the chain, not ethers' cache --- README.md | 2 +- packages/ethers/src/test/TestAllEthers.test.ts | 9 +++++++++ packages/ethers/src/test/TestAllEthersV2.test.ts | 9 ++++++--- packages/sdk/.env.example | 7 ++++--- packages/test-fixtures/src/anvil.ts | 13 +++++++++---- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 6ce874d..dcaa520 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ USE_VERBOSE_TESTS=true pnpm test ### Optional: use your own RPC endpoint -The public fallback (`ethereum-rpc.publicnode.com`) works but rate-limits, which is the usual cause of intermittent failures. To use your own provider, create `packages/sdk/.env.test` (gitignored): +The fallback (`eth.drpc.org`) needs no key, but it rate-limits under load. To use your own provider, create `packages/sdk/.env.test` (gitignored): ```bash copy VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.g.alchemy.com/v2/ diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 9dc792d..cb851a7 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -189,6 +189,10 @@ describe.each(ENABLED_TESTS)( functionName: "purchase", args: [BigInt(zora721.quantity)], }), + // Read the nonce from the chain rather than trusting ethers' cached + // pending value, as every other send in this suite does. Without it + // the next write fails with "nonce too low" on v6. + nonce: await nextNonce(), }) await mint.wait() const receipt = await getReceipt(mint.hash as Hex) @@ -224,6 +228,11 @@ describe.each(ENABLED_TESTS)( tokenContract: zora721.proxyContractAddress, tokenId: TOKENID_FOR_MULTICALL_CREATE, } + + // `wait()` is not always enough on ethers v6: the signer can still hold a + // stale pending nonce, so the next send — usually createAccount — fails + // with "nonce too low". + await syncNonce() } /** Ensures the TBA for NFT_IN_EOA exists on-chain. */ diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index d8875f1..379cd40 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -84,10 +84,13 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( functionName: "purchase", args: [1n], }), + // Read the nonce from the chain rather than trusting ethers' cached + // pending value: awaiting the receipt does not reliably refresh it on + // v6, and the next write then fails with "nonce too low". + nonce: await publicClient.getTransactionCount({ + address: getAddress(ANVIL_ACCOUNTS[0].address), + }), }) - // Await through ethers, not just viem: this is what refreshes ethers' - // cached pending nonce. Confirming only via publicClient leaves the - // signer's view stale and the next send fails with "nonce too low". await mint.wait() const receipt = await publicClient.waitForTransactionReceipt({ hash: mint.hash as Hex, diff --git a/packages/sdk/.env.example b/packages/sdk/.env.example index 7a8aaf9..4e6546e 100644 --- a/packages/sdk/.env.example +++ b/packages/sdk/.env.example @@ -4,9 +4,10 @@ # Copy to `.env.test` (gitignored) if you want to override anything. # The VITE_ prefix is required for Vitest to pick up the vars. -# Mainnet fork endpoint. The fallback (ethereum-rpc.publicnode.com) works, but -# it rate-limits — which is the usual cause of intermittent test failures. -# Point this at your own provider for faster, more reliable runs. +# Mainnet fork endpoint. The fallback (eth.drpc.org) serves historical state, +# which the suites need — they start several anvil instances over a few minutes, +# and an endpoint that prunes state quickly fails partway through. Point this at +# your own provider for faster, more reliable runs. # VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.g.alchemy.com/v2/ # Pin the fork to a fixed block, making runs deterministic. diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts index a3dc696..6fb1d07 100644 --- a/packages/test-fixtures/src/anvil.ts +++ b/packages/test-fixtures/src/anvil.ts @@ -15,14 +15,19 @@ export const ACTIVE_CHAIN = mainnet /** * Mainnet fork endpoint. Set VITE_ANVIL_MAINNET_FORK_ENDPOINT in .env.test to - * use your own provider; the public fallback keeps a fresh clone runnable, but - * it rate-limits and retains only recent blocks. + * use your own provider; the fallback keeps a fresh clone and CI runnable. + * + * The fallback must serve historical state, not just recent blocks. These suites + * start several anvil instances over a few minutes, and each forks at whatever + * the head was when it launched — so an endpoint that prunes state after ~32 + * blocks (ethereum-rpc.publicnode.com, previously used here) fails partway + * through with "block not found" or "failed to create genesis", at a different + * point on every run. */ export const FORK_URL = // Trimmed, and `||` rather than `??`: CI renders an unset secret as an empty // string, which `??` would pass straight through to anvil's --fork-url. - process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT?.trim() || - "https://ethereum-rpc.publicnode.com" + process.env.VITE_ANVIL_MAINNET_FORK_ENDPOINT?.trim() || "https://eth.drpc.org" /** * Optional block to pin the fork at. Pinning makes runs deterministic — the From 1ed960b17f59d492106f126811498e854612dbe3 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 18:14:52 -0700 Subject: [PATCH 18/30] use a node-managed signer for ethers v6 in tests --- .../ethers/src/test/TestAllEthers.test.ts | 49 +++---------------- .../ethers/src/test/TestAllEthersV2.test.ts | 16 ++---- .../ethers/src/test/TestCrossChain.test.ts | 14 ++++-- 3 files changed, 21 insertions(+), 58 deletions(-) diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index cb851a7..547e21f 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -37,7 +37,7 @@ import { } from "@tokenbound/test-fixtures" import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" -import { JsonRpcProvider, Wallet } from "ethers6" +import { JsonRpcProvider, JsonRpcSigner } from "ethers6" import { type Address, createPublicClient, @@ -122,9 +122,12 @@ describe.each(ENABLED_TESTS)( new ethers.providers.JsonRpcProvider(rpcUrl), ) } - return new Wallet( - ANVIL_ACCOUNTS[0].privateKey, + // JsonRpcSigner, not Wallet: a Wallet signs locally and tracks its own + // pending nonce, which `wait()` does not reliably refresh on v6. The node + // is authoritative here, so there is no cache to go stale. + return new JsonRpcSigner( new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[0].address), ) } @@ -139,26 +142,6 @@ describe.each(ENABLED_TESTS)( }) } - /** - * Writes issued through the SDK return a bare hash, so ethers never sees - * them confirm and its cached pending nonce goes stale. Wait until the - * signer's own provider agrees with the chain before the next send. - */ - async function syncNonce() { - const address = getAddress(ANVIL_ACCOUNTS[0].address) - const provider = signer.provider - if (!provider) return - for (let i = 0; i < 100; i++) { - const onChain = await publicClient.getTransactionCount({ address }) - const fromEthers = await provider.getTransactionCount( - address, - "pending", - ) - if (Number(fromEthers) === Number(onChain)) return - await new Promise((r) => setTimeout(r, 100)) - } - } - /** * Waits for a receipt by hash. The SDK's writes return a bare hash, so this * is how the suite observes them landing. (viem parity: getReceipt) @@ -189,10 +172,6 @@ describe.each(ENABLED_TESTS)( functionName: "purchase", args: [BigInt(zora721.quantity)], }), - // Read the nonce from the chain rather than trusting ethers' cached - // pending value, as every other send in this suite does. Without it - // the next write fails with "nonce too low" on v6. - nonce: await nextNonce(), }) await mint.wait() const receipt = await getReceipt(mint.hash as Hex) @@ -232,7 +211,6 @@ describe.each(ENABLED_TESTS)( // `wait()` is not always enough on ethers v6: the signer can still hold a // stale pending nonce, so the next send — usually createAccount — fails // with "nonce too low". - await syncNonce() } /** Ensures the TBA for NFT_IN_EOA exists on-chain. */ @@ -244,9 +222,6 @@ describe.each(ENABLED_TESTS)( await tokenboundClient.createAccount(NFT_IN_EOA) await getReceipt(txHash) ZORA721_TBA_ADDRESS = account - // Keep ethers' cached pending nonce in step: the SDK returns a bare - // hash, so ethers never observes that confirmation. - await syncNonce() } /** Moves one minted 721 from the EOA into the TBA. Idempotent per token. */ @@ -323,7 +298,6 @@ describe.each(ENABLED_TESTS)( ? await tokenboundClient.execute(execution) : await tokenboundClient.executeCall(execution) await getReceipt(hash) - await syncNonce() } /** @@ -505,7 +479,6 @@ describe.each(ENABLED_TESTS)( const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash, }) - await syncNonce() expect(created).toMatch(ADDRESS_REGEX) expect(receipt.status).toBe("success") @@ -689,7 +662,6 @@ describe.each(ENABLED_TESTS)( expect(hash).toMatch(TX_HASH_REGEX) const receipt = await publicClient.waitForTransactionReceipt({ hash }) expect(receipt.status).toBe("success") - await syncNonce() }, TIMEOUT, ) @@ -709,7 +681,6 @@ describe.each(ENABLED_TESTS)( amount: 0.1, }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.getBalance({ address: RECIPIENT_ADDRESS, }) @@ -732,7 +703,6 @@ describe.each(ENABLED_TESTS)( amount: 0.05, }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.getBalance({ address: resolved }) expect(after - before).toBe(parseUnits("0.05", 18)) }, @@ -775,7 +745,6 @@ describe.each(ENABLED_TESTS)( expect(hash).toMatch(TX_HASH_REGEX) const receipt = await publicClient.waitForTransactionReceipt({ hash }) expect(receipt.status).toBe("success") - await syncNonce() const after = await publicClient.readContract({ address: zora721.proxyContractAddress, @@ -830,7 +799,6 @@ describe.each(ENABLED_TESTS)( recipientAddress: ENS_NAME, }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.readContract({ address: zora721.proxyContractAddress, @@ -867,7 +835,6 @@ describe.each(ENABLED_TESTS)( }), }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.readContract({ address: zora721.proxyContractAddress, @@ -903,7 +870,6 @@ describe.each(ENABLED_TESTS)( }), }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const balance = await publicClient.readContract({ address: zora1155.proxyContractAddress, @@ -939,7 +905,6 @@ describe.each(ENABLED_TESTS)( amount, }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.readContract({ address: zora1155.proxyContractAddress, @@ -1001,7 +966,6 @@ describe.each(ENABLED_TESTS)( }), }) await publicClient.waitForTransactionReceipt({ hash: depositHash }) - await syncNonce() const recipient = getAddress(ANVIL_ACCOUNTS[1].address) const before = await publicClient.readContract({ @@ -1019,7 +983,6 @@ describe.each(ENABLED_TESTS)( erc20tokenDecimals: 18, }) await publicClient.waitForTransactionReceipt({ hash }) - await syncNonce() const after = await publicClient.readContract({ address: WETH, diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index 379cd40..cd464c7 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -20,7 +20,7 @@ import { } from "@tokenbound/test-fixtures" import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" -import { JsonRpcProvider, Wallet } from "ethers6" +import { JsonRpcProvider, JsonRpcSigner } from "ethers6" import { createPublicClient, encodeFunctionData, @@ -63,9 +63,9 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( ANVIL_ACCOUNTS[0].privateKey, new ethers.providers.JsonRpcProvider(rpcUrl), ) - : new Wallet( - ANVIL_ACCOUNTS[0].privateKey, + : new JsonRpcSigner( new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[0].address), ) // Pin the legacy V2 deployment. @@ -84,12 +84,6 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( functionName: "purchase", args: [1n], }), - // Read the nonce from the chain rather than trusting ethers' cached - // pending value: awaiting the receipt does not reliably refresh it on - // v6, and the next write then fails with "nonce too low". - nonce: await publicClient.getTransactionCount({ - address: getAddress(ANVIL_ACCOUNTS[0].address), - }), }) await mint.wait() const receipt = await publicClient.waitForTransactionReceipt({ @@ -133,9 +127,9 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( ANVIL_ACCOUNTS[1].privateKey, new ethers.providers.JsonRpcProvider(rpcUrl), ) - : new Wallet( - ANVIL_ACCOUNTS[1].privateKey, + : new JsonRpcSigner( new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[1].address), ), chain: mainnet, }) diff --git a/packages/ethers/src/test/TestCrossChain.test.ts b/packages/ethers/src/test/TestCrossChain.test.ts index 58026b5..c2f8270 100644 --- a/packages/ethers/src/test/TestCrossChain.test.ts +++ b/packages/ethers/src/test/TestCrossChain.test.ts @@ -19,8 +19,14 @@ import { } from "@tokenbound/test-fixtures" import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" -import { JsonRpcProvider, Wallet } from "ethers6" -import { createPublicClient, type Hex, http, type PublicClient } from "viem" +import { JsonRpcProvider, JsonRpcSigner } from "ethers6" +import { + createPublicClient, + getAddress, + type Hex, + http, + type PublicClient, +} from "viem" import { base, mainnet } from "viem/chains" import { afterAll, beforeAll, describe, expect, it } from "vitest" import { TokenboundClient } from "../index" @@ -55,9 +61,9 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( ANVIL_ACCOUNTS[0].privateKey, new ethers.providers.JsonRpcProvider(rpcUrl), ) - : new Wallet( - ANVIL_ACCOUNTS[0].privateKey, + : new JsonRpcSigner( new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[0].address), ) tokenboundClient = new TokenboundClient({ signer, chain: mainnet }) From 6addab33ed645049c97e5d1331cfa313b448a906 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 18:30:20 -0700 Subject: [PATCH 19/30] strip nextNonce() calls --- packages/ethers/src/test/TestAllEthers.test.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 547e21f..5a01b09 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -131,17 +131,6 @@ describe.each(ENABLED_TESTS)( ) } - /** - * ethers caches the pending nonce per provider. Writes issued through the - * SDK return a bare hash, so ethers never sees them land; poll until its - * view matches the chain before the next send. - */ - async function nextNonce() { - return await publicClient.getTransactionCount({ - address: getAddress(ANVIL_ACCOUNTS[0].address), - }) - } - /** * Waits for a receipt by hash. The SDK's writes return a bare hash, so this * is how the suite observes them landing. (viem parity: getReceipt) @@ -246,7 +235,6 @@ describe.each(ENABLED_TESTS)( BigInt(tokenId), ], }), - nonce: await nextNonce(), }) await tx.wait() await getReceipt(tx.hash as Hex) @@ -618,7 +606,6 @@ describe.each(ENABLED_TESTS)( const tx = await signer.sendTransaction({ to: ZORA721_TBA_ADDRESS, value: parseUnits("0.5", 18), - nonce: await nextNonce(), }) await tx.wait() await publicClient.waitForTransactionReceipt({ hash: tx.hash as Hex }) From c2b191d6a39559ac50ff569965bc4e77655e4fae Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 19:02:42 -0700 Subject: [PATCH 20/30] drop redundant tx.wait() calls that can stall on ethers v6 --- packages/ethers/src/test/TestAllEthers.test.ts | 3 --- packages/ethers/src/test/TestAllEthersV2.test.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 5a01b09..38250a9 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -162,7 +162,6 @@ describe.each(ENABLED_TESTS)( args: [BigInt(zora721.quantity)], }), }) - await mint.wait() const receipt = await getReceipt(mint.hash as Hex) // Read token IDs off the mint receipt. The mint is a single transaction, @@ -236,7 +235,6 @@ describe.each(ENABLED_TESTS)( ], }), }) - await tx.wait() await getReceipt(tx.hash as Hex) return tx.hash as Hex } @@ -607,7 +605,6 @@ describe.each(ENABLED_TESTS)( to: ZORA721_TBA_ADDRESS, value: parseUnits("0.5", 18), }) - await tx.wait() await publicClient.waitForTransactionReceipt({ hash: tx.hash as Hex }) const after = await publicClient.getBalance({ address: ZORA721_TBA_ADDRESS, diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index cd464c7..fadb627 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -85,7 +85,6 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( args: [1n], }), }) - await mint.wait() const receipt = await publicClient.waitForTransactionReceipt({ hash: mint.hash as Hex, }) From 867b437b6c784bf67f1bccca40da1de58adab2c2 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 30 Sep 2026 19:16:23 -0700 Subject: [PATCH 21/30] poll for receipts instead of relying on viem's block watcher --- .../ethers/src/test/TestAllEthers.test.ts | 26 ++++++++-------- .../ethers/src/test/TestAllEthersV2.test.ts | 28 +++++++++++++---- packages/sdk/src/test/TestAllViem.test.ts | 30 ++++--------------- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 38250a9..5a9097a 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -462,9 +462,7 @@ describe.each(ENABLED_TESTS)( ], }) - const receipt = await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const receipt = await getReceipt(txHash) expect(created).toMatch(ADDRESS_REGEX) expect(receipt.status).toBe("success") @@ -605,7 +603,7 @@ describe.each(ENABLED_TESTS)( to: ZORA721_TBA_ADDRESS, value: parseUnits("0.5", 18), }) - await publicClient.waitForTransactionReceipt({ hash: tx.hash as Hex }) + await getReceipt(tx.hash as Hex) const after = await publicClient.getBalance({ address: ZORA721_TBA_ADDRESS, }) @@ -644,7 +642,7 @@ describe.each(ENABLED_TESTS)( ? await tokenboundClient.execute(execution) : await tokenboundClient.executeCall(execution) expect(hash).toMatch(TX_HASH_REGEX) - const receipt = await publicClient.waitForTransactionReceipt({ hash }) + const receipt = await getReceipt(hash) expect(receipt.status).toBe("success") }, TIMEOUT, @@ -664,7 +662,7 @@ describe.each(ENABLED_TESTS)( recipientAddress: RECIPIENT_ADDRESS, amount: 0.1, }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.getBalance({ address: RECIPIENT_ADDRESS, }) @@ -686,7 +684,7 @@ describe.each(ENABLED_TESTS)( recipientAddress: ENS_NAME, amount: 0.05, }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.getBalance({ address: resolved }) expect(after - before).toBe(parseUnits("0.05", 18)) }, @@ -727,7 +725,7 @@ describe.each(ENABLED_TESTS)( recipientAddress: recipient, }) expect(hash).toMatch(TX_HASH_REGEX) - const receipt = await publicClient.waitForTransactionReceipt({ hash }) + const receipt = await getReceipt(hash) expect(receipt.status).toBe("success") const after = await publicClient.readContract({ @@ -782,7 +780,7 @@ describe.each(ENABLED_TESTS)( tokenId: sendableId, recipientAddress: ENS_NAME, }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.readContract({ address: zora721.proxyContractAddress, @@ -818,7 +816,7 @@ describe.each(ENABLED_TESTS)( args: [BigInt(zora721.quantity)], }), }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.readContract({ address: zora721.proxyContractAddress, @@ -853,7 +851,7 @@ describe.each(ENABLED_TESTS)( ], }), }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const balance = await publicClient.readContract({ address: zora1155.proxyContractAddress, @@ -888,7 +886,7 @@ describe.each(ENABLED_TESTS)( recipientAddress: recipient, amount, }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.readContract({ address: zora1155.proxyContractAddress, @@ -949,7 +947,7 @@ describe.each(ENABLED_TESTS)( functionName: "deposit", }), }) - await publicClient.waitForTransactionReceipt({ hash: depositHash }) + await getReceipt(depositHash) const recipient = getAddress(ANVIL_ACCOUNTS[1].address) const before = await publicClient.readContract({ @@ -966,7 +964,7 @@ describe.each(ENABLED_TESTS)( erc20tokenAddress: WETH, erc20tokenDecimals: 18, }) - await publicClient.waitForTransactionReceipt({ hash }) + await getReceipt(hash) const after = await publicClient.readContract({ address: WETH, diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index fadb627..69b84df 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -49,6 +49,26 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( let tokenboundClient: TokenboundClient let tokenId: string + /** + * Waits for a receipt by polling. + * + * viem's waitForTransactionReceipt relies on a block watcher that does not + * reliably observe new blocks in this suite, and stalls until the test times + * out. Polling getTransactionReceipt is reliable. (Parity with the other + * suites' getReceipt.) + */ + async function getReceipt(hash: Hex, timeoutMs = 30000) { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + return await publicClient.getTransactionReceipt({ hash }) + } catch { + await new Promise((r) => setTimeout(r, 200)) + } + } + throw new Error(`Transaction ${hash} was not mined within ${timeoutMs}ms`) + } + beforeAll(async () => { await anvil.start() @@ -85,9 +105,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( args: [1n], }), }) - const receipt = await publicClient.waitForTransactionReceipt({ - hash: mint.hash as Hex, - }) + const receipt = await getReceipt(mint.hash as Hex) const transferLog = receipt.logs.find( (log) => isAddressMatch(log.address, zora721.proxyContractAddress) && @@ -162,9 +180,7 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( expect(account).toMatch(ADDRESS_REGEX) expect(txHash).toMatch(TX_HASH_REGEX) - const receipt = await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const receipt = await getReceipt(txHash) expect(receipt.status).toBe("success") expect( diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index a0b70f7..f17fa02 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -420,10 +420,7 @@ describe.each(ENABLED_TESTS)( await tokenboundClient.createAccount(NFT_IN_EOA) testLog("CREATED ACCT", account) - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const createdAccountTxReceipt = await getReceipt(txHash) ZORA721_TBA_ADDRESS = account await vi.waitFor(() => { @@ -444,10 +441,7 @@ describe.each(ENABLED_TESTS)( }) testLog("CREATED ACCT WITH CUSTOM SALT", account) - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const createdAccountTxReceipt = await getReceipt(txHash) await vi.waitFor(() => { expect(account).toMatch(ADDRESS_REGEX) @@ -469,10 +463,7 @@ describe.each(ENABLED_TESTS)( }) testLog("CREATED ACCT WITH CUSTOM CHAIN ID", account) - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const createdAccountTxReceipt = await getReceipt(txHash) const bytecode = await tokenboundClient.deconstructBytecode({ accountAddress: account, @@ -526,10 +517,7 @@ describe.each(ENABLED_TESTS)( }) testLog("CREATED ACCT WITH MULTICALL", account) - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) + const createdAccountTxReceipt = await getReceipt(txHash) await vi.waitFor(() => { expect(account).toMatch(ADDRESS_REGEX) @@ -694,10 +682,7 @@ describe.each(ENABLED_TESTS)( ...preparedNFTTransfer, }) - const transactionReceipt = - await publicClient.waitForTransactionReceipt({ - hash: transferHash, - }) + const transactionReceipt = await getReceipt(transferHash) const tbaNFTBalance = await getZora721Balance({ publicClient, @@ -744,10 +729,7 @@ describe.each(ENABLED_TESTS)( ...preparedNFTTransfer, }) - const transactionReceipt = - await publicClient.waitForTransactionReceipt({ - hash: transferHash, - }) + const transactionReceipt = await getReceipt(transferHash) const tbaNFTBalance = await getZora721Balance({ publicClient, From ac4c5eb1990cfcdcfbd7bd236d32cf0b46eddaef Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 14 Oct 2026 14:58:01 -0700 Subject: [PATCH 22/30] Replace legacy @viem/anvil with prool --- .github/workflows/ci.yml | 4 +- .github/workflows/on-create-release.yml | 2 +- .nvmrc | 1 + README.md | 2 +- packages/ethers/package.json | 1 - .../ethers/src/test/TestAllEthers.test.ts | 7 +- .../ethers/src/test/TestAllEthersV2.test.ts | 7 +- .../ethers/src/test/TestCrossChain.test.ts | 7 +- packages/sdk/package.json | 1 - packages/sdk/src/test/TestAllViem.test.ts | 5 +- packages/sdk/src/test/crossChain.test.ts | 7 +- packages/test-fixtures/package.json | 2 +- packages/test-fixtures/src/anvil.ts | 33 +- pnpm-lock.yaml | 514 +++++++++++++++--- 14 files changed, 471 insertions(+), 122 deletions(-) create mode 100644 .nvmrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9662a4e..ef60c81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: .nvmrc cache: pnpm - name: Install dependencies @@ -63,7 +63,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: .nvmrc cache: pnpm - name: Install Foundry diff --git a/.github/workflows/on-create-release.yml b/.github/workflows/on-create-release.yml index 6f832b2..268ec7a 100644 --- a/.github/workflows/on-create-release.yml +++ b/.github/workflows/on-create-release.yml @@ -21,7 +21,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 20 + node-version-file: .nvmrc registry-url: 'https://registry.npmjs.org' cache: pnpm diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/README.md b/README.md index dcaa520..02760e6 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ NOTE: Any local changes to SDK methods in `TokenboundClient.ts` require a rebuil ## Unit/integration tests -Tests use [Vitest](https://vitest.dev). The fork-backed suites spin up a local Anvil instance via [@viem/anvil](https://www.npmjs.com/package/@viem/anvil) and transact against a fork of mainnet, so **[Foundry](https://book.getfoundry.sh/getting-started/installation) must be installed and `anvil` on your `PATH`**. +Tests use [Vitest](https://vitest.dev). The fork-backed suites spin up a local Anvil instance via [Prool](https://github.com/wevm/prool) and transact against a fork of mainnet, so **[Foundry](https://book.getfoundry.sh/getting-started/installation) must be installed and `anvil` on your `PATH`**, and **Node 22 or later** is required (see `.nvmrc` — on Node 20, Prool fails with `Promise.withResolvers is not a function`). `@tokenbound/sdk`'s suite is viem-only. `@tokenbound/ethers` runs its own, exercising ethers v5 and v6 independently against separate Anvil forks, so a behavioural difference in one major version can't be masked by the other. Both packages cover the ERC-6551 V2 (legacy) and V3 deployments — six variants in total. diff --git a/packages/ethers/package.json b/packages/ethers/package.json index 04334b8..6aaadbd 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -59,7 +59,6 @@ "devDependencies": { "@biomejs/biome": "2.5.14", "@tokenbound/test-fixtures": "workspace:*", - "@viem/anvil": "^0.0.10", "ethers": "^5.8.0", "ethers6": "npm:ethers@^6.17.0", "typescript": "^5.6.3", diff --git a/packages/ethers/src/test/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts index 5a9097a..01d1ef4 100644 --- a/packages/ethers/src/test/TestAllEthers.test.ts +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -23,7 +23,7 @@ import { import { ADDRESS_REGEX, ANVIL_ACCOUNTS, - CREATE_ANVIL_OPTIONS, + createForkInstance, ECDSA_SIGNATURE_REGEX, ENS_NAME, isAddressMatch, @@ -35,7 +35,6 @@ import { zora721, zora1155, } from "@tokenbound/test-fixtures" -import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" import { JsonRpcProvider, JsonRpcSigner } from "ethers6" import { @@ -99,8 +98,8 @@ describe.each(ENABLED_TESTS)( // sequence.concurrent: false) and each afterAll stops anvil before the // next beforeAll starts, so they can share the default port — same as // the viem suite. - const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) - const rpcUrl = `http://127.0.0.1:${anvil.port}` + const anvil = createForkInstance() + const rpcUrl = anvil.url let publicClient: PublicClient let testClient: ReturnType diff --git a/packages/ethers/src/test/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts index 69b84df..427f726 100644 --- a/packages/ethers/src/test/TestAllEthersV2.test.ts +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -13,12 +13,11 @@ import { ERC_6551_LEGACY_V2, TBVersion } from "@tokenbound/sdk" import { ADDRESS_REGEX, ANVIL_ACCOUNTS, - CREATE_ANVIL_OPTIONS, + createForkInstance, isAddressMatch, TX_HASH_REGEX, zora721, } from "@tokenbound/test-fixtures" -import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" import { JsonRpcProvider, JsonRpcSigner } from "ethers6" import { @@ -42,8 +41,8 @@ describe.each([{ version: 5 as const }, { version: 6 as const }])( // No explicit port: variants run sequentially and each afterAll stops // anvil before the next beforeAll starts, so they can share the default // port — same as the viem suite. - const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) - const rpcUrl = `http://127.0.0.1:${anvil.port}` + const anvil = createForkInstance() + const rpcUrl = anvil.url let publicClient: PublicClient let tokenboundClient: TokenboundClient diff --git a/packages/ethers/src/test/TestCrossChain.test.ts b/packages/ethers/src/test/TestCrossChain.test.ts index c2f8270..2a308d6 100644 --- a/packages/ethers/src/test/TestCrossChain.test.ts +++ b/packages/ethers/src/test/TestCrossChain.test.ts @@ -13,11 +13,10 @@ import { } from "@tokenbound/sdk" import { ANVIL_ACCOUNTS, - CREATE_ANVIL_OPTIONS, CROSS_CHAIN_SENDER_NFT, + createForkInstance, RECIPIENT_ADDRESS, } from "@tokenbound/test-fixtures" -import { createAnvil } from "@viem/anvil" import { ethers } from "ethers" import { JsonRpcProvider, JsonRpcSigner } from "ethers6" import { @@ -41,8 +40,8 @@ const SENDING_TBA = getAccountAddress( describe.each([{ version: 5 as const }, { version: 6 as const }])( "ethers v$version — cross-chain execution", ({ version }) => { - const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) - const rpcUrl = `http://127.0.0.1:${anvil.port}` + const anvil = createForkInstance() + const rpcUrl = anvil.url let tokenboundClient: TokenboundClient let publicClient: PublicClient diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 01da5ae..74628ed 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -68,7 +68,6 @@ "devDependencies": { "@biomejs/biome": "2.5.14", "@tokenbound/test-fixtures": "workspace:*", - "@viem/anvil": "^0.0.10", "@vitest/coverage-v8": "^1.6.1", "@wagmi/cli": "^2.10.0", "rollup-plugin-visualizer": "^5.12.0", diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts index f17fa02..a915128 100644 --- a/packages/sdk/src/test/TestAllViem.test.ts +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -9,7 +9,7 @@ import { ANVIL_ACCOUNTS, ANVIL_CONFIG, ANVIL_RPC_URL, - CREATE_ANVIL_OPTIONS, + createForkInstance, isAddressMatch, TEST_CONFIG, testLog, @@ -18,7 +18,6 @@ import { zora721, zora1155, } from "@tokenbound/test-fixtures" -import { createAnvil } from "@viem/anvil" import { createTestClient, createWalletClient, @@ -96,7 +95,7 @@ describe.each(ENABLED_TESTS)( const isV3 = isV2 === false const v3OnlyIt = isV3 ? it : it.skip // Set up Anvil instance + clients - const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + const anvil = createForkInstance() const CUSTOM_SALT = 6551 let tokenboundClient: TokenboundClient let publicClient: PublicClient diff --git a/packages/sdk/src/test/crossChain.test.ts b/packages/sdk/src/test/crossChain.test.ts index 7bca048..20d4008 100644 --- a/packages/sdk/src/test/crossChain.test.ts +++ b/packages/sdk/src/test/crossChain.test.ts @@ -7,11 +7,10 @@ import { ANVIL_CONFIG, - CREATE_ANVIL_OPTIONS, CROSS_CHAIN_SENDER_NFT, + createForkInstance, RECIPIENT_ADDRESS, } from "@tokenbound/test-fixtures" -import { createAnvil } from "@viem/anvil" import { createPublicClient, decodeFunctionData, @@ -41,7 +40,7 @@ const executeAbi = parseAbi([ ]) describe("encodeCrossChainCall against the forked executor", () => { - const anvil = createAnvil({ ...CREATE_ANVIL_OPTIONS }) + const anvil = createForkInstance() let publicClient: PublicClient /** Records what was sent, while still performing the real call. */ let sent: Array<{ to: string; data: Hex }> @@ -51,7 +50,7 @@ describe("encodeCrossChainCall against the forked executor", () => { await anvil.start() publicClient = createPublicClient({ chain: ANVIL_CONFIG.ACTIVE_CHAIN, - transport: http(`http://127.0.0.1:${anvil.port}`), + transport: http(anvil.url), }) as PublicClient sent = [] diff --git a/packages/test-fixtures/package.json b/packages/test-fixtures/package.json index 231a077..310555c 100644 --- a/packages/test-fixtures/package.json +++ b/packages/test-fixtures/package.json @@ -11,6 +11,6 @@ "viem": "~2.56.6" }, "devDependencies": { - "@viem/anvil": "^0.0.10" + "prool": "0.2.16" } } diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts index 6fb1d07..f457836 100644 --- a/packages/test-fixtures/src/anvil.ts +++ b/packages/test-fixtures/src/anvil.ts @@ -4,7 +4,7 @@ // declares its own. Reads process.env (not import.meta.env) so this works under // plain Node as well as vitest, without depending on vite/client types. -import type { CreateAnvilOptions } from "@viem/anvil" +import { Instance } from "prool" import { mainnet } from "viem/chains" /** @@ -68,14 +68,27 @@ export const ANVIL_CONFIG = { } /** - * No explicit port: suites run sequentially (fileParallelism: false, - * sequence.concurrent: false) and each afterAll stops anvil before the next - * beforeAll starts, so every variant can share the default port. + * A fresh mainnet fork, managed by prool. Call `start()` in beforeAll and + * `stop()` in afterAll; `url` is valid before start. + * + * Every suite shares one fixed port: they run sequentially (fileParallelism: + * false, sequence.concurrent: false) and each afterAll stops its fork before the + * next beforeAll starts. The host is pinned to 127.0.0.1 because prool defaults + * to `localhost`, which Node may resolve to ::1 while anvil listens on IPv4. */ -export const CREATE_ANVIL_OPTIONS: CreateAnvilOptions = { - forkUrl: FORK_URL, - // Omitted entirely when unset, so anvil forks from the head as before. - ...(FORK_BLOCK_NUMBER === undefined - ? {} - : { forkBlockNumber: FORK_BLOCK_NUMBER }), +export function createForkInstance() { + return Instance.anvil( + { + host: "127.0.0.1", + port: 8545, + forkUrl: FORK_URL, + // Omitted entirely when unset, so anvil forks from the head. + ...(FORK_BLOCK_NUMBER === undefined + ? {} + : { forkBlockNumber: FORK_BLOCK_NUMBER }), + }, + // Forking fetches genesis state over the network, which can outlast + // prool's 10s default on a cold CI runner. + { timeout: ANVIL_CONFIG.TIMEOUT }, + ) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a68d00..1ffaee9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -141,7 +141,7 @@ importers: dependencies: '@rainbow-me/rainbowkit': specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) @@ -165,10 +165,10 @@ importers: version: 0.12.5 viem: specifier: ^2.56.5 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -250,9 +250,6 @@ importers: '@tokenbound/test-fixtures': specifier: workspace:* version: link:../test-fixtures - '@viem/anvil': - specifier: ^0.0.10 - version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -290,9 +287,6 @@ importers: '@tokenbound/test-fixtures': specifier: workspace:* version: link:../test-fixtures - '@viem/anvil': - specifier: ^0.0.10 - version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@vitest/coverage-v8': specifier: ^1.6.1 version: 1.6.1(vitest@1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0)) @@ -321,9 +315,9 @@ importers: specifier: ~2.56.6 version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: - '@viem/anvil': - specifier: ^0.0.10 - version: 0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + prool: + specifier: 0.2.16 + version: 0.2.16 packages: @@ -496,48 +490,56 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64-musl@2.5.14': resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [musl] '@biomejs/cli-linux-arm64@2.5.13': resolution: {integrity: sha512-VlNMtoxOqs0dUR6drxxHr18SNUvI7xxAuHZlH4s/dstYSf3g6RaqVgo8JRnhcOhKz9afWrvtJTboNG1JuYlIDQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-arm64@2.5.14': resolution: {integrity: sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64-musl@2.5.13': resolution: {integrity: sha512-F3pmwl+VHoUuVJN/tbNLKeLt0SVK3EIyN1jXlMcNyQGYRQQTVqXF+GgkP0/CjGXFN87e/mv0sBfUnWqWza5PKQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64-musl@2.5.14': resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [musl] '@biomejs/cli-linux-x64@2.5.13': resolution: {integrity: sha512-Fi6gIxbUaJ3ZCIXeG3ggIBPF76O2DjDN67WrPX/ODRv54GeXPm2gbEPC96Yb0yrJoiH0Eax1JLx1Pi0XbsNFZQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-linux-x64@2.5.14': resolution: {integrity: sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] + libc: [glibc] '@biomejs/cli-win32-arm64@2.5.13': resolution: {integrity: sha512-+WD13qshXrr0Icv4BfsAdzm8Fs3TL+nZ59zEQxsYNd8lcgZJ0A5+OrlwsL1PipVCmWeRpxgIPD6DAcEd7smkCQ==} @@ -1242,6 +1244,10 @@ packages: '@types/node': optional: true + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@istanbuljs/schema@0.1.6': resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} @@ -1401,6 +1407,7 @@ packages: engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] os: [linux] + libc: [glibc] '@noble/ciphers@1.2.1': resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} @@ -1551,36 +1558,42 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.5': resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.5': resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.5': resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.5': resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.5': resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.5': resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} @@ -1649,66 +1662,79 @@ packages: resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.63.0': resolution: {integrity: sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.63.0': resolution: {integrity: sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.63.0': resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.63.0': resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.63.0': resolution: {integrity: sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.63.0': resolution: {integrity: sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.63.0': resolution: {integrity: sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.63.0': resolution: {integrity: sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.63.0': resolution: {integrity: sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.63.0': resolution: {integrity: sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.63.0': resolution: {integrity: sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.63.0': resolution: {integrity: sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.63.0': resolution: {integrity: sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==} @@ -1797,9 +1823,16 @@ packages: '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sinclair/typebox@0.27.12': resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} @@ -2240,9 +2273,6 @@ packages: peerDependencies: '@vanilla-extract/css': ^1.0.0 - '@viem/anvil@0.0.10': - resolution: {integrity: sha512-9PzYXBRikfSUhhm8Bd0avv07agwcbMJ5FaSu2D2vbE0cxkvXGtolL3fW5nz2yefMqOqVQL4XzfM5nwY81x3ytw==} - '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2723,6 +2753,10 @@ packages: resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} engines: {node: '>= 20.19.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -3086,14 +3120,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -3126,6 +3160,10 @@ packages: picomatch: optional: true + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3206,22 +3244,22 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-port@6.1.2: - resolution: {integrity: sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + get-port@7.2.0: + resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} + engines: {node: '>=16'} get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3314,14 +3352,14 @@ packages: resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} hasBin: true - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + husky@8.0.3: resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} @@ -3402,6 +3440,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -3424,6 +3466,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -3432,6 +3478,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -3575,24 +3625,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} @@ -3728,6 +3782,14 @@ packages: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mipd@0.0.7: resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} peerDependencies: @@ -3736,6 +3798,11 @@ packages: typescript: optional: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -3800,6 +3867,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nwsapi@2.2.27: resolution: {integrity: sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==} @@ -3892,6 +3963,10 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -4041,6 +4116,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.1: + resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -4051,6 +4130,18 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + prool@0.2.16: + resolution: {integrity: sha512-WW5HOJExIBmCJvS6XcjwXFuq+oNy2j8PaSwzF0NA99TnVn7XZ8bG1Yl2kdBPlzpOjozL0xooDjZkkgnw++LeZA==} + engines: {node: '>=22'} + peerDependencies: + '@pimlico/alto': '*' + testcontainers: '>=11.10.0' + peerDependenciesMeta: + '@pimlico/alto': + optional: true + testcontainers: + optional: true + proxy-compare@2.6.0: resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} @@ -4316,9 +4407,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -4403,6 +4491,10 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -4444,6 +4536,11 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tar@7.2.0: + resolution: {integrity: sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==} + engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -4537,6 +4634,10 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -4965,6 +5066,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -4985,6 +5090,10 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'} @@ -5211,6 +5320,34 @@ snapshots: - utf-8-validate - zod + '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@coinbase/cdp-sdk': 1.56.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) + preact: 10.24.2 + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + transitivePeerDependencies: + - '@types/react' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - bufferutil + - debug + - fastestsmallesttextencoderdecoder + - immer + - react + - supports-color + - typescript + - use-sync-external-store + - utf-8-validate + - zod + '@bcoe/v8-coverage@0.2.3': {} '@biomejs/biome@2.5.13': @@ -5501,7 +5638,6 @@ snapshots: - use-sync-external-store - utf-8-validate - zod - optional: true '@csstools/color-helpers@5.1.0': optional: true @@ -6048,6 +6184,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@gemini-wallet/core@0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + dependencies: + '@metamask/rpc-errors': 7.0.2 + eventemitter3: 5.0.1 + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + transitivePeerDependencies: + - supports-color + '@inquirer/external-editor@1.0.3(@types/node@26.3.0)': dependencies: chardet: 2.2.0 @@ -6055,6 +6199,10 @@ snapshots: optionalDependencies: '@types/node': 26.3.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@istanbuljs/schema@0.1.6': {} '@jest/schemas@29.6.3': @@ -6451,6 +6599,25 @@ snapshots: - babel-plugin-macros - typescript + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))': + dependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@vanilla-extract/css': 1.20.1 + '@vanilla-extract/dynamic': 2.1.5 + '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1) + clsx: 2.1.1 + cuer: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) + ua-parser-js: 2.0.10 + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + transitivePeerDependencies: + - '@types/react' + - babel-plugin-macros + - typescript + '@reown/appkit-common@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4)': dependencies: big.js: 6.2.2 @@ -6483,7 +6650,6 @@ snapshots: - typescript - utf-8-validate - zod - optional: true '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6554,7 +6720,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6627,7 +6792,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@reown/appkit-polyfills@1.7.8': dependencies: @@ -6706,7 +6870,6 @@ snapshots: - utf-8-validate - valtio - zod - optional: true '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6777,7 +6940,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': dependencies: @@ -6854,7 +7016,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: @@ -6952,7 +7113,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@rolldown/binding-android-arm-eabi@1.2.5': optional: true @@ -7138,7 +7298,6 @@ snapshots: - typescript - utf-8-validate - zod - optional: true '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -7159,7 +7318,6 @@ snapshots: - typescript - utf-8-validate - zod - optional: true '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} @@ -7200,8 +7358,12 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@sec-ant/readable-stream@0.4.1': {} + '@sinclair/typebox@0.27.12': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@socket.io/component-emitter@3.1.2': {} '@solana-program/system@0.10.0(@solana/kit@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': @@ -7726,17 +7888,6 @@ snapshots: dependencies: '@vanilla-extract/css': 1.20.1 - '@viem/anvil@0.0.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)': - dependencies: - execa: 7.2.0 - get-port: 6.1.2 - http-proxy: 1.18.1 - ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - '@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0))': dependencies: '@babel/core': 7.29.7 @@ -7922,6 +8073,63 @@ snapshots: - wagmi - zod + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': + dependencies: + '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) + '@gemini-wallet/core': 0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + cbw-sdk: '@coinbase/wallet-sdk@3.9.3' + porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react + - react-native + - supports-color + - uploadthing + - use-sync-external-store + - utf-8-validate + - wagmi + - zod + '@wagmi/connectors@8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) @@ -7948,6 +8156,21 @@ snapshots: - react - use-sync-external-store + '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.7(typescript@5.9.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/query-core': 5.102.4 + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/react' + - immer + - react + - use-sync-external-store + '@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: eventemitter3: 5.0.1 @@ -8050,7 +8273,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8139,7 +8361,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/environment@1.0.1': dependencies: @@ -8226,7 +8447,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/events@1.0.1': dependencies: @@ -8392,7 +8612,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8465,7 +8684,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/time@1.0.2': dependencies: @@ -8608,7 +8826,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8689,7 +8906,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8778,7 +8994,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8867,7 +9082,6 @@ snapshots: - uploadthing - utf-8-validate - zod - optional: true '@walletconnect/window-getters@1.0.1': dependencies: @@ -8892,7 +9106,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 zod: 4.4.3 - optional: true abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): optionalDependencies: @@ -9137,6 +9350,8 @@ snapshots: dependencies: readdirp: 5.1.1 + chownr@3.0.0: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -9591,18 +9806,6 @@ snapshots: events@3.3.0: {} - execa@7.2.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -9615,6 +9818,21 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.1 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.2.0 + extendable-error@0.1.7: {} extension-port-stream@3.0.0: @@ -9644,6 +9862,10 @@ snapshots: optionalDependencies: picomatch: 3.0.2 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9728,17 +9950,20 @@ snapshots: get-nonce@1.0.1: {} - get-port@6.1.2: {} + get-port@7.2.0: {} get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-stream@6.0.1: {} - get-stream@8.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -9856,10 +10081,10 @@ snapshots: human-id@4.2.1: {} - human-signals@4.3.1: {} - human-signals@5.0.0: {} + human-signals@8.0.1: {} + husky@8.0.3: {} iconv-lite@0.6.3: @@ -9923,6 +10148,8 @@ snapshots: is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: optional: true @@ -9941,6 +10168,8 @@ snapshots: is-stream@3.0.0: {} + is-stream@4.0.1: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -9949,6 +10178,8 @@ snapshots: dependencies: which-typed-array: 1.1.22 + is-unicode-supported@2.1.0: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -10231,10 +10462,18 @@ snapshots: dependencies: brace-expansion: 2.1.4 + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + mipd@0.0.7(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 + mkdirp@3.0.1: {} + mlly@1.8.2: dependencies: acorn: 8.18.0 @@ -10280,6 +10519,11 @@ snapshots: dependencies: path-key: 4.0.0 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nwsapi@2.2.27: optional: true @@ -10391,7 +10635,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod - optional: true ox@0.6.9(typescript@5.9.3)(zod@3.25.76): dependencies: @@ -10420,7 +10663,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod - optional: true ox@0.9.17(typescript@5.9.3)(zod@4.4.3): dependencies: @@ -10461,6 +10703,8 @@ snapshots: dependencies: quansync: 0.2.11 + parse-ms@4.0.0: {} + parse5@7.3.0: dependencies: entities: 6.0.1 @@ -10557,6 +10801,26 @@ snapshots: - immer - use-sync-external-store + porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + hono: 4.13.8 + idb-keyval: 6.3.0 + mipd: 0.0.7(typescript@5.9.3) + ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + zod: 4.4.3 + zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) + optionalDependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + react: 18.3.1 + typescript: 5.9.3 + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + possible-typed-array-names@1.1.0: {} postcss-value-parser@4.2.0: {} @@ -10579,12 +10843,27 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.3.1: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} process-warning@5.1.0: {} process@0.11.10: {} + prool@0.2.16: + dependencies: + change-case: 5.4.4 + eventemitter3: 5.0.1 + execa: 9.6.1 + get-port: 7.2.0 + http-proxy: 1.18.1 + tar: 7.2.0 + transitivePeerDependencies: + - debug + proxy-compare@2.6.0: {} proxy-from-env@2.1.0: {} @@ -10873,8 +11152,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} @@ -10950,6 +11227,8 @@ snapshots: strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} + strip-json-comments@3.1.1: {} strip-literal@2.1.1: @@ -10998,6 +11277,15 @@ snapshots: symbol-tree@3.2.4: optional: true + tar@7.2.0: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + mkdirp: 3.0.1 + yallist: 5.0.0 + term-size@2.2.1: {} test-exclude@6.0.0: @@ -11082,6 +11370,8 @@ snapshots: undici-types@8.3.0: optional: true + unicorn-magic@0.3.0: {} + universalify@0.1.2: {} universalify@0.2.0: @@ -11201,7 +11491,6 @@ snapshots: - bufferutil - utf-8-validate - zod - optional: true viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: @@ -11410,6 +11699,55 @@ snapshots: - utf-8-validate - zod + wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3): + dependencies: + '@tanstack/react-query': 5.102.4(react@18.3.1) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + react: 18.3.1 + use-sync-external-store: 1.4.0(react@18.3.1) + viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - '@x402/core' + - '@x402/evm' + - '@x402/extensions' + - '@x402/svm' + - aws4fetch + - bufferutil + - db0 + - debug + - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder + - immer + - ioredis + - react-native + - supports-color + - uploadthing + - utf-8-validate + - zod + wagmi@3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)): dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) @@ -11531,6 +11869,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -11564,6 +11904,8 @@ snapshots: yocto-queue@1.2.2: {} + yoctocolors@2.2.0: {} + z-schema@5.0.5: dependencies: lodash.get: 4.4.2 From 58a72faced78860ffdf9d8e1d6e6a9e0efce6d35 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 14 Oct 2026 15:28:37 -0700 Subject: [PATCH 23/30] bump viem to 2.57.7 across the workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The bump to ~2.57.7 missed @tokenbound/sdk's `dependencies` entry, which still read ~2.56.6 while its `devDependencies` read ~2.57.7. pnpm installed the dependencies version, so the SDK resolved one viem copy and test-fixtures another — and passing a fixtures Chain to an SDK client failed to typecheck across the two copies. - @tokenbound/sdk: viem ~2.57.7, declared once as a runtime dependency (the duplicate devDependency is how the versions split) - examples: ^2.57.7, since they pass viem clients into the SDK and would hit the same mismatch Every workspace package now resolves a single viem 2.57.7. Co-Authored-By: Claude Opus 5.5 --- examples/vite-wagmi-ethers/package.json | 2 +- examples/vite-wagmi-ethers6/package.json | 2 +- examples/vite-wagmi-viem/package.json | 2 +- examples/vite-wagmi3-viem/package.json | 2 +- packages/ethers/package.json | 4 +- packages/sdk/package.json | 3 +- packages/test-fixtures/package.json | 2 +- pnpm-lock.yaml | 393 +++++++---------------- 8 files changed, 118 insertions(+), 292 deletions(-) diff --git a/examples/vite-wagmi-ethers/package.json b/examples/vite-wagmi-ethers/package.json index c8425d2..3c9350d 100644 --- a/examples/vite-wagmi-ethers/package.json +++ b/examples/vite-wagmi-ethers/package.json @@ -19,7 +19,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.56.5", + "viem": "^2.57.7", "wagmi": "^2.19.5" }, "devDependencies": { diff --git a/examples/vite-wagmi-ethers6/package.json b/examples/vite-wagmi-ethers6/package.json index 447970c..15ddd25 100644 --- a/examples/vite-wagmi-ethers6/package.json +++ b/examples/vite-wagmi-ethers6/package.json @@ -18,7 +18,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.56.5", + "viem": "^2.57.7", "wagmi": "^2.19.5" }, "devDependencies": { diff --git a/examples/vite-wagmi-viem/package.json b/examples/vite-wagmi-viem/package.json index b5493e7..5da380c 100644 --- a/examples/vite-wagmi-viem/package.json +++ b/examples/vite-wagmi-viem/package.json @@ -17,7 +17,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.56.5", + "viem": "^2.57.7", "wagmi": "^2.19.5" }, "devDependencies": { diff --git a/examples/vite-wagmi3-viem/package.json b/examples/vite-wagmi3-viem/package.json index 63dda2f..700fc7b 100644 --- a/examples/vite-wagmi3-viem/package.json +++ b/examples/vite-wagmi3-viem/package.json @@ -16,7 +16,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.56.5", + "viem": "^2.57.7", "wagmi": "^3.7.7" }, "devDependencies": { diff --git a/packages/ethers/package.json b/packages/ethers/package.json index 6aaadbd..ff6fc76 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -54,7 +54,7 @@ }, "peerDependencies": { "ethers": "^5.7.2 || ^6.0.0", - "viem": "~2.56.6" + "viem": "~2.57.7" }, "devDependencies": { "@biomejs/biome": "2.5.14", @@ -62,7 +62,7 @@ "ethers": "^5.8.0", "ethers6": "npm:ethers@^6.17.0", "typescript": "^5.6.3", - "viem": "~2.56.6", + "viem": "~2.57.7", "vite": "^4.4.9", "vite-plugin-dts": "^3.9.0", "vitest": "^1.6.1" diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 74628ed..168abea 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -63,7 +63,7 @@ }, "dependencies": { "@layerzerolabs/lz-v2-utilities": "^3.0.168", - "viem": "~2.56.6" + "viem": "~2.57.7" }, "devDependencies": { "@biomejs/biome": "2.5.14", @@ -72,7 +72,6 @@ "@wagmi/cli": "^2.10.0", "rollup-plugin-visualizer": "^5.12.0", "typescript": "^5.4.5", - "viem": "~2.56.6", "vite": "^4.4.9", "vite-plugin-dts": "^3.9.0", "vitest": "^1.6.0" diff --git a/packages/test-fixtures/package.json b/packages/test-fixtures/package.json index 310555c..998e3fb 100644 --- a/packages/test-fixtures/package.json +++ b/packages/test-fixtures/package.json @@ -8,7 +8,7 @@ ".": "./src/index.ts" }, "peerDependencies": { - "viem": "~2.56.6" + "viem": "~2.57.7" }, "devDependencies": { "prool": "0.2.16" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ffaee9..10d7dd2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: dependencies: '@rainbow-me/rainbowkit': specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) @@ -40,7 +40,7 @@ importers: version: 6.0.3 connectkit: specifier: ^1.9.2 - version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: specifier: ^5.8.0 version: 5.8.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -57,11 +57,11 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.56.5 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -95,7 +95,7 @@ importers: version: 6.0.3 connectkit: specifier: ^1.9.2 - version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + version: 1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) ethers: specifier: ^6.17.0 version: 6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -112,11 +112,11 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.56.5 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + specifier: ^2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -141,7 +141,7 @@ importers: dependencies: '@rainbow-me/rainbowkit': specifier: ^2.2.11 - version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) + version: 2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': specifier: ^5.59.15 version: 5.102.4(react@18.3.1) @@ -164,11 +164,11 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.56.5 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ^2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 - version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -213,11 +213,11 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.56.5 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ^2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) wagmi: specifier: ^3.7.7 - version: 3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + version: 3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) devDependencies: '@biomejs/biome': specifier: 2.5.13 @@ -260,8 +260,8 @@ importers: specifier: ^5.6.3 version: 5.9.3 viem: - specifier: ~2.56.6 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ~2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) vite: specifier: ^4.4.9 version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) @@ -278,8 +278,8 @@ importers: specifier: ^3.0.168 version: 3.0.168 viem: - specifier: ~2.56.6 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ~2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: '@biomejs/biome': specifier: 2.5.14 @@ -312,8 +312,8 @@ importers: packages/test-fixtures: dependencies: viem: - specifier: ~2.56.6 - version: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + specifier: ~2.57.7 + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: prool: specifier: 0.2.16 @@ -3904,8 +3904,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - ox@0.14.44: - resolution: {integrity: sha512-O54qXXHEk4ySamMSyBpI0AeBegS5frxU6+LA6Jb9Sf6kMOxcTNaxYmwZfpOu22DIQsdKfgQxHq8EsAGaoBQScA==} + ox@0.14.56: + resolution: {integrity: sha512-Feinlj+deWEam6RIwurRE+eHZ2N3hoUb3AAjQ10BmxRCYIymfqNkv0eZ+4ln4GkgDmSGLD2rGtTMqsFYSVDC6w==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -4794,8 +4794,8 @@ packages: typescript: optional: true - viem@2.56.6: - resolution: {integrity: sha512-wa7bJ8CiYE4iYUFUNWn5RrjV2qhrkye0wKeqp4vDW6WsJZ0lGDvoPB6Hb1p7Q+DGR+8uK+QLAE8eC+iQTkONHg==} + viem@2.57.7: + resolution: {integrity: sha512-x3UqqrcQuESaRVK6a0BvNmoNP0SVhu913uxEAxYLJx1lNYnj6ylTntfUdakCUKjk1+T+63gkdwFGJQ2O5C/nRw==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -5146,12 +5146,12 @@ packages: snapshots: - '@aave/account@0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': + '@aave/account@0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) '@adraffy/ens-normalize@1.11.1': {} @@ -5301,35 +5301,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - transitivePeerDependencies: - - '@types/react' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - bufferutil - - debug - - fastestsmallesttextencoderdecoder - - immer - - react - - supports-color - - typescript - - use-sync-external-store - - utf-8-validate - - zod - - '@base-org/account@2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3)': - dependencies: - '@coinbase/cdp-sdk': 1.56.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@noble/hashes': 1.4.0 - clsx: 1.2.1 - eventemitter3: 5.0.1 - idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) - preact: 10.24.2 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5575,7 +5547,7 @@ snapshots: jose: 6.2.12 md5: 2.3.0 uncrypto: 0.1.3 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil @@ -5607,7 +5579,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@3.25.76) preact: 10.24.2 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5627,7 +5599,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.3)(zod@4.4.3) preact: 10.24.2 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) transitivePeerDependencies: - '@types/react' @@ -5638,6 +5610,7 @@ snapshots: - use-sync-external-store - utf-8-validate - zod + optional: true '@csstools/color-helpers@5.1.0': optional: true @@ -6176,19 +6149,11 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 - '@gemini-wallet/core@0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': - dependencies: - '@metamask/rpc-errors': 7.0.2 - eventemitter3: 5.0.1 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - transitivePeerDependencies: - - supports-color - - '@gemini-wallet/core@0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@gemini-wallet/core@0.3.2(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: '@metamask/rpc-errors': 7.0.2 eventemitter3: 5.0.1 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -6580,26 +6545,7 @@ snapshots: '@paulmillr/qr@0.2.1': {} - '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': - dependencies: - '@tanstack/react-query': 5.102.4(react@18.3.1) - '@vanilla-extract/css': 1.20.1 - '@vanilla-extract/dynamic': 2.1.5 - '@vanilla-extract/sprinkles': 1.6.5(@vanilla-extract/css@1.20.1) - clsx: 2.1.1 - cuer: 0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) - ua-parser-js: 2.0.10 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - transitivePeerDependencies: - - '@types/react' - - babel-plugin-macros - - typescript - - '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))': + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) '@vanilla-extract/css': 1.20.1 @@ -6611,8 +6557,8 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-remove-scroll: 2.7.2(@types/react@18.3.31)(react@18.3.1) ua-parser-js: 2.0.10 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - babel-plugin-macros @@ -6622,7 +6568,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -6633,7 +6579,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -6644,12 +6590,13 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + optional: true '@reown/appkit-controllers@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6657,7 +6604,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6692,7 +6639,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6720,6 +6667,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-pay@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6792,6 +6740,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-polyfills@1.7.8': dependencies: @@ -6870,6 +6819,7 @@ snapshots: - utf-8-validate - valtio - zod + optional: true '@reown/appkit-ui@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -6940,6 +6890,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-utils@1.7.8(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1))(zod@3.25.76)': dependencies: @@ -6950,7 +6901,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6988,7 +6939,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7016,6 +6967,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@reown/appkit-wallet@1.7.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: @@ -7042,7 +6994,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7085,7 +7037,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) bs58: 6.0.0 valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7113,6 +7065,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@rolldown/binding-android-arm-eabi@1.2.5': optional: true @@ -7298,11 +7251,12 @@ snapshots: - typescript - utf-8-validate - zod + optional: true '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) transitivePeerDependencies: - bufferutil - typescript @@ -7312,12 +7266,13 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - zod + optional: true '@safe-global/safe-gateway-typescript-sdk@3.23.1': {} @@ -8008,7 +7963,7 @@ snapshots: picocolors: 1.1.1 picomatch: 3.0.2 prettier: 3.9.6 - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zod: 4.4.3 optionalDependencies: typescript: 5.9.3 @@ -8016,76 +7971,19 @@ snapshots: - bufferutil - utf-8-validate - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': + '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76)': dependencies: '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@3.25.76) - '@gemini-wallet/core': 0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@gemini-wallet/core': 0.3.2(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/react-query' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - expo-auth-session - - expo-crypto - - expo-web-browser - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react - - react-native - - supports-color - - uploadthing - - use-sync-external-store - - utf-8-validate - - wagmi - - zod - - '@wagmi/connectors@6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3)': - dependencies: - '@base-org/account': 2.4.0(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) - '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) - '@gemini-wallet/core': 0.3.2(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - '@metamask/sdk': 0.33.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) - '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + porto: 0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8130,10 +8028,10 @@ snapshots: - wagmi - zod - '@wagmi/connectors@8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@wagmi/connectors@8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: - '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) optionalDependencies: '@coinbase/wallet-sdk': 4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) @@ -8141,11 +8039,11 @@ snapshots: '@walletconnect/ethereum-provider': 2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) typescript: 5.9.3 - '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': + '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.102.4 @@ -8156,26 +8054,11 @@ snapshots: - react - use-sync-external-store - '@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': + '@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.3) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) - zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - optionalDependencies: - '@tanstack/query-core': 5.102.4 - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/react' - - immer - - react - - use-sync-external-store - - '@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))': - dependencies: - eventemitter3: 5.0.1 - mipd: 0.0.7(typescript@5.9.3) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) zustand: 5.0.0(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.102.4 @@ -8273,6 +8156,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/core@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8361,6 +8245,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/environment@1.0.1': dependencies: @@ -8447,6 +8332,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/events@1.0.1': dependencies: @@ -8612,6 +8498,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/sign-client@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8684,6 +8571,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/time@1.0.2': dependencies: @@ -8826,6 +8714,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/universal-provider@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8906,6 +8795,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -8994,6 +8884,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: @@ -9082,6 +8973,7 @@ snapshots: - uploadthing - utf-8-validate - zod + optional: true '@walletconnect/window-getters@1.0.1': dependencies: @@ -9106,6 +8998,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 zod: 4.4.3 + optional: true abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): optionalDependencies: @@ -9389,9 +9282,9 @@ snapshots: confbox@0.1.8: {} - connectkit@1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): + connectkit@1.9.2(@babel/core@7.29.7)(@tanstack/react-query@5.102.4(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: - '@aave/account': 0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) + '@aave/account': 0.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)) '@tanstack/react-query': 5.102.4(react@18.3.1) buffer: 6.0.3 detect-browser: 5.3.0 @@ -9403,8 +9296,8 @@ snapshots: react-use-measure: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resize-observer-polyfill: 1.5.1 styled-components: 5.3.11(@babel/core@7.29.7)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@babel/core' - react-is @@ -10563,7 +10456,7 @@ snapshots: outdent@0.5.0: {} - ox@0.14.44(typescript@5.9.3)(zod@3.22.4): + ox@0.14.56(typescript@5.9.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -10578,7 +10471,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.14.44(typescript@5.9.3)(zod@3.25.76): + ox@0.14.56(typescript@5.9.3)(zod@3.25.76): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -10593,7 +10486,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.14.44(typescript@5.9.3)(zod@4.4.3): + ox@0.14.56(typescript@5.9.3)(zod@4.4.3): dependencies: '@adraffy/ens-normalize': 1.11.1 '@noble/ciphers': 1.3.0 @@ -10635,6 +10528,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod + optional: true ox@0.6.9(typescript@5.9.3)(zod@3.25.76): dependencies: @@ -10663,6 +10557,7 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - zod + optional: true ox@0.9.17(typescript@5.9.3)(zod@4.4.3): dependencies: @@ -10781,41 +10676,21 @@ snapshots: style-value-types: 5.0.0 tslib: 2.7.0 - porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): - dependencies: - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - hono: 4.13.8 - idb-keyval: 6.3.0 - mipd: 0.0.7(typescript@5.9.3) - ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - zod: 4.4.3 - zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) - optionalDependencies: - '@tanstack/react-query': 5.102.4(react@18.3.1) - react: 18.3.1 - typescript: 5.9.3 - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) - transitivePeerDependencies: - - '@types/react' - - immer - - use-sync-external-store - - porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3)): + porto@0.2.35(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76)): dependencies: - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) hono: 4.13.8 idb-keyval: 6.3.0 mipd: 0.0.7(typescript@5.9.3) ox: 0.9.17(typescript@5.9.3)(zod@4.4.3) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 4.4.3 zustand: 5.0.3(@types/react@18.3.31)(react@18.3.1)(use-sync-external-store@1.4.0(react@18.3.1)) optionalDependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) react: 18.3.1 typescript: 5.9.3 - wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3) + wagmi: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) transitivePeerDependencies: - '@types/react' - immer @@ -11491,8 +11366,9 @@ snapshots: - bufferutil - utf-8-validate - zod + optional: true - viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11500,7 +11376,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.2.3(typescript@5.9.3)(zod@3.22.4) isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.14.44(typescript@5.9.3)(zod@3.22.4) + ox: 0.14.56(typescript@5.9.3)(zod@3.22.4) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.3 @@ -11509,7 +11385,7 @@ snapshots: - utf-8-validate - zod - viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11517,7 +11393,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.2.3(typescript@5.9.3)(zod@3.25.76) isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.14.44(typescript@5.9.3)(zod@3.25.76) + ox: 0.14.56(typescript@5.9.3)(zod@3.25.76) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.3 @@ -11526,7 +11402,7 @@ snapshots: - utf-8-validate - zod - viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): + viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -11534,7 +11410,7 @@ snapshots: '@scure/bip39': 1.6.0 abitype: 1.2.3(typescript@5.9.3)(zod@4.4.3) isows: 1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)) - ox: 0.14.44(typescript@5.9.3)(zod@4.4.3) + ox: 0.14.56(typescript@5.9.3)(zod@4.4.3) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) optionalDependencies: typescript: 5.9.3 @@ -11650,63 +11526,14 @@ snapshots: xml-name-validator: 5.0.0 optional: true - wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): - dependencies: - '@tanstack/react-query': 5.102.4(react@18.3.1) - '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) - react: 18.3.1 - use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@capacitor/preferences' - - '@deno/kv' - - '@netlify/blobs' - - '@planetscale/database' - - '@react-native-async-storage/async-storage' - - '@tanstack/query-core' - - '@types/react' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@x402/core' - - '@x402/evm' - - '@x402/extensions' - - '@x402/svm' - - aws4fetch - - bufferutil - - db0 - - debug - - encoding - - expo-auth-session - - expo-crypto - - expo-web-browser - - fastestsmallesttextencoderdecoder - - immer - - ioredis - - react-native - - supports-color - - uploadthing - - utf-8-validate - - zod - - wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3): + wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76): dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) - '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(zod@4.4.3))(zod@4.4.3) - '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/connectors': 6.2.0(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@wagmi/core@2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)))(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))(zod@3.25.76) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -11748,14 +11575,14 @@ snapshots: - utf-8-validate - zod - wagmi@3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)): + wagmi@3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)): dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) - '@wagmi/connectors': 8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) - '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/connectors': 8.2.0(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@wagmi/core@3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)))(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) + '@wagmi/core': 3.6.5(@tanstack/query-core@5.102.4)(@types/react@18.3.31)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) react: 18.3.1 use-sync-external-store: 1.4.0(react@18.3.1) - viem: 2.56.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) + viem: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: From 94a55d0dac21af4c0b904e993633b659c78ffe53 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 14 Oct 2026 15:30:04 -0700 Subject: [PATCH 24/30] set window.tokenboundSDK from the ethers client; fix implementation labels On main, ethers users went through the single TokenboundClient, which stamps `window.tokenboundSDK` with the SDK version and implementation so the running build can be identified from a browser console. The split @tokenbound/ethers client never set it. It now does, tagged "(ethers)" because its version number is separate from @tokenbound/sdk's. getImplementationName compared addresses with `===` against checksummed constants, so a lowercase default address was labelled as a custom implementation. It now checksums its input first. Cosmetic only: resolveDeployment already compared case-insensitively. getImplementationName is now exported from @tokenbound/sdk, so the ethers client reuses the same table of known implementations. Co-Authored-By: Claude Opus 5.5 --- packages/ethers/src/TokenboundClient.ts | 16 +++++++++ packages/sdk/src/TokenboundClient.ts | 2 ++ packages/sdk/src/index.ts | 1 + .../test/unit/getImplementationName.test.ts | 33 +++++++++++++++++++ .../sdk/src/utils/getImplementationName.ts | 11 +++++-- 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 packages/sdk/src/test/unit/getImplementationName.test.ts diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts index 5766ae3..cfe0024 100644 --- a/packages/ethers/src/TokenboundClient.ts +++ b/packages/ethers/src/TokenboundClient.ts @@ -21,6 +21,7 @@ import { encodeNFTTransfer, type GetAccountParams, getAccountAddress, + getImplementationName, hasBytecode, type MultiCallTx, type NFTTransferParams, @@ -68,6 +69,14 @@ export type { NFTTransferParams, } +// The constructor stamps `window.tokenboundSDK` with the SDK version and the +// account implementation in use so the running build can be identified from a browser console. +declare global { + interface Window { + tokenboundSDK?: string + } +} + export class TokenboundClient { private chain: Chain public isInitialized = false @@ -102,6 +111,13 @@ export class TokenboundClient { version, }) + if (typeof window !== "undefined") { + // "(ethers)" distinguishes this package: its version number is separate + // from @tokenbound/sdk's, so a bare "Tokenbound SDK 0.1.0" would read as + // an old release of the viem SDK. + window.tokenboundSDK = `Tokenbound SDK ${TB_ETHERS_VERSION} (ethers) - ${getImplementationName(implementationAddress)}` + } + this.isInitialized = true } diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index 5af1541..fa6e32f 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -54,6 +54,8 @@ import { type ProtocolDeploymentStatus, } from "./viem/actions" +// The constructor stamps `window.tokenboundSDK` with the SDK version and the +// account implementation in use so the running build can be identified from a browser console. declare global { interface Window { tokenboundSDK?: string diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 3d079e5..637a58e 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -75,3 +75,4 @@ export type { ValidSignerParams, } from "./types" export { CALL_OPERATIONS, TBVersion } from "./types" +export { getImplementationName } from "./utils/getImplementationName" diff --git a/packages/sdk/src/test/unit/getImplementationName.test.ts b/packages/sdk/src/test/unit/getImplementationName.test.ts new file mode 100644 index 0000000..c93bcd2 --- /dev/null +++ b/packages/sdk/src/test/unit/getImplementationName.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from "vitest" +import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../../protocol/constants" +import { getImplementationName } from "../../utils/getImplementationName" + +const LEGACY = ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS +const V3_PROXY = ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS as `0x${string}` +const CUSTOM = "0x000000000000000000000000000000000000d00d" as const + +describe("getImplementationName", () => { + it("labels the default when no address is given", () => { + expect(getImplementationName()).toBe("Implementation: Default V3") + }) + + it("recognizes the known implementations", () => { + expect(getImplementationName(LEGACY)).toBe("Implementation: Default V1") + expect(getImplementationName(V3_PROXY)).toBe("Implementation: Default V3") + }) + + it("recognizes them regardless of letter case", () => { + expect(getImplementationName(LEGACY.toLowerCase() as `0x${string}`)).toBe( + "Implementation: Default V1", + ) + expect(getImplementationName(V3_PROXY.toLowerCase() as `0x${string}`)).toBe( + "Implementation: Default V3", + ) + }) + + it("labels anything else as custom, checksummed", () => { + expect(getImplementationName(CUSTOM)).toBe( + "Custom Implementation: 0x000000000000000000000000000000000000D00d", + ) + }) +}) diff --git a/packages/sdk/src/utils/getImplementationName.ts b/packages/sdk/src/utils/getImplementationName.ts index 4e4c2bf..531b7d7 100644 --- a/packages/sdk/src/utils/getImplementationName.ts +++ b/packages/sdk/src/utils/getImplementationName.ts @@ -1,15 +1,20 @@ +import { getAddress } from "viem" import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../protocol/constants" export function getImplementationName( implementationAddress?: `0x${string}`, ): string { - switch (implementationAddress) { + if (!implementationAddress) return "Implementation: Default V3" + + // Checksum for case-insensitive comparison + const address = getAddress(implementationAddress) + + switch (address) { case ERC_6551_LEGACY_V2.IMPLEMENTATION.ADDRESS: return "Implementation: Default V1" case ERC_6551_DEFAULT.ACCOUNT_PROXY?.ADDRESS: - case undefined: return "Implementation: Default V3" default: - return `Custom Implementation: ${implementationAddress}` + return `Custom Implementation: ${address}` } } From 048b45c0e936e559f0a206ab99437836706d0ce2 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Wed, 14 Oct 2026 15:31:23 -0700 Subject: [PATCH 25/30] ignore Vite's leftover config temp files Vite compiles vite.config.ts to a temporary vite.config.ts.timestamp--.mjs, loads it, then deletes it. An interrupted build skips the cleanup and leaves the file behind, where a broad `git add` would commit it. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 04ef140..bdb09b4 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,6 @@ dist-ssr /cache /out /.vscode + +# Vite leaves these behind when a build is interrupted mid-config-load +*.timestamp-*.mjs From 9b93b44eae850e33d688af646e8e7de790e6f863 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 19 Oct 2026 13:03:13 -0700 Subject: [PATCH 26/30] Add end-to-end cross-chain test --- .../sdk/src/test/crossChainDelivery.test.ts | 264 ++++++++++++++++++ packages/test-fixtures/src/anvil.ts | 24 ++ packages/test-fixtures/src/index.ts | 1 + packages/test-fixtures/src/layerzero.ts | 228 +++++++++++++++ 4 files changed, 517 insertions(+) create mode 100644 packages/sdk/src/test/crossChainDelivery.test.ts create mode 100644 packages/test-fixtures/src/layerzero.ts diff --git a/packages/sdk/src/test/crossChainDelivery.test.ts b/packages/sdk/src/test/crossChainDelivery.test.ts new file mode 100644 index 0000000..8268fb6 --- /dev/null +++ b/packages/sdk/src/test/crossChainDelivery.test.ts @@ -0,0 +1,264 @@ +// Cross-chain execution, sent on one fork and delivered on another. +// +// crossChain.test.ts proves the origin transaction is encoded and funded +// correctly. This suite goes further: it sends that transaction on a mainnet +// fork, takes the packet LayerZero would carry, and delivers it on a Base fork, +// asserting the call actually runs there. +// +// Both forks run the real deployed contracts locally; the relay between them is +// simulated (see test-fixtures/src/layerzero.ts), standing in for LayerZero's +// off-chain verifiers (DVNs) and executor. +// +// What passing proves: everything on-chain on both sides works — LayerZero's +// endpoint accepting the fee and the packet, Tokenbound's executor decoding it, +// the account guardian trusting that executor on Base, the account executing +// the call, and the SDK's 200,000 gas covering it. +// +// What it does not prove: that LayerZero will deliver in production. The +// simulated relay acts as the receive library, skipping the DVN attestations +// and the library's quorum check, so a missing or broken DVN configuration for +// this route would pass here and fail for real. Confirmation timing and +// LayerZero's off-chain services are untested too. + +import { + ANVIL_ACCOUNTS, + bytes32ToAddress, + createBaseForkInstance, + createForkInstance, + deliverPacket, + findSentPacket, + isAddressMatch, + type LayerZeroPacket, + pollForReceipt, + RECIPIENT_ADDRESS, + zora721, +} from "@tokenbound/test-fixtures" +import { + type Address, + createPublicClient, + createTestClient, + createWalletClient, + decodeAbiParameters, + decodeFunctionData, + encodeFunctionData, + type Hex, + http, + type PublicClient, + parseEther, + type TestClient, + type TransactionReceipt, + type WalletClient, +} from "viem" +import { privateKeyToAccount } from "viem/accounts" +import { base, mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../" +import { ERC_6551_DEFAULT, LZ_EIDS, LZ_EXECUTORS } from "../protocol/constants" + +const TIMEOUT = 120_000 + +/** The ETH the account sends on the destination chain. */ +const TRANSFER = parseEther("0.001") + +/** + * The gas LayerZero's executor forwards on delivery. Must match the + * `addExecutorLzReceiveOption(200000, 0)` options the SDK sends, so that a + * passing delivery shows the SDK requests enough. + */ +const EXECUTOR_GAS = 200_000n + +describe("cross-chain execution, delivered end to end (mainnet → Base)", () => { + const originFork = createForkInstance() + const destinationFork = createBaseForkInstance() + const eoa = privateKeyToAccount(ANVIL_ACCOUNTS[0].privateKey) + + let originPublic: PublicClient + let destinationPublic: PublicClient + let destinationTest: TestClient + let originClient: TokenboundClient + + /** The tokenbound account — one address, deployed on both chains. */ + let account: Address + let originReceipt: TransactionReceipt + let packet: LayerZeroPacket + + beforeAll(async () => { + await Promise.all([originFork.start(), destinationFork.start()]) + + originPublic = createPublicClient({ + chain: mainnet, + transport: http(originFork.url), + }) as PublicClient + destinationPublic = createPublicClient({ + chain: base, + transport: http(destinationFork.url), + }) as PublicClient + destinationTest = createTestClient({ + chain: base, + mode: "anvil", + transport: http(destinationFork.url), + }) + + const originWallet = createWalletClient({ + chain: mainnet, + account: eoa, + transport: http(originFork.url), + }) as WalletClient + const destinationWallet = createWalletClient({ + chain: base, + account: eoa, + transport: http(destinationFork.url), + }) as WalletClient + + originClient = new TokenboundClient({ + chain: mainnet, + walletClient: originWallet, + publicClient: originPublic, + }) + const destinationClient = new TokenboundClient({ + chain: base, + walletClient: destinationWallet, + publicClient: destinationPublic, + }) + + // The NFT lives on mainnet, so the account is defined by it there. + const mintHash = await originWallet.sendTransaction({ + account: eoa, + chain: mainnet, + to: zora721.proxyContractAddress, + value: zora721.mintPrice, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [1n], + }), + }) + const mint = await pollForReceipt(originPublic, mintHash) + const transferLog = mint.logs.find( + (log) => + isAddressMatch(log.address, zora721.proxyContractAddress) && + log.topics.length === 4, + ) + if (!transferLog?.topics[3]) { + throw new Error("Could not determine the minted tokenId") + } + const nft = { + tokenContract: zora721.proxyContractAddress, + tokenId: BigInt(transferLog.topics[3]).toString(), + } + + // The account must exist on both chains. On Base it is created for the + // mainnet NFT (chainId 1), which is what makes the address identical. + const created = await originClient.createAccount(nft) + await pollForReceipt(originPublic, created.txHash) + account = created.account + + const mirrored = await destinationClient.createAccount({ + ...nft, + chainId: mainnet.id, + }) + await pollForReceipt(destinationPublic, mirrored.txHash) + if (mirrored.account !== account) { + throw new Error( + `Account addresses differ across chains: ${account} vs ${mirrored.account}`, + ) + } + + // The destination call spends the account's Base balance: the LayerZero + // executor forwards no ETH. + const fundHash = await destinationWallet.sendTransaction({ + account: eoa, + chain: base, + to: account, + value: TRANSFER, + }) + await pollForReceipt(destinationPublic, fundHash) + + // The call under test: execute on Base, from mainnet. + const sendHash = await originClient.execute({ + account, + to: RECIPIENT_ADDRESS, + value: TRANSFER, + data: "0x", + chainId: base.id, + }) + originReceipt = await pollForReceipt(originPublic, sendHash) + packet = findSentPacket(originReceipt) + }, TIMEOUT) + + afterAll(async () => { + await Promise.all([originFork.stop(), destinationFork.stop()]) + }) + + it("sends through LayerZero on the origin chain", () => { + // A send with too small a fee reverts in LayerZero's endpoint, so a + // successful transaction also shows the quoted fee was enough. + expect(originReceipt.status).toBe("success") + + expect(packet.srcEid).toBe(LZ_EIDS[mainnet.id]) + expect(packet.dstEid).toBe(LZ_EIDS[base.id]) + // Tokenbound's executor is its own peer on every chain. + expect( + isAddressMatch(bytes32ToAddress(packet.sender), LZ_EXECUTORS[mainnet.id]), + ).toBe(true) + expect( + isAddressMatch(bytes32ToAddress(packet.receiver), LZ_EXECUTORS[base.id]), + ).toBe(true) + }) + + it("carries the account's execute() call as the message", () => { + const [sender, payload] = decodeAbiParameters( + [{ type: "address" }, { type: "bytes" }], + packet.message, + ) + // The executor calls `sender` on the destination, so this must be the + // account, not the user's wallet. + expect(isAddressMatch(sender, account)).toBe(true) + + const call = decodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + data: payload as Hex, + }) + expect(call.functionName).toBe("execute") + const [to, value, data, operation] = call.args as [ + Address, + bigint, + Hex, + number, + ] + expect(isAddressMatch(to, RECIPIENT_ADDRESS)).toBe(true) + expect(value).toBe(TRANSFER) + expect(data).toBe("0x") + expect(operation).toBe(0) + }) + + it( + "delivers on the destination and runs the call, within the executor gas", + async () => { + const [recipientBefore, accountBefore] = await Promise.all([ + destinationPublic.getBalance({ address: RECIPIENT_ADDRESS }), + destinationPublic.getBalance({ address: account }), + ]) + + const delivery = await deliverPacket({ + packet, + publicClient: destinationPublic, + testClient: destinationTest, + rpcUrl: destinationFork.url, + gasLimit: EXECUTOR_GAS, + }) + // Succeeding within EXECUTOR_GAS shows the gas the SDK requests is + // enough for this call. The account accepting the executor at all + // shows the guardian trusts it on Base. + expect(delivery.status).toBe("success") + + const [recipientAfter, accountAfter] = await Promise.all([ + destinationPublic.getBalance({ address: RECIPIENT_ADDRESS }), + destinationPublic.getBalance({ address: account }), + ]) + expect(recipientAfter - recipientBefore).toBe(TRANSFER) + expect(accountBefore - accountAfter).toBe(TRANSFER) + }, + TIMEOUT, + ) +}) diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts index f457836..5feb1ea 100644 --- a/packages/test-fixtures/src/anvil.ts +++ b/packages/test-fixtures/src/anvil.ts @@ -92,3 +92,27 @@ export function createForkInstance() { { timeout: ANVIL_CONFIG.TIMEOUT }, ) } + +/** + * Base fork endpoint for the cross-chain delivery suite, which needs a second + * chain to receive LayerZero messages on. Same rules as FORK_URL: an empty value + * falls back, and the fallback must serve historical state — more so on Base, + * whose ~2s blocks age a fork point out of a pruning node within a minute. + * + * Base's official RPC rather than drpc: drpc's free tier rate-limits (HTTP 429) + * under the repeated forking these suites do. + */ +export const BASE_FORK_URL = + process.env.VITE_ANVIL_BASE_FORK_ENDPOINT?.trim() || + "https://mainnet.base.org" + +/** + * A fresh Base fork, on its own port so it can run alongside the mainnet fork. + * Always forks from the head: FORK_BLOCK_NUMBER is a mainnet block number. + */ +export function createBaseForkInstance() { + return Instance.anvil( + { host: "127.0.0.1", port: 8546, forkUrl: BASE_FORK_URL }, + { timeout: ANVIL_CONFIG.TIMEOUT }, + ) +} diff --git a/packages/test-fixtures/src/index.ts b/packages/test-fixtures/src/index.ts index 6883388..ea7c103 100644 --- a/packages/test-fixtures/src/index.ts +++ b/packages/test-fixtures/src/index.ts @@ -9,4 +9,5 @@ export * from "./anvil" export * from "./fixtures" +export * from "./layerzero" export * from "./mints" diff --git a/packages/test-fixtures/src/layerzero.ts b/packages/test-fixtures/src/layerzero.ts new file mode 100644 index 0000000..ec3ece7 --- /dev/null +++ b/packages/test-fixtures/src/layerzero.ts @@ -0,0 +1,228 @@ +// Simulated LayerZero V2 delivery between two forks. +// +// The forks are local anvil processes running the real deployed contracts +// against real chain state; nothing is broadcast to a live network. Two forks +// cannot see each other, and in production LayerZero is what connects them: +// +// 1. Verification: off-chain DVNs watch the origin chain for PacketSent and +// attest to it on the destination's receive library, which then calls +// `endpoint.verify` once enough of them agree. +// 2. Execution: LayerZero's off-chain executor calls `endpoint.lzReceive` +// with the gas the sender paid for. +// +// This module stands in for both. It carries the packet bytes across from the +// origin receipt, impersonates the receive library to call `verify` directly, +// then calls the permissionless `lzReceive` under the sender's gas limit. +// +// Acting as the receive library skips the DVN attestations and the library's +// quorum check, so delivery here says nothing about whether LayerZero itself +// would deliver. What that leaves proven is described where it is relied on, +// in packages/sdk/src/test/crossChainDelivery.test.ts. + +import { + type Address, + concatHex, + createWalletClient, + decodeEventLog, + encodeFunctionData, + type Hex, + hexToBigInt, + hexToNumber, + http, + keccak256, + type PublicClient, + parseAbi, + sliceHex, + type TestClient, + type TransactionReceipt, +} from "viem" + +/** EndpointV2, deployed at the same address on every chain this suite forks. */ +export const LAYERZERO_ENDPOINT_V2: Address = + "0x1a44076050125825900e736c501f859c50fE728c" + +export const layerZeroEndpointAbi = parseAbi([ + "event PacketSent(bytes encodedPayload, bytes options, address sendLibrary)", + "struct Origin { uint32 srcEid; bytes32 sender; uint64 nonce; }", + "function getReceiveLibrary(address receiver, uint32 srcEid) view returns (address lib, bool isDefault)", + "function inboundNonce(address receiver, uint32 srcEid, bytes32 sender) view returns (uint64)", + "function verify(Origin origin, address receiver, bytes32 payloadHash)", + "function lzReceive(Origin origin, address receiver, bytes32 guid, bytes message, bytes extraData) payable", +]) + +/** A LayerZero V2 packet (PacketV1Codec layout). */ +export type LayerZeroPacket = { + nonce: bigint + srcEid: number + /** The sending OApp, left-padded to 32 bytes. */ + sender: Hex + dstEid: number + /** The receiving OApp, left-padded to 32 bytes. */ + receiver: Hex + guid: Hex + message: Hex +} + +/** + * Decodes PacketV1Codec bytes: version (1) · nonce (8) · srcEid (4) · + * sender (32) · dstEid (4) · receiver (32) · guid (32) · message (rest). + */ +export function decodePacket(encoded: Hex): LayerZeroPacket { + return { + nonce: hexToBigInt(sliceHex(encoded, 1, 9)), + srcEid: hexToNumber(sliceHex(encoded, 9, 13)), + sender: sliceHex(encoded, 13, 45), + dstEid: hexToNumber(sliceHex(encoded, 45, 49)), + receiver: sliceHex(encoded, 49, 81), + guid: sliceHex(encoded, 81, 113), + message: sliceHex(encoded, 113), + } +} + +/** Finds the packet an origin-chain transaction handed to LayerZero. */ +export function findSentPacket(receipt: TransactionReceipt): LayerZeroPacket { + for (const log of receipt.logs) { + if (log.address.toLowerCase() !== LAYERZERO_ENDPOINT_V2.toLowerCase()) { + continue + } + try { + const event = decodeEventLog({ + abi: layerZeroEndpointAbi, + data: log.data, + topics: log.topics, + }) + if (event.eventName === "PacketSent") { + return decodePacket(event.args.encodedPayload) + } + } catch { + // Another endpoint event; keep looking. + } + } + throw new Error( + `Transaction ${receipt.transactionHash} sent no LayerZero packet`, + ) +} + +/** Intrinsic gas for a plain call: the base cost plus calldata (EIP-2028). */ +function intrinsicGas(data: Hex): bigint { + let cost = 21000n + for (let i = 2; i < data.length; i += 2) { + cost += data.slice(i, i + 2) === "00" ? 4n : 16n + } + return cost +} + +/** Truncates a 32-byte LayerZero address back to its 20-byte form. */ +export const bytes32ToAddress = (value: Hex): Address => + `0x${value.slice(-40)}` as Address + +/** + * Delivers a packet on the destination fork the way LayerZero would: verify it + * as the trusted receive library, then call `lzReceive`. + * + * `gasLimit` caps the gas available to `lzReceive` execution, mirroring the + * gas the sender requested in its executor options — LayerZero's executor + * forwards exactly that much when it delivers. + * + * @returns the delivery transaction's receipt. + */ +export async function deliverPacket(params: { + packet: LayerZeroPacket + publicClient: PublicClient + testClient: TestClient + rpcUrl: string + gasLimit: bigint +}): Promise { + const { packet, publicClient, testClient, rpcUrl, gasLimit } = params + const receiver = bytes32ToAddress(packet.receiver) + const origin = { + srcEid: packet.srcEid, + sender: packet.sender, + nonce: packet.nonce, + } + + // LayerZero delivers each path in order. If the fork caught a real message + // in flight, ours cannot be delivered until that one is — say so plainly + // rather than surface the endpoint's nonce revert. + const inbound = await publicClient.readContract({ + address: LAYERZERO_ENDPOINT_V2, + abi: layerZeroEndpointAbi, + functionName: "inboundNonce", + args: [receiver, packet.srcEid, packet.sender], + }) + if (inbound !== packet.nonce - 1n) { + throw new Error( + `Cannot deliver nonce ${packet.nonce}: the destination has delivered up to ${inbound}, so ${packet.nonce - 1n - inbound} real message(s) on this path were in flight when the forks were taken. Re-run to fork a later block.`, + ) + } + + const [receiveLibrary] = await publicClient.readContract({ + address: LAYERZERO_ENDPOINT_V2, + abi: layerZeroEndpointAbi, + functionName: "getReceiveLibrary", + args: [receiver, packet.srcEid], + }) + + await testClient.impersonateAccount({ address: receiveLibrary }) + await testClient.setBalance({ address: receiveLibrary, value: 10n ** 18n }) + + // No local account: anvil signs for the impersonated address. + const asLibrary = createWalletClient({ + chain: publicClient.chain, + transport: http(rpcUrl), + }) + + const verifyHash = await asLibrary.writeContract({ + account: receiveLibrary, + chain: publicClient.chain, + address: LAYERZERO_ENDPOINT_V2, + abi: layerZeroEndpointAbi, + functionName: "verify", + args: [ + origin, + receiver, + keccak256(concatHex([packet.guid, packet.message])), + ], + }) + await pollForReceipt(publicClient, verifyHash) + + // lzReceive is permissionless once verified; any caller works. + const data = encodeFunctionData({ + abi: layerZeroEndpointAbi, + functionName: "lzReceive", + args: [origin, receiver, packet.guid, packet.message, "0x"], + }) + const deliverHash = await asLibrary.sendTransaction({ + account: receiveLibrary, + chain: publicClient.chain, + to: LAYERZERO_ENDPOINT_V2, + data, + // A transaction's gas limit also pays its intrinsic cost; add it so + // `gasLimit` is what execution actually gets. + gas: intrinsicGas(data) + gasLimit, + }) + const receipt = await pollForReceipt(publicClient, deliverHash) + + await testClient.stopImpersonatingAccount({ address: receiveLibrary }) + return receipt +} + +/** + * Polls for a receipt. viem's waitForTransactionReceipt relies on a block + * watcher that does not reliably observe anvil's blocks, and stalls. + */ +export async function pollForReceipt( + publicClient: PublicClient, + hash: Hex, + timeoutMs = 30000, +): Promise { + const deadline = Date.now() + timeoutMs + while (Date.now() < deadline) { + try { + return await publicClient.getTransactionReceipt({ hash }) + } catch { + await new Promise((r) => setTimeout(r, 200)) + } + } + throw new Error(`Transaction ${hash} was not mined within ${timeoutMs}ms`) +} From 8f7c246beb0a02b289e3ca27ae9413a2af4feb7b Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 19 Oct 2026 22:59:21 -0700 Subject: [PATCH 27/30] make viem a peer dependency and build with tsdown The SDK installed its own viem, so apps on a different viem version got a second copy and cross-copy type errors. viem is now a ^2.57.7 peer of both packages. viem, TypeScript, vite, vitest, tsdown and Biome are pinned once in a pnpm catalog; the workspace moves to Vite 5. require() consumers were given ESM declarations. tsdown emits .d.ts/.d.cts next to .js/.cjs, replacing vite lib mode and vite-plugin-dts. Also: ethers ships plain CJS instead of UMD, source maps are dropped, and typesVersions lets moduleResolution "node" resolve the ./viem and ./protocol subpaths. Co-Authored-By: Claude Opus 5.5 --- examples/vite-wagmi-ethers/package.json | 8 +- examples/vite-wagmi-ethers6/package.json | 8 +- examples/vite-wagmi-viem/package.json | 8 +- examples/vite-wagmi3-viem/package.json | 8 +- package.json | 4 +- packages/ethers/package.json | 33 +- packages/ethers/tsdown.config.ts | 11 + packages/ethers/vite.config.ts | 31 - packages/sdk/package.json | 66 +- packages/sdk/tsdown.config.ts | 33 + packages/sdk/vite.config.ts | 67 - packages/test-fixtures/package.json | 2 +- pnpm-lock.yaml | 1440 ++++++++-------------- pnpm-workspace.yaml | 11 +- 14 files changed, 626 insertions(+), 1104 deletions(-) create mode 100644 packages/ethers/tsdown.config.ts delete mode 100644 packages/ethers/vite.config.ts create mode 100644 packages/sdk/tsdown.config.ts delete mode 100644 packages/sdk/vite.config.ts diff --git a/examples/vite-wagmi-ethers/package.json b/examples/vite-wagmi-ethers/package.json index 3c9350d..53ecd0c 100644 --- a/examples/vite-wagmi-ethers/package.json +++ b/examples/vite-wagmi-ethers/package.json @@ -19,15 +19,15 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.57.7", + "viem": "catalog:", "wagmi": "^2.19.5" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "catalog:", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^5.4.21" + "typescript": "catalog:", + "vite": "catalog:" } } diff --git a/examples/vite-wagmi-ethers6/package.json b/examples/vite-wagmi-ethers6/package.json index 15ddd25..d8dc0ba 100644 --- a/examples/vite-wagmi-ethers6/package.json +++ b/examples/vite-wagmi-ethers6/package.json @@ -18,15 +18,15 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.57.7", + "viem": "catalog:", "wagmi": "^2.19.5" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "catalog:", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^5.4.21" + "typescript": "catalog:", + "vite": "catalog:" } } diff --git a/examples/vite-wagmi-viem/package.json b/examples/vite-wagmi-viem/package.json index 5da380c..98a63bd 100644 --- a/examples/vite-wagmi-viem/package.json +++ b/examples/vite-wagmi-viem/package.json @@ -17,15 +17,15 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.57.7", + "viem": "catalog:", "wagmi": "^2.19.5" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "catalog:", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^5.4.21" + "typescript": "catalog:", + "vite": "catalog:" } } diff --git a/examples/vite-wagmi3-viem/package.json b/examples/vite-wagmi3-viem/package.json index 700fc7b..2d4a762 100644 --- a/examples/vite-wagmi3-viem/package.json +++ b/examples/vite-wagmi3-viem/package.json @@ -16,15 +16,15 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "util": "^0.12.5", - "viem": "^2.57.7", + "viem": "catalog:", "wagmi": "^3.7.7" }, "devDependencies": { - "@biomejs/biome": "2.5.13", + "@biomejs/biome": "catalog:", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@vitejs/plugin-react": "^4.0.4", - "typescript": "^5.2.2", - "vite": "^5.4.21" + "typescript": "catalog:", + "vite": "catalog:" } } diff --git a/package.json b/package.json index 9f15f40..71ff457 100644 --- a/package.json +++ b/package.json @@ -21,10 +21,10 @@ "author": "", "license": "ISC", "devDependencies": { - "@biomejs/biome": "2.5.14", + "@biomejs/biome": "catalog:", "@changesets/cli": "^2.26.2", "husky": "^8.0.3", - "typescript": "^5.6.3" + "typescript": "catalog:" }, "pnpm": { "overrides": { diff --git a/packages/ethers/package.json b/packages/ethers/package.json index ff6fc76..906b9d0 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -25,19 +25,24 @@ "files": [ "dist" ], - "types": "./dist/src/index.d.ts", - "main": "./dist/tokenbound-ethers.umd.cjs", - "module": "./dist/tokenbound-ethers.js", + "types": "./dist/index.d.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", "exports": { ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/tokenbound-ethers.js", - "require": "./dist/tokenbound-ethers.umd.cjs" + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } }, "./package.json": "./package.json" }, "scripts": { - "build": "tsc --noEmit && vite build", + "build": "tsc --noEmit && tsdown", "test": "pnpm typecheck && pnpm test:versions && pnpm test:fixtures && pnpm test:crosschain && pnpm test:all && pnpm test:v2", "clean": "rm -rf node_modules/ dist/", "lint": "biome lint .", @@ -54,17 +59,17 @@ }, "peerDependencies": { "ethers": "^5.7.2 || ^6.0.0", - "viem": "~2.57.7" + "viem": "^2.57.7" }, "devDependencies": { - "@biomejs/biome": "2.5.14", + "@biomejs/biome": "catalog:", "@tokenbound/test-fixtures": "workspace:*", "ethers": "^5.8.0", "ethers6": "npm:ethers@^6.17.0", - "typescript": "^5.6.3", - "viem": "~2.57.7", - "vite": "^4.4.9", - "vite-plugin-dts": "^3.9.0", - "vitest": "^1.6.1" + "tsdown": "catalog:", + "typescript": "catalog:", + "viem": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" } } diff --git a/packages/ethers/tsdown.config.ts b/packages/ethers/tsdown.config.ts new file mode 100644 index 0000000..2fdc49b --- /dev/null +++ b/packages/ethers/tsdown.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "tsdown" + +// Emits ESM (.js) and CJS (.cjs), each with its own bundled declarations +// (.d.ts / .d.cts). ethers, viem and the core SDK are all consumer-supplied +// (peer dependencies or dependencies), so they stay external. +export default defineConfig({ + entry: { index: "src/index.ts" }, + format: ["esm", "cjs"], + platform: "neutral", + dts: true, +}) diff --git a/packages/ethers/vite.config.ts b/packages/ethers/vite.config.ts deleted file mode 100644 index 3f077ff..0000000 --- a/packages/ethers/vite.config.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { resolve } from "node:path" -import { defineConfig } from "vite" -import dts from "vite-plugin-dts" - -export default defineConfig({ - build: { - lib: { - entry: resolve(__dirname, "src/index.ts"), - name: "tokenbound-ethers", - fileName: "tokenbound-ethers", - }, - sourcemap: true, - rollupOptions: { - // ethers, viem and the core SDK are all consumer-supplied. - external: ["viem", "viem/utils", "viem/ens", "ethers", "@tokenbound/sdk"], - output: { - globals: { - viem: "viem", - ethers: "ethers", - "@tokenbound/sdk": "tokenboundSDK", - }, - }, - }, - }, - plugins: [ - dts({ - // Never emit declarations for tests. - exclude: ["src/test/**", "src/**/*.test.ts", "src/**/*.spec.ts"], - }), - ], -}) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 168abea..b6d8cba 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -25,31 +25,54 @@ "files": [ "dist" ], - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", + "typesVersions": { + "*": { + "viem": [ + "./dist/viem.d.ts" + ], + "protocol": [ + "./dist/protocol.d.ts" + ] + } + }, "main": "./dist/index.cjs", "module": "./dist/index.js", "exports": { ".": { - "types": "./dist/src/index.d.ts", - "import": "./dist/index.js", - "require": "./dist/index.cjs" + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } }, "./viem": { - "types": "./dist/src/viem/index.d.ts", - "import": "./dist/viem.js", - "require": "./dist/viem.cjs" + "import": { + "types": "./dist/viem.d.ts", + "default": "./dist/viem.js" + }, + "require": { + "types": "./dist/viem.d.cts", + "default": "./dist/viem.cjs" + } }, "./protocol": { - "types": "./dist/src/protocol/index.d.ts", - "import": "./dist/protocol.js", - "require": "./dist/protocol.cjs" + "import": { + "types": "./dist/protocol.d.ts", + "default": "./dist/protocol.js" + }, + "require": { + "types": "./dist/protocol.d.cts", + "default": "./dist/protocol.cjs" + } }, "./package.json": "./package.json" }, "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "preview": "vite preview", + "build": "tsc && tsdown", "test": "pnpm typecheck && vitest --watch=false", "coverage": "vitest run --coverage", "clean": "rm -rf node_modules/ dist/", @@ -62,18 +85,21 @@ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json" }, "dependencies": { - "@layerzerolabs/lz-v2-utilities": "^3.0.168", - "viem": "~2.57.7" + "@layerzerolabs/lz-v2-utilities": "^3.0.168" }, "devDependencies": { - "@biomejs/biome": "2.5.14", + "@biomejs/biome": "catalog:", "@tokenbound/test-fixtures": "workspace:*", "@vitest/coverage-v8": "^1.6.1", "@wagmi/cli": "^2.10.0", "rollup-plugin-visualizer": "^5.12.0", - "typescript": "^5.4.5", - "vite": "^4.4.9", - "vite-plugin-dts": "^3.9.0", - "vitest": "^1.6.0" + "tsdown": "catalog:", + "typescript": "catalog:", + "viem": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + }, + "peerDependencies": { + "viem": "^2.57.7" } } diff --git a/packages/sdk/tsdown.config.ts b/packages/sdk/tsdown.config.ts new file mode 100644 index 0000000..73ea978 --- /dev/null +++ b/packages/sdk/tsdown.config.ts @@ -0,0 +1,33 @@ +import { defineConfig, type UserConfig } from "tsdown" + +// Bundle analysis is opt-in: `ANALYZE=true pnpm build`. +// Output is written outside dist/ so it can never be published. +const analyzePlugins = async (): Promise => { + if (!process.env.ANALYZE) return [] + const { visualizer } = await import("rollup-plugin-visualizer") + return [ + visualizer({ + open: true, + template: "treemap", + filename: "./analysis/stats.html", + gzipSize: true, + brotliSize: true, + }), + ] +} + +// Emits ESM (.js) and CJS (.cjs), each with its own bundled declarations +// (.d.ts / .d.cts), so `import` and `require` consumers both get types that +// match the code they load. Dependencies and peer dependencies (viem, the +// LayerZero utilities) stay external. +export default defineConfig(async () => ({ + entry: { + index: "src/index.ts", + viem: "src/viem/index.ts", + protocol: "src/protocol/index.ts", + }, + format: ["esm", "cjs"], + platform: "neutral", + dts: true, + plugins: await analyzePlugins(), +})) diff --git a/packages/sdk/vite.config.ts b/packages/sdk/vite.config.ts deleted file mode 100644 index 64b1172..0000000 --- a/packages/sdk/vite.config.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { resolve } from "node:path" -import { defineConfig, type PluginOption } from "vite" -import dts from "vite-plugin-dts" - -// Bundle analysis is opt-in: `ANALYZE=true pnpm build`. -// Output is written outside dist/ so it can never be published. -const analyzePlugins = async (): Promise => { - if (!process.env.ANALYZE) return [] - const { visualizer } = await import("rollup-plugin-visualizer") - return [ - visualizer({ - open: true, - template: "treemap", - filename: "./analysis/stats.html", - gzipSize: true, - brotliSize: true, - }) as PluginOption, - ] -} - -// https://vitejs.dev/config/ -export default defineConfig(async () => ({ - build: { - lib: { - entry: { - index: resolve(__dirname, "src/index.ts"), - viem: resolve(__dirname, "src/viem/index.ts"), - protocol: resolve(__dirname, "src/protocol/index.ts"), - }, - name: "tokenbound-sdk", - formats: ["es", "cjs"], - }, - sourcemap: true, - rollupOptions: { - // Externalize deps that shouldn't be bundled into the library. - external: [ - "viem", - "viem/ens", - "viem/chains", - "viem/actions", - "viem/accounts", - "@layerzerolabs/lz-v2-utilities", - ], - output: { - globals: { - viem: "viem", - }, - }, - }, - }, - plugins: [ - dts({ - // Tests must never produce declarations in dist. - exclude: [ - "src/test/**", - "src/tests/**", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.testDISABLED.ts", - ], - }), - ...(await analyzePlugins()), - ], - optimizeDeps: { - exclude: ["**/__test__/**", "**/*.test.ts", "**/*.spec.ts", "./test/**/"], - }, -})) diff --git a/packages/test-fixtures/package.json b/packages/test-fixtures/package.json index 998e3fb..558b893 100644 --- a/packages/test-fixtures/package.json +++ b/packages/test-fixtures/package.json @@ -8,7 +8,7 @@ ".": "./src/index.ts" }, "peerDependencies": { - "viem": "~2.57.7" + "viem": "catalog:" }, "devDependencies": { "prool": "0.2.16" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10d7dd2..3e84916 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,27 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@biomejs/biome': + specifier: 2.5.14 + version: 2.5.14 + tsdown: + specifier: 0.23.0 + version: 0.23.0 + typescript: + specifier: ^5.6.3 + version: 5.9.3 + viem: + specifier: ~2.57.7 + version: 2.57.7 + vite: + specifier: ^5.4.21 + version: 5.4.21 + vitest: + specifier: ^1.6.1 + version: 1.6.1 + overrides: '@walletconnect/logger>pino': 10.0.0 @@ -12,7 +33,7 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 2.5.14 + specifier: 'catalog:' version: 2.5.14 '@changesets/cli': specifier: ^2.26.2 @@ -21,7 +42,7 @@ importers: specifier: ^8.0.3 version: 8.0.3 typescript: - specifier: ^5.6.3 + specifier: 'catalog:' version: 5.9.3 examples/vite-wagmi-ethers: @@ -57,15 +78,15 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 'catalog:' + version: 2.5.14 '@types/react': specifier: ^18.2.21 version: 18.3.31 @@ -76,10 +97,10 @@ importers: specifier: ^4.0.4 version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: - specifier: ^5.2.2 + specifier: 'catalog:' version: 5.9.3 vite: - specifier: ^5.4.21 + specifier: 'catalog:' version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi-ethers6: @@ -112,15 +133,15 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 'catalog:' + version: 2.5.14 '@types/react': specifier: ^18.2.21 version: 18.3.31 @@ -131,10 +152,10 @@ importers: specifier: ^4.0.4 version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: - specifier: ^5.2.2 + specifier: 'catalog:' version: 5.9.3 vite: - specifier: ^5.4.21 + specifier: 'catalog:' version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi-viem: @@ -164,15 +185,15 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) wagmi: specifier: ^2.19.5 version: 2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76) devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 'catalog:' + version: 2.5.14 '@types/react': specifier: ^18.2.21 version: 18.3.31 @@ -183,10 +204,10 @@ importers: specifier: ^4.0.4 version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: - specifier: ^5.2.2 + specifier: 'catalog:' version: 5.9.3 vite: - specifier: ^5.4.21 + specifier: 'catalog:' version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) examples/vite-wagmi3-viem: @@ -213,15 +234,15 @@ importers: specifier: ^0.12.5 version: 0.12.5 viem: - specifier: ^2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) wagmi: specifier: ^3.7.7 version: 3.7.7(@coinbase/wallet-sdk@4.3.6(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(use-sync-external-store@1.4.0(react@18.3.1))(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(@walletconnect/ethereum-provider@2.21.1(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)) devDependencies: '@biomejs/biome': - specifier: 2.5.13 - version: 2.5.13 + specifier: 'catalog:' + version: 2.5.14 '@types/react': specifier: ^18.2.21 version: 18.3.31 @@ -232,10 +253,10 @@ importers: specifier: ^4.0.4 version: 4.7.0(vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0)) typescript: - specifier: ^5.2.2 + specifier: 'catalog:' version: 5.9.3 vite: - specifier: ^5.4.21 + specifier: 'catalog:' version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) packages/ethers: @@ -245,7 +266,7 @@ importers: version: link:../sdk devDependencies: '@biomejs/biome': - specifier: 2.5.14 + specifier: 'catalog:' version: 2.5.14 '@tokenbound/test-fixtures': specifier: workspace:* @@ -256,20 +277,20 @@ importers: ethers6: specifier: npm:ethers@^6.17.0 version: ethers@6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + tsdown: + specifier: 'catalog:' + version: 0.23.0(typescript@5.9.3) typescript: - specifier: ^5.6.3 + specifier: 'catalog:' version: 5.9.3 viem: - specifier: ~2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) vite: - specifier: ^4.4.9 - version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) - vite-plugin-dts: - specifier: ^3.9.0 - version: 3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)) + specifier: 'catalog:' + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) vitest: - specifier: ^1.6.1 + specifier: 'catalog:' version: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) packages/sdk: @@ -277,12 +298,9 @@ importers: '@layerzerolabs/lz-v2-utilities': specifier: ^3.0.168 version: 3.0.168 - viem: - specifier: ~2.57.7 - version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: '@biomejs/biome': - specifier: 2.5.14 + specifier: 'catalog:' version: 2.5.14 '@tokenbound/test-fixtures': specifier: workspace:* @@ -295,24 +313,27 @@ importers: version: 2.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) rollup-plugin-visualizer: specifier: ^5.12.0 - version: 5.14.0(rolldown@1.2.5)(rollup@4.63.0) + version: 5.14.0(rolldown@1.2.14)(rollup@4.63.0) + tsdown: + specifier: 'catalog:' + version: 0.23.0(typescript@5.9.3) typescript: - specifier: ^5.4.5 + specifier: 'catalog:' version: 5.9.3 + viem: + specifier: 'catalog:' + version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) vite: - specifier: ^4.4.9 - version: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) - vite-plugin-dts: - specifier: ^3.9.0 - version: 3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)) + specifier: 'catalog:' + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) vitest: - specifier: ^1.6.0 + specifier: 'catalog:' version: 1.6.1(@types/node@26.3.0)(jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10))(lightningcss@1.33.0) packages/test-fixtures: dependencies: viem: - specifier: ~2.57.7 + specifier: 'catalog:' version: 2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3) devDependencies: prool: @@ -451,47 +472,23 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@biomejs/biome@2.5.13': - resolution: {integrity: sha512-+SEC/mFk1a+5mvUANZgbZTaiZXs1nj4iMhL/PHiqDT5TPUEPFIlliEtkKKZB4N862yylHC3UI+/Sj2I0HJEqhA==} - engines: {node: '>=14.21.3'} - hasBin: true - '@biomejs/biome@2.5.14': resolution: {integrity: sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.5.13': - resolution: {integrity: sha512-nYSuDJ6zgVqZUkAkJkvhXxsF2PYIrUk/g638K4voCXz7foI9f7b6C2/7+oAihsHQlivZNMUrm/y8ywlcHQtZOw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - '@biomejs/cli-darwin-arm64@2.5.14': resolution: {integrity: sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.5.13': - resolution: {integrity: sha512-KVy1ceEDuJ3AzFxjT9kkxbVy+UANw1pjEMUS6lvKfxjJ+fmkRvc7sQn1Xo6ETgseEI7wUQoV03KSga3XfE8YRQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - '@biomejs/cli-darwin-x64@2.5.14': resolution: {integrity: sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.5.13': - resolution: {integrity: sha512-CH32xpep3dNS5EVJpAHlYchkBYznxyVZQrx0b6YYYlPL9u9ZeD2NtqiK/6s64+HFS2a7hGnryLlqqZAOh8ax5g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-arm64-musl@2.5.14': resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} engines: {node: '>=14.21.3'} @@ -499,13 +496,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-arm64@2.5.13': - resolution: {integrity: sha512-VlNMtoxOqs0dUR6drxxHr18SNUvI7xxAuHZlH4s/dstYSf3g6RaqVgo8JRnhcOhKz9afWrvtJTboNG1JuYlIDQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@biomejs/cli-linux-arm64@2.5.14': resolution: {integrity: sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q==} engines: {node: '>=14.21.3'} @@ -513,13 +503,6 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-linux-x64-musl@2.5.13': - resolution: {integrity: sha512-F3pmwl+VHoUuVJN/tbNLKeLt0SVK3EIyN1jXlMcNyQGYRQQTVqXF+GgkP0/CjGXFN87e/mv0sBfUnWqWza5PKQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [musl] - '@biomejs/cli-linux-x64-musl@2.5.14': resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} engines: {node: '>=14.21.3'} @@ -527,13 +510,6 @@ packages: os: [linux] libc: [musl] - '@biomejs/cli-linux-x64@2.5.13': - resolution: {integrity: sha512-Fi6gIxbUaJ3ZCIXeG3ggIBPF76O2DjDN67WrPX/ODRv54GeXPm2gbEPC96Yb0yrJoiH0Eax1JLx1Pi0XbsNFZQ==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - libc: [glibc] - '@biomejs/cli-linux-x64@2.5.14': resolution: {integrity: sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA==} engines: {node: '>=14.21.3'} @@ -541,24 +517,12 @@ packages: os: [linux] libc: [glibc] - '@biomejs/cli-win32-arm64@2.5.13': - resolution: {integrity: sha512-+WD13qshXrr0Icv4BfsAdzm8Fs3TL+nZ59zEQxsYNd8lcgZJ0A5+OrlwsL1PipVCmWeRpxgIPD6DAcEd7smkCQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - '@biomejs/cli-win32-arm64@2.5.14': resolution: {integrity: sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.5.13': - resolution: {integrity: sha512-VOofU/nW761XWzUeUNE8zzYNyPrxuMuNFMizL0qz7J75yeV8N7WFheUlk1/K6dOkaFpH9wJ+lDKlwjAbw0346w==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@biomejs/cli-win32-x64@2.5.14': resolution: {integrity: sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ==} engines: {node: '>=14.21.3'} @@ -710,12 +674,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -728,12 +686,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -746,12 +698,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -764,12 +710,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -782,12 +722,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -800,12 +734,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -818,12 +746,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -836,12 +758,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -854,12 +770,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -872,12 +782,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -890,12 +794,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -908,12 +806,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -926,12 +818,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -944,12 +830,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -962,12 +842,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -980,12 +854,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1004,12 +872,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1028,12 +890,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1052,12 +908,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1070,12 +920,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1088,12 +932,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1106,12 +944,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1371,19 +1203,6 @@ packages: resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} engines: {node: '>=16.0.0'} - '@microsoft/api-extractor-model@7.28.13': - resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} - - '@microsoft/api-extractor@7.43.0': - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} - hasBin: true - - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@motionone/animation@10.18.0': resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} @@ -1471,13 +1290,16 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.146.0': - resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} '@paulmillr/qr@0.2.1': resolution: {integrity: sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ==} deprecated: 'Switch to "qr" (new package name) for security updates: npm install qr' + '@quansync/fs@1.1.0': + resolution: {integrity: sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==} + '@rainbow-me/rainbowkit@2.2.11': resolution: {integrity: sha512-FHPsRHMBpuHHhuyKktAR13O9agmsUUunDnVEP4hG1dSZ2JojXLUSWyLG28VbGIJakHYylkNguiLFnqM/BM8ERA==} engines: {node: '>=12.4'} @@ -1517,98 +1339,98 @@ packages: '@reown/appkit@1.7.8': resolution: {integrity: sha512-51kTleozhA618T1UvMghkhKfaPcc9JlKwLJ5uV+riHyvSoWPKPRIa5A6M1Wano5puNyW0s3fwywhyqTHSilkaA==} - '@rolldown/binding-android-arm-eabi@1.2.5': - resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} + '@rolldown/binding-android-arm-eabi@1.2.14': + resolution: {integrity: sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rolldown/binding-android-arm64@1.2.5': - resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} + '@rolldown/binding-android-arm64@1.2.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.5': - resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} + '@rolldown/binding-darwin-arm64@1.2.14': + resolution: {integrity: sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.5': - resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} + '@rolldown/binding-darwin-x64@1.2.14': + resolution: {integrity: sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.5': - resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} + '@rolldown/binding-freebsd-x64@1.2.14': + resolution: {integrity: sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': - resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.5': - resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} + '@rolldown/binding-linux-arm64-gnu@1.2.14': + resolution: {integrity: sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.5': - resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} + '@rolldown/binding-linux-arm64-musl@1.2.14': + resolution: {integrity: sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.5': - resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + resolution: {integrity: sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.5': - resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} + '@rolldown/binding-linux-s390x-gnu@1.2.14': + resolution: {integrity: sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.5': - resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} + '@rolldown/binding-linux-x64-gnu@1.2.14': + resolution: {integrity: sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.5': - resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} + '@rolldown/binding-linux-x64-musl@1.2.14': + resolution: {integrity: sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.5': - resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.5': - resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} + '@rolldown/binding-win32-arm64-msvc@1.2.14': + resolution: {integrity: sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.5': - resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} + '@rolldown/binding-win32-x64-msvc@1.2.14': + resolution: {integrity: sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1619,15 +1441,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/pluginutils@5.4.0': - resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/rollup-android-arm-eabi@4.63.0': resolution: {integrity: sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==} cpu: [arm] @@ -1766,28 +1579,6 @@ packages: cpu: [x64] os: [win32] - '@rushstack/node-core-library@4.0.2': - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/rig-package@0.5.2': - resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} - - '@rushstack/terminal@0.10.0': - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - - '@rushstack/ts-command-line@4.19.1': - resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} - '@safe-global/safe-apps-provider@0.18.6': resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} @@ -2209,9 +2000,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@types/argparse@1.0.38': - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2299,32 +2087,6 @@ packages: '@vitest/utils@1.6.1': resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} - '@volar/language-core@1.11.1': - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - - '@volar/source-map@1.11.1': - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - - '@volar/typescript@1.11.1': - resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} - - '@vue/compiler-core@3.5.42': - resolution: {integrity: sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==} - - '@vue/compiler-dom@3.5.42': - resolution: {integrity: sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==} - - '@vue/language-core@1.8.27': - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@vue/shared@3.5.42': - resolution: {integrity: sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==} - '@wagmi/cli@2.10.0': resolution: {integrity: sha512-2tYt6Bp1q26mWexH+XE6dMpPB5/Gp/3OVtE2SeeJ/gNHKLZmVF/TuoZR75mpJKTpofyvpz/fnuMCkUxzbc/kRw==} hasBin: true @@ -2495,6 +2257,75 @@ packages: '@walletconnect/window-metadata@1.0.1': resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} + '@yuku-core/binding-android-arm64@0.19.0': + resolution: {integrity: sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==} + cpu: [arm64] + os: [android] + + '@yuku-core/binding-darwin-arm64@0.19.0': + resolution: {integrity: sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==} + cpu: [arm64] + os: [darwin] + + '@yuku-core/binding-darwin-x64@0.19.0': + resolution: {integrity: sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==} + cpu: [x64] + os: [darwin] + + '@yuku-core/binding-freebsd-x64@0.19.0': + resolution: {integrity: sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==} + cpu: [x64] + os: [freebsd] + + '@yuku-core/binding-linux-arm-gnu@0.19.0': + resolution: {integrity: sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-arm-musl@0.19.0': + resolution: {integrity: sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + resolution: {integrity: sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-arm64-musl@0.19.0': + resolution: {integrity: sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-core/binding-linux-x64-gnu@0.19.0': + resolution: {integrity: sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-core/binding-linux-x64-musl@0.19.0': + resolution: {integrity: sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-core/binding-win32-arm64@0.19.0': + resolution: {integrity: sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==} + cpu: [arm64] + os: [win32] + + '@yuku-core/binding-win32-x64@0.19.0': + resolution: {integrity: sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.19.0': + resolution: {integrity: sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==} + abitype@1.0.6: resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} peerDependencies: @@ -2562,9 +2393,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -2665,9 +2493,6 @@ packages: brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@2.1.4: - resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -2703,6 +2528,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} + engines: {node: '>=20.19.0'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2787,13 +2616,6 @@ packages: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2879,9 +2701,6 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2992,6 +2811,15 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -3009,6 +2837,10 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} + encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} @@ -3030,10 +2862,6 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -3053,11 +2881,6 @@ packages: es-toolkit@1.33.0: resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -3077,9 +2900,6 @@ packages: engines: {node: '>=4'} hasBin: true - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -3142,9 +2962,6 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -3260,6 +3077,10 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3308,10 +3129,6 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} @@ -3325,6 +3142,9 @@ packages: resolution: {integrity: sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==} engines: {node: '>=16.9.0'} + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} + html-encoding-sniffer@4.0.0: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} @@ -3386,9 +3206,9 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} + import-without-cache@0.4.1: + resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} + engines: {node: ^22.18.0 || >=24.0.0} inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -3411,10 +3231,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.2: - resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -3525,9 +3341,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - jose@6.2.12: resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} @@ -3569,9 +3382,6 @@ packages: json-rpc-random-id@1.0.1: resolution: {integrity: sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -3587,9 +3397,6 @@ packages: keyvaluestorage-interface@1.0.0: resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -3685,14 +3492,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -3716,10 +3515,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -3772,16 +3567,9 @@ packages: minimalistic-crypto-utils@1.0.1: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -3819,9 +3607,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - multiformats@9.9.0: resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} @@ -3877,6 +3662,14 @@ packages: obj-multiplex@1.0.0: resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} + + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} @@ -3970,9 +3763,6 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3989,9 +3779,6 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4171,6 +3958,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + query-string@7.1.3: resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} engines: {node: '>=6'} @@ -4291,20 +4081,37 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - - resolve@1.22.12: - resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} - engines: {node: '>= 0.4'} - hasBin: true + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rolldown@1.2.5: - resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} + rolldown-plugin-dts@0.28.8: + resolution: {integrity: sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + peerDependencies: + '@typescript/native-preview': '*' + '@volar/typescript': ~2.4.0 + '@vue/language-core': ~3.2.0 || ~3.3.0 + rolldown: ^1.2.0 + typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + '@volar/typescript': + optional: true + '@vue/language-core': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -4321,11 +4128,6 @@ packages: rollup: optional: true - rollup@3.30.0: - resolution: {integrity: sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.63.0: resolution: {integrity: sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4371,11 +4173,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -4433,10 +4230,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - source-map@0.7.6: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} @@ -4465,10 +4258,6 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4495,10 +4284,6 @@ packages: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} @@ -4525,14 +4310,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4558,6 +4335,14 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tinypool@0.8.4: resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} @@ -4585,6 +4370,44 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsdown@0.23.0: + resolution: {integrity: sha512-BaT+ep1xnj5hdyICLd5r5SYYE+TXnI1ATePLykv9vcKpHpFTWUWRH+x1AF/E2qcu3YB6+vI8IdyxIIIffEqw5Q==} + engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.23.0 + '@tsdown/exe': 0.23.0 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + unplugin-unused: '>=0.5.0' + unrun: '*' + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -4599,11 +4422,6 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typescript@5.4.2: - resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -4622,6 +4440,9 @@ packages: uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -4714,9 +4535,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -4770,10 +4588,6 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true - validator@13.15.35: - resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} - engines: {node: '>= 0.10'} - valtio@1.13.2: resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} engines: {node: '>=12.20.0'} @@ -4786,6 +4600,10 @@ packages: react: optional: true + verkit@0.4.1: + resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==} + engines: {node: '>=18.12.0'} + viem@2.23.2: resolution: {integrity: sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==} peerDependencies: @@ -4807,44 +4625,6 @@ packages: engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite-plugin-dts@3.9.1: - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - - vite@4.5.14: - resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - vite@5.4.21: resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4901,15 +4681,6 @@ packages: jsdom: optional: true - vue-template-compiler@2.7.16: - resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} - - vue-tsc@1.8.27: - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -5063,9 +4834,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -5094,10 +4862,21 @@ packages: resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true + yuku-ast@0.19.0: + resolution: {integrity: sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==} + engines: {node: '>=14.18.0'} + + yuku-codegen@0.19.0: + resolution: {integrity: sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==} + engines: {node: '>=14.18.0'} + + yuku-core@0.19.0: + resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} + engines: {node: '>=14.18.0'} + + yuku-parser@0.19.0: + resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} + engines: {node: '>=14.18.0'} zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -5322,17 +5101,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@2.5.13': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.5.13 - '@biomejs/cli-darwin-x64': 2.5.13 - '@biomejs/cli-linux-arm64': 2.5.13 - '@biomejs/cli-linux-arm64-musl': 2.5.13 - '@biomejs/cli-linux-x64': 2.5.13 - '@biomejs/cli-linux-x64-musl': 2.5.13 - '@biomejs/cli-win32-arm64': 2.5.13 - '@biomejs/cli-win32-x64': 2.5.13 - '@biomejs/biome@2.5.14': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.5.14 @@ -5344,51 +5112,27 @@ snapshots: '@biomejs/cli-win32-arm64': 2.5.14 '@biomejs/cli-win32-x64': 2.5.14 - '@biomejs/cli-darwin-arm64@2.5.13': - optional: true - '@biomejs/cli-darwin-arm64@2.5.14': optional: true - '@biomejs/cli-darwin-x64@2.5.13': - optional: true - '@biomejs/cli-darwin-x64@2.5.14': optional: true - '@biomejs/cli-linux-arm64-musl@2.5.13': - optional: true - '@biomejs/cli-linux-arm64-musl@2.5.14': optional: true - '@biomejs/cli-linux-arm64@2.5.13': - optional: true - '@biomejs/cli-linux-arm64@2.5.14': optional: true - '@biomejs/cli-linux-x64-musl@2.5.13': - optional: true - '@biomejs/cli-linux-x64-musl@2.5.14': optional: true - '@biomejs/cli-linux-x64@2.5.13': - optional: true - '@biomejs/cli-linux-x64@2.5.14': optional: true - '@biomejs/cli-win32-arm64@2.5.13': - optional: true - '@biomejs/cli-win32-arm64@2.5.14': optional: true - '@biomejs/cli-win32-x64@2.5.13': - optional: true - '@biomejs/cli-win32-x64@2.5.14': optional: true @@ -5667,144 +5411,96 @@ snapshots: '@esbuild/aix-ppc64@0.25.12': optional: true - '@esbuild/android-arm64@0.18.20': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.25.12': optional: true - '@esbuild/android-arm@0.18.20': - optional: true - '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.25.12': optional: true - '@esbuild/android-x64@0.18.20': - optional: true - '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.25.12': optional: true - '@esbuild/darwin-arm64@0.18.20': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.25.12': optional: true - '@esbuild/darwin-x64@0.18.20': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.25.12': optional: true - '@esbuild/freebsd-arm64@0.18.20': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.25.12': optional: true - '@esbuild/freebsd-x64@0.18.20': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.25.12': optional: true - '@esbuild/linux-arm64@0.18.20': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.25.12': optional: true - '@esbuild/linux-arm@0.18.20': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.25.12': optional: true - '@esbuild/linux-ia32@0.18.20': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.25.12': optional: true - '@esbuild/linux-loong64@0.18.20': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.25.12': optional: true - '@esbuild/linux-mips64el@0.18.20': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.25.12': optional: true - '@esbuild/linux-ppc64@0.18.20': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.25.12': optional: true - '@esbuild/linux-riscv64@0.18.20': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.25.12': optional: true - '@esbuild/linux-s390x@0.18.20': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.25.12': optional: true - '@esbuild/linux-x64@0.18.20': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true @@ -5814,9 +5510,6 @@ snapshots: '@esbuild/netbsd-arm64@0.25.12': optional: true - '@esbuild/netbsd-x64@0.18.20': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true @@ -5826,9 +5519,6 @@ snapshots: '@esbuild/openbsd-arm64@0.25.12': optional: true - '@esbuild/openbsd-x64@0.18.20': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true @@ -5838,36 +5528,24 @@ snapshots: '@esbuild/openharmony-arm64@0.25.12': optional: true - '@esbuild/sunos-x64@0.18.20': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.18.20': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.25.12': optional: true - '@esbuild/win32-ia32@0.18.20': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.25.12': optional: true - '@esbuild/win32-x64@0.18.20': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true @@ -6417,41 +6095,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@microsoft/api-extractor-model@7.28.13(@types/node@26.3.0)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.43.0(@types/node@26.3.0)': - dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@26.3.0) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) - '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@26.3.0) - '@rushstack/ts-command-line': 4.19.1(@types/node@26.3.0) - lodash: 4.17.23 - minimatch: 3.0.8 - resolve: 1.22.12 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.4.2 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - - '@microsoft/tsdoc@0.14.2': {} - '@motionone/animation@10.18.0': dependencies: '@motionone/easing': 10.18.0 @@ -6540,11 +6183,14 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.3 - '@oxc-project/types@0.146.0': - optional: true + '@oxc-project/types@0.154.0': {} '@paulmillr/qr@0.2.1': {} + '@quansync/fs@1.1.0': + dependencies: + quansync: 1.0.0 + '@rainbow-me/rainbowkit@2.2.11(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(wagmi@2.19.5(@tanstack/query-core@5.102.4)(@tanstack/react-query@5.102.4(react@18.3.1))(@types/react@18.3.31)(bufferutil@4.1.0)(react@18.3.1)(typescript@5.9.3)(utf-8-validate@5.0.10)(viem@2.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76))(zod@3.25.76))': dependencies: '@tanstack/react-query': 5.102.4(react@18.3.1) @@ -7067,63 +6713,54 @@ snapshots: - zod optional: true - '@rolldown/binding-android-arm-eabi@1.2.5': + '@rolldown/binding-android-arm-eabi@1.2.14': optional: true - '@rolldown/binding-android-arm64@1.2.5': + '@rolldown/binding-android-arm64@1.2.14': optional: true - '@rolldown/binding-darwin-arm64@1.2.5': + '@rolldown/binding-darwin-arm64@1.2.14': optional: true - '@rolldown/binding-darwin-x64@1.2.5': + '@rolldown/binding-darwin-x64@1.2.14': optional: true - '@rolldown/binding-freebsd-x64@1.2.5': + '@rolldown/binding-freebsd-x64@1.2.14': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.5': + '@rolldown/binding-linux-arm64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.5': + '@rolldown/binding-linux-arm64-musl@1.2.14': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.5': + '@rolldown/binding-linux-ppc64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.5': + '@rolldown/binding-linux-s390x-gnu@1.2.14': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.5': + '@rolldown/binding-linux-x64-gnu@1.2.14': optional: true - '@rolldown/binding-linux-x64-musl@1.2.5': + '@rolldown/binding-linux-x64-musl@1.2.14': optional: true - '@rolldown/binding-openharmony-arm64@1.2.5': + '@rolldown/binding-openharmony-arm64@1.2.14': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.5': + '@rolldown/binding-win32-arm64-msvc@1.2.14': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.5': + '@rolldown/binding-win32-x64-msvc@1.2.14': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.1': - optional: true - - '@rollup/pluginutils@5.4.0(rollup@4.63.0)': - dependencies: - '@types/estree': 1.0.9 - estree-walker: 2.0.2 - picomatch: 4.0.7 - optionalDependencies: - rollup: 4.63.0 + '@rolldown/pluginutils@1.0.1': {} '@rollup/rollup-android-arm-eabi@4.63.0': optional: true @@ -7200,38 +6837,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.63.0': optional: true - '@rushstack/node-core-library@4.0.2(@types/node@26.3.0)': - dependencies: - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.12 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 26.3.0 - - '@rushstack/rig-package@0.5.2': - dependencies: - resolve: 1.22.12 - strip-json-comments: 3.1.1 - - '@rushstack/terminal@0.10.0(@types/node@26.3.0)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@26.3.0) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 26.3.0 - - '@rushstack/ts-command-line@4.19.1(@types/node@26.3.0)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@26.3.0) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - '@safe-global/safe-apps-provider@0.18.6(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76)': dependencies: '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) @@ -7760,8 +7365,6 @@ snapshots: '@tanstack/query-core': 5.102.4 react: 18.3.1 - '@types/argparse@1.0.38': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.8 @@ -7903,48 +7506,6 @@ snapshots: loupe: 2.3.7 pretty-format: 29.7.0 - '@volar/language-core@1.11.1': - dependencies: - '@volar/source-map': 1.11.1 - - '@volar/source-map@1.11.1': - dependencies: - muggle-string: 0.3.1 - - '@volar/typescript@1.11.1': - dependencies: - '@volar/language-core': 1.11.1 - path-browserify: 1.0.1 - - '@vue/compiler-core@3.5.42': - dependencies: - '@babel/parser': 7.29.8 - '@vue/shared': 3.5.42 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.42': - dependencies: - '@vue/compiler-core': 3.5.42 - '@vue/shared': 3.5.42 - - '@vue/language-core@1.8.27(typescript@5.9.3)': - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.5.42 - '@vue/shared': 3.5.42 - computeds: 0.0.1 - minimatch: 9.0.9 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - vue-template-compiler: 2.7.16 - optionalDependencies: - typescript: 5.9.3 - - '@vue/shared@3.5.42': {} - '@wagmi/cli@2.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: abitype: 1.3.0(typescript@5.9.3)(zod@4.4.3) @@ -8984,6 +8545,44 @@ snapshots: '@walletconnect/window-getters': 1.0.1 tslib: 1.14.1 + '@yuku-core/binding-android-arm64@0.19.0': + optional: true + + '@yuku-core/binding-darwin-arm64@0.19.0': + optional: true + + '@yuku-core/binding-darwin-x64@0.19.0': + optional: true + + '@yuku-core/binding-freebsd-x64@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm-musl@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-arm64-musl@0.19.0': + optional: true + + '@yuku-core/binding-linux-x64-gnu@0.19.0': + optional: true + + '@yuku-core/binding-linux-x64-musl@0.19.0': + optional: true + + '@yuku-core/binding-win32-arm64@0.19.0': + optional: true + + '@yuku-core/binding-win32-x64@0.19.0': + optional: true + + '@yuku-toolchain/types@0.19.0': {} + abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): optionalDependencies: typescript: 5.9.3 @@ -9049,13 +8648,6 @@ snapshots: agent-base@7.1.4: optional: true - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -9148,10 +8740,6 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.4: - dependencies: - balanced-match: 1.0.2 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -9190,6 +8778,8 @@ snapshots: cac@6.7.14: {} + cac@7.1.0: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -9273,11 +8863,6 @@ snapshots: commander@14.0.2: {} - commander@9.5.0: - optional: true - - computeds@0.0.1: {} - concat-map@0.0.1: {} confbox@0.1.8: {} @@ -9372,8 +8957,6 @@ snapshots: dayjs@1.11.13: {} - de-indent@1.0.2: {} - debug@4.3.4: dependencies: ms: 2.1.2 @@ -9444,6 +9027,8 @@ snapshots: dotenv@16.6.1: {} + dts-resolver@3.0.0: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -9471,6 +9056,8 @@ snapshots: emoji-regex@8.0.0: {} + empathic@2.1.0: {} + encode-utf8@1.0.3: {} end-of-stream@1.4.5: @@ -9499,8 +9086,6 @@ snapshots: entities@6.0.1: optional: true - entities@7.0.1: {} - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -9518,31 +9103,6 @@ snapshots: es-toolkit@1.33.0: {} - esbuild@0.18.20: - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -9602,8 +9162,6 @@ snapshots: esprima@4.0.1: {} - estree-walker@2.0.2: {} - estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -9743,8 +9301,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - fast-safe-stringify@2.1.1: {} fastq@1.20.3: @@ -9755,6 +9311,10 @@ snapshots: optionalDependencies: picomatch: 3.0.2 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 @@ -9857,6 +9417,10 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 + get-tsconfig@5.0.0-beta.6: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -9918,8 +9482,6 @@ snapshots: dependencies: function-bind: 1.1.2 - he@1.2.0: {} - hey-listen@1.0.8: {} hmac-drbg@1.0.1: @@ -9934,6 +9496,8 @@ snapshots: hono@4.13.8: {} + hookable@6.1.2: {} + html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 @@ -9997,7 +9561,7 @@ snapshots: ignore@5.3.2: {} - import-lazy@4.0.0: {} + import-without-cache@0.4.1: {} inflight@1.0.6: dependencies: @@ -10017,10 +9581,6 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.2: - dependencies: - hasown: 2.0.4 - is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -10114,8 +9674,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jju@1.4.0: {} - jose@6.2.12: {} js-sha3@0.8.0: {} @@ -10171,8 +9729,6 @@ snapshots: json-rpc-random-id@1.0.1: {} - json-schema-traverse@0.4.1: {} - json5@2.2.3: {} jsonfile@4.0.0: @@ -10187,8 +9743,6 @@ snapshots: keyvaluestorage-interface@1.0.0: {} - kolorist@1.8.0: {} - lightningcss-android-arm64@1.33.0: optional: true @@ -10266,10 +9820,6 @@ snapshots: dependencies: p-locate: 4.1.0 - lodash.get@4.4.2: {} - - lodash.isequal@4.5.0: {} - lodash.startcase@4.4.0: {} lodash@4.17.23: {} @@ -10290,10 +9840,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -10343,18 +9889,10 @@ snapshots: minimalistic-crypto-utils@1.0.1: {} - minimatch@3.0.8: - dependencies: - brace-expansion: 1.1.18 - minimatch@3.1.5: dependencies: brace-expansion: 1.1.18 - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.4 - minipass@7.1.3: {} minizlib@3.1.0: @@ -10382,8 +9920,6 @@ snapshots: ms@2.1.3: {} - muggle-string@0.3.1: {} - multiformats@9.9.0: {} nanoid@3.3.18: {} @@ -10426,6 +9962,10 @@ snapshots: once: 1.4.0 readable-stream: 2.3.8 + obug@2.2.1: {} + + obug@3.0.0: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -10605,8 +10145,6 @@ snapshots: entities: 6.0.1 optional: true - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -10615,8 +10153,6 @@ snapshots: path-key@4.0.0: {} - path-parse@1.0.7: {} - path-type@4.0.0: {} pathe@1.1.2: {} @@ -10753,7 +10289,8 @@ snapshots: end-of-stream: 1.4.5 once: 1.4.0 - punycode@2.3.1: {} + punycode@2.3.1: + optional: true qr@0.7.0: {} @@ -10766,6 +10303,8 @@ snapshots: quansync@0.2.11: {} + quansync@1.0.0: {} + query-string@7.1.3: dependencies: decode-uri-component: 0.2.2 @@ -10875,56 +10414,55 @@ snapshots: resolve-from@5.0.0: {} - resolve@1.19.0: - dependencies: - is-core-module: 2.16.2 - path-parse: 1.0.7 - - resolve@1.22.12: - dependencies: - es-errors: 1.3.0 - is-core-module: 2.16.2 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + resolve-pkg-maps@1.0.0: {} reusify@1.1.0: {} - rolldown@1.2.5: + rolldown-plugin-dts@0.28.8(rolldown@1.2.14)(typescript@5.9.3): dependencies: - '@oxc-project/types': 0.146.0 + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.6 + obug: 3.0.0 + rolldown: 1.2.14 + yuku-ast: 0.19.0 + yuku-codegen: 0.19.0 + yuku-parser: 0.19.0 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.2.14: + dependencies: + '@oxc-project/types': 0.154.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.5 - '@rolldown/binding-android-arm64': 1.2.5 - '@rolldown/binding-darwin-arm64': 1.2.5 - '@rolldown/binding-darwin-x64': 1.2.5 - '@rolldown/binding-freebsd-x64': 1.2.5 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.5 - '@rolldown/binding-linux-arm64-gnu': 1.2.5 - '@rolldown/binding-linux-arm64-musl': 1.2.5 - '@rolldown/binding-linux-ppc64-gnu': 1.2.5 - '@rolldown/binding-linux-s390x-gnu': 1.2.5 - '@rolldown/binding-linux-x64-gnu': 1.2.5 - '@rolldown/binding-linux-x64-musl': 1.2.5 - '@rolldown/binding-openharmony-arm64': 1.2.5 - '@rolldown/binding-win32-arm64-msvc': 1.2.5 - '@rolldown/binding-win32-x64-msvc': 1.2.5 - optional: true - - rollup-plugin-visualizer@5.14.0(rolldown@1.2.5)(rollup@4.63.0): + '@rolldown/binding-android-arm-eabi': 1.2.14 + '@rolldown/binding-android-arm64': 1.2.14 + '@rolldown/binding-darwin-arm64': 1.2.14 + '@rolldown/binding-darwin-x64': 1.2.14 + '@rolldown/binding-freebsd-x64': 1.2.14 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.14 + '@rolldown/binding-linux-arm64-gnu': 1.2.14 + '@rolldown/binding-linux-arm64-musl': 1.2.14 + '@rolldown/binding-linux-ppc64-gnu': 1.2.14 + '@rolldown/binding-linux-s390x-gnu': 1.2.14 + '@rolldown/binding-linux-x64-gnu': 1.2.14 + '@rolldown/binding-linux-x64-musl': 1.2.14 + '@rolldown/binding-openharmony-arm64': 1.2.14 + '@rolldown/binding-win32-arm64-msvc': 1.2.14 + '@rolldown/binding-win32-x64-msvc': 1.2.14 + + rollup-plugin-visualizer@5.14.0(rolldown@1.2.14)(rollup@4.63.0): dependencies: open: 8.4.2 picomatch: 4.0.7 source-map: 0.7.6 yargs: 17.7.3 optionalDependencies: - rolldown: 1.2.5 + rolldown: 1.2.14 rollup: 4.63.0 - rollup@3.30.0: - optionalDependencies: - fsevents: 2.3.3 - rollup@4.63.0: dependencies: '@types/estree': 1.0.9 @@ -10994,10 +10532,6 @@ snapshots: semver@6.3.1: {} - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 - semver@7.8.5: {} set-blocking@2.0.0: {} @@ -11057,8 +10591,6 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.6.1: {} - source-map@0.7.6: {} spawndamnit@3.0.1: @@ -11078,8 +10610,6 @@ snapshots: strict-uri-encode@2.0.0: {} - string-argv@0.3.2: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -11104,8 +10634,6 @@ snapshots: strip-final-newline@4.0.0: {} - strip-json-comments@3.1.1: {} - strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 @@ -11143,12 +10671,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: optional: true @@ -11177,6 +10699,13 @@ snapshots: tinybench@2.9.0: {} + tinyexec@1.3.1: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + tinypool@0.8.4: {} tinyspy@2.2.1: {} @@ -11206,6 +10735,33 @@ snapshots: punycode: 2.3.1 optional: true + tree-kill@1.2.2: {} + + tsdown@0.23.0(typescript@5.9.3): + dependencies: + cac: 7.1.0 + defu: 6.1.7 + empathic: 2.1.0 + hookable: 6.1.2 + import-without-cache: 0.4.1 + obug: 2.2.1 + picomatch: 4.0.7 + rolldown: 1.2.14 + rolldown-plugin-dts: 0.28.8(rolldown@1.2.14)(typescript@5.9.3) + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + verkit: 0.4.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@typescript/native-preview' + - '@volar/typescript' + - '@vue/language-core' + - oxc-resolver + - vue-tsc + tslib@1.14.1: {} tslib@2.7.0: {} @@ -11218,8 +10774,6 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typescript@5.4.2: {} - typescript@5.9.3: {} ua-is-frozen@0.1.2: {} @@ -11236,6 +10790,11 @@ snapshots: dependencies: multiformats: 9.9.0 + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.1.0 + quansync: 1.0.0 + uncrypto@0.1.3: {} undici-types@6.19.8: {} @@ -11271,10 +10830,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -11322,8 +10877,6 @@ snapshots: uuid@9.0.1: {} - validator@13.15.35: {} - valtio@1.13.2(@types/react@18.3.31)(react@18.3.1): dependencies: derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)) @@ -11333,6 +10886,8 @@ snapshots: '@types/react': 18.3.31 react: 18.3.1 + verkit@0.4.1: {} + viem@2.23.2(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.8.1 @@ -11437,33 +10992,6 @@ snapshots: - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@26.3.0)(rollup@4.63.0)(typescript@5.9.3)(vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0)): - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@26.3.0) - '@rollup/pluginutils': 5.4.0(rollup@4.63.0) - '@vue/language-core': 1.8.27(typescript@5.9.3) - debug: 4.4.3(supports-color@5.5.0) - kolorist: 1.8.0 - magic-string: 0.30.21 - typescript: 5.9.3 - vue-tsc: 1.8.27(typescript@5.9.3) - optionalDependencies: - vite: 4.5.14(@types/node@26.3.0)(lightningcss@1.33.0) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite@4.5.14(@types/node@26.3.0)(lightningcss@1.33.0): - dependencies: - esbuild: 0.18.20 - postcss: 8.5.26 - rollup: 3.30.0 - optionalDependencies: - '@types/node': 26.3.0 - fsevents: 2.3.3 - lightningcss: 1.33.0 - vite@5.4.21(@types/node@26.3.0)(lightningcss@1.33.0): dependencies: esbuild: 0.21.5 @@ -11509,18 +11037,6 @@ snapshots: - supports-color - terser - vue-template-compiler@2.7.16: - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - vue-tsc@1.8.27(typescript@5.9.3): - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.9.3) - semver: 7.8.5 - typescript: 5.9.3 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -11694,8 +11210,6 @@ snapshots: yallist@3.1.1: {} - yallist@4.0.0: {} - yallist@5.0.0: {} yargs-parser@18.1.3: @@ -11733,13 +11247,35 @@ snapshots: yoctocolors@2.2.0: {} - z-schema@5.0.5: + yuku-ast@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + + yuku-codegen@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + + yuku-core@0.19.0: dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.15.35 + '@yuku-toolchain/types': 0.19.0 optionalDependencies: - commander: 9.5.0 + '@yuku-core/binding-android-arm64': 0.19.0 + '@yuku-core/binding-darwin-arm64': 0.19.0 + '@yuku-core/binding-darwin-x64': 0.19.0 + '@yuku-core/binding-freebsd-x64': 0.19.0 + '@yuku-core/binding-linux-arm-gnu': 0.19.0 + '@yuku-core/binding-linux-arm-musl': 0.19.0 + '@yuku-core/binding-linux-arm64-gnu': 0.19.0 + '@yuku-core/binding-linux-arm64-musl': 0.19.0 + '@yuku-core/binding-linux-x64-gnu': 0.19.0 + '@yuku-core/binding-linux-x64-musl': 0.19.0 + '@yuku-core/binding-win32-arm64': 0.19.0 + '@yuku-core/binding-win32-x64': 0.19.0 + + yuku-parser@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + yuku-core: 0.19.0 zod@3.22.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2c7a647..d6bfed6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,13 @@ packages: - "./examples/**" # exclude packages that are inside test directories - '!**/test/**' - - '!**/6551contracts/**' \ No newline at end of file + - '!**/6551contracts/**' +# One version of each shared tool across the workspace, referenced as +# "catalog:". Published packages get the real range substituted on publish. +catalog: + "@biomejs/biome": 2.5.14 + typescript: ^5.6.3 + viem: ~2.57.7 + vite: ^5.4.21 + tsdown: 0.23.0 + vitest: ^1.6.1 From 342e7c7ecd7c78286d6166433b520303bf57973a Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 19 Oct 2026 22:59:21 -0700 Subject: [PATCH 28/30] publish the released tag, after tests, with provenance The workflow checked out main rather than the release tag. It now publishes the tag (which must be on main) after lint, build and unit tests, with npm provenance. Changesets access is set to public to match. Co-Authored-By: Claude Opus 5.5 --- .changeset/config.json | 2 +- .github/workflows/on-create-release.yml | 31 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index fa15567..1d4aa20 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -4,7 +4,7 @@ "commit": false, "fixed": [], "linked": [], - "access": "restricted", + "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": ["vite-wagmi"] diff --git a/.github/workflows/on-create-release.yml b/.github/workflows/on-create-release.yml index 268ec7a..22bd24b 100644 --- a/.github/workflows/on-create-release.yml +++ b/.github/workflows/on-create-release.yml @@ -4,14 +4,29 @@ on: release: types: [published] +permissions: + contents: read + # Lets npm sign a provenance attestation tying each version to this workflow + # run and commit. + id-token: write + jobs: publish: runs-on: ubuntu-latest steps: + # A release event checks out the release's tag, so what is published is + # exactly what was released, not whatever main has moved on to since. - name: Clone repository uses: actions/checkout@v4 with: - ref: 'main' # Ensure we're on the main branch + fetch-depth: 0 + + - name: Require the release tag to be on main + run: | + if ! git merge-base --is-ancestor HEAD origin/main; then + echo "::error::Release tag ${{ github.ref_name }} is not on main" + exit 1 + fi - name: Set up PNPM uses: pnpm/action-setup@v4 @@ -28,21 +43,31 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + - name: Lint and format check + run: pnpm biome ci . + # @tokenbound/ethers depends on @tokenbound/sdk, so the SDK builds first. - name: Build packages 🔧 run: | pnpm --filter @tokenbound/sdk build pnpm --filter @tokenbound/ethers build + # The fork-backed suites already ran in CI on main; these are the + # deterministic tests, which need no RPC endpoint or anvil. + - name: Unit and type tests + run: pnpm --filter @tokenbound/sdk exec vitest --watch=false --typecheck run src/test/unit/ + - name: Validate published package contents run: node scripts/validate-package-contents.mjs - name: Publish @tokenbound/sdk 📦 - run: pnpm --filter @tokenbound/sdk publish --publish-branch main --access public --no-git-checks + run: pnpm --filter @tokenbound/sdk publish --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + NPM_CONFIG_PROVENANCE: true - name: Publish @tokenbound/ethers 📦 - run: pnpm --filter @tokenbound/ethers publish --publish-branch main --access public --no-git-checks + run: pnpm --filter @tokenbound/ethers publish --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + NPM_CONFIG_PROVENANCE: true From 8baa89ae04847a1074d61555db82fe430fae0432 Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 19 Oct 2026 22:59:21 -0700 Subject: [PATCH 29/30] add TODO.md for remaining release work and open questions Co-Authored-By: Claude Opus 5.5 --- TODO.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 TODO.md diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..9e19ba9 --- /dev/null +++ b/TODO.md @@ -0,0 +1,83 @@ +# TODO + +Open work and open questions for the viem-first SDK (`@tokenbound/sdk`) and the +new `@tokenbound/ethers` package. Delete items as they land. + +## Before the next release + +- **Remove `@layerzerolabs/lz-v2-utilities`.** The SDK uses it for one value: + `Options.newOptions().addExecutorLzReceiveOption(200000, 0).toHex()` in + `packages/sdk/src/protocol/functions/crossChain.ts`. That value never changes: + `0x00030100110100000000000000000000000000030d40`. The package pulls about 30 + `@ethersproject/*` packages into every SDK install. Replace the call with the + constant. +- **Make the CI "no ethers" check catch `@ethersproject`.** It only searches for + `ethers@`, which is why it missed the item above. +- **Add a license.** No package has a `license` field and the repo has no + LICENSE file, so no published version has ever had one. The root + `package.json` says `ISC`, which looks like an `npm init` default rather than + a decision. +- **Update `.changeset/viem-first-sdk.md`.** It becomes the release notes and is + now out of date: + - It says the SDK has no ethers in its dependency graph. That's false until + the LayerZero item above lands. + - It gives the tarball as "~80 kB". It is now 52.9 kB. + - It doesn't say viem is now a peer dependency. That's breaking: users must + install viem themselves. + - It doesn't mention the separate CommonJS types or the tsdown build. The + ethers build output is now `dist/index.{js,cjs}`. +- **Give CI a Base RPC endpoint.** `crossChainDelivery.test.ts` forks Base, but + CI only passes `VITE_ANVIL_MAINNET_FORK_ENDPOINT`, so CI uses the public + `https://mainnet.base.org`. Add a `VITE_ANVIL_BASE_FORK_ENDPOINT` secret + before it gets rate-limited. + +## Open questions + +- **Executor gas is hardcoded at 200,000.** Every cross-chain call asks + LayerZero for 200k gas on the destination. A plain ETH transfer uses about + 122k. Heavier calls (a swap, a mint) would run out of gas on the destination + after the origin fee is already paid. Should `gasLimit` be a parameter, with + 200k as the default? +- **What to prove about cross-chain delivery.** The end-to-end test simulates + LayerZero's relay, so it can't catch a missing or broken DVN configuration on + a route. One option: read each route's ULN config from the forks and assert + that DVNs are set. +- **ESM-only.** Dropping CJS would remove the `.d.cts` output and the risk of + loading two copies of the SDK in one app. Node 22's `require(esm)` makes this + more reasonable, but it's still breaking for CJS users on older Node. +- **viem peer range.** The range is `^2.57.7` only because that's the one + version we've tested. npm 7+ fails the install on a peer conflict, so users on + older viem 2.x are blocked. Test an older version (say 2.21) and widen the + range if it passes. +- **Release process.** + - Releases are a manual GitHub release, with no changesets action. + - `@tokenbound/ethers` depends on `@tokenbound/sdk` through `workspace:^`. + Under 0.x that becomes `^0.5.x`, so a breaking SDK release that doesn't + also release ethers leaves ethers users stuck. Consider changesets + `fixed`/`linked` groups, and a `beta` pre-release channel for this + refactor. +- **npm trusted publishing.** Releases now get provenance, but publishing still + uses the long-lived `NPM_ACCESS_TOKEN`. Trusted publishing (OIDC) removes the + token. It needs npm 11.5+ in CI and a one-time setup on npmjs.com. + +## Later + +- **Mirror the end-to-end cross-chain test in `@tokenbound/ethers`.** Today the + ethers suite checks the fee quote and the calldata, and that its encoding + matches the viem core. It doesn't deliver on a second fork. +- **Convert the V2 JSON ABIs to `as const` TypeScript.** They are + `ERC6551RegistryV2.json` and `IERC6551AccountV2.json`. This gives typed ABIs, + removes tsdown's CommonJS-declaration warning, and stops tsdown pretty-printing + them (about 6 kB of the tarball). +- **Remove the `as unknown as` casts in the viem actions.** Constraining the + generic as `client extends Client` removes them. +- **Upgrade tooling.** vitest 1 → 3+ (with vite 6+), husky 8 → 9, and + `@vitest/coverage-v8` to match. +- **Run `publint` in CI** next to `validate-package-contents.mjs`. + `@arethetypeswrong/cli` (0.17 and 0.18) currently crashes on these tarballs. +- **Typecheck the example apps in CI**, so a breaking SDK change shows up there. +- **Add an `engines` field** to the published packages, e.g. `node >=18`. Node + 22 is only needed for the tests and doesn't belong there. +- **Report the viem receipt-polling stall upstream.** The fork tests poll + `getTransactionReceipt`, because `waitForTransactionReceipt` stalls against + anvil. From 431e5b26803f02575c54d982af542bc0ddf9e3da Mon Sep 17 00:00:00 2001 From: BJ Vicks Date: Mon, 19 Oct 2026 23:01:23 -0700 Subject: [PATCH 30/30] add end-to-end cross-chain test for @tokenbound/ethers Mirrors the viem suite's crossChainDelivery test on ethers v5 and v6: the ethers client sends a cross-chain execute on a mainnet fork, and the LayerZero packet is delivered on a Base fork through the same simulated relay. Asserts the message carries the account's execute() call, and that delivery succeeds within the 200k executor gas and moves the ETH on Base. Co-Authored-By: Claude Opus 5.5 --- TODO.md | 15 +- packages/ethers/package.json | 3 +- .../src/test/TestCrossChainDelivery.test.ts | 240 ++++++++++++++++++ 3 files changed, 249 insertions(+), 9 deletions(-) create mode 100644 packages/ethers/src/test/TestCrossChainDelivery.test.ts diff --git a/TODO.md b/TODO.md index 9e19ba9..97cf020 100644 --- a/TODO.md +++ b/TODO.md @@ -26,10 +26,12 @@ new `@tokenbound/ethers` package. Delete items as they land. install viem themselves. - It doesn't mention the separate CommonJS types or the tsdown build. The ethers build output is now `dist/index.{js,cjs}`. -- **Give CI a Base RPC endpoint.** `crossChainDelivery.test.ts` forks Base, but - CI only passes `VITE_ANVIL_MAINNET_FORK_ENDPOINT`, so CI uses the public - `https://mainnet.base.org`. Add a `VITE_ANVIL_BASE_FORK_ENDPOINT` secret - before it gets rate-limited. +- **Give CI a Base RPC endpoint.** The end-to-end delivery tests fork Base: + `crossChainDelivery.test.ts` in the SDK, and `TestCrossChainDelivery.test.ts` + in ethers, once per ethers version. That's three Base forks per CI run, and + CI only passes `VITE_ANVIL_MAINNET_FORK_ENDPOINT`, so all three use the + public `https://mainnet.base.org`. Add a `VITE_ANVIL_BASE_FORK_ENDPOINT` + secret before it gets rate-limited. ## Open questions @@ -38,7 +40,7 @@ new `@tokenbound/ethers` package. Delete items as they land. 122k. Heavier calls (a swap, a mint) would run out of gas on the destination after the origin fee is already paid. Should `gasLimit` be a parameter, with 200k as the default? -- **What to prove about cross-chain delivery.** The end-to-end test simulates +- **What to prove about cross-chain delivery.** The end-to-end tests simulate LayerZero's relay, so it can't catch a missing or broken DVN configuration on a route. One option: read each route's ULN config from the forks and assert that DVNs are set. @@ -62,9 +64,6 @@ new `@tokenbound/ethers` package. Delete items as they land. ## Later -- **Mirror the end-to-end cross-chain test in `@tokenbound/ethers`.** Today the - ethers suite checks the fee quote and the calldata, and that its encoding - matches the viem core. It doesn't deliver on a second fork. - **Convert the V2 JSON ABIs to `as const` TypeScript.** They are `ERC6551RegistryV2.json` and `IERC6551AccountV2.json`. This gives typed ABIs, removes tsdown's CommonJS-declaration warning, and stops tsdown pretty-printing diff --git a/packages/ethers/package.json b/packages/ethers/package.json index 906b9d0..966b448 100644 --- a/packages/ethers/package.json +++ b/packages/ethers/package.json @@ -43,7 +43,7 @@ }, "scripts": { "build": "tsc --noEmit && tsdown", - "test": "pnpm typecheck && pnpm test:versions && pnpm test:fixtures && pnpm test:crosschain && pnpm test:all && pnpm test:v2", + "test": "pnpm typecheck && pnpm test:versions && pnpm test:fixtures && pnpm test:crosschain && pnpm test:delivery && pnpm test:all && pnpm test:v2", "clean": "rm -rf node_modules/ dist/", "lint": "biome lint .", "format": "biome format .", @@ -52,6 +52,7 @@ "test:versions": "vitest --watch=false run src/test/TestEthersVersions.test.ts", "test:all": "vitest --watch=false run src/test/TestAllEthers.test.ts", "test:crosschain": "vitest --watch=false run src/test/TestCrossChain.test.ts", + "test:delivery": "vitest --watch=false run src/test/TestCrossChainDelivery.test.ts", "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json" }, "dependencies": { diff --git a/packages/ethers/src/test/TestCrossChainDelivery.test.ts b/packages/ethers/src/test/TestCrossChainDelivery.test.ts new file mode 100644 index 0000000..e4b3e9e --- /dev/null +++ b/packages/ethers/src/test/TestCrossChainDelivery.test.ts @@ -0,0 +1,240 @@ +// Cross-chain execution through @tokenbound/ethers, sent on one fork and +// delivered on another. +// +// TestCrossChain.test.ts proves the ethers client quotes and encodes the origin +// transaction exactly as the viem core does. This suite sends it: an ethers v5 +// or v6 signer calls `execute` on a mainnet fork, and the packet LayerZero +// would carry is delivered on a Base fork, where the call must actually run. +// +// The relay between the forks is simulated, as in the viem suite's +// crossChainDelivery.test.ts, which spells out what passing does and does not +// prove. In short: everything on-chain on both sides is real; LayerZero's +// off-chain verifiers (DVNs) and executor are not. + +import { ERC_6551_DEFAULT } from "@tokenbound/sdk" +import { + ANVIL_ACCOUNTS, + createBaseForkInstance, + createForkInstance, + deliverPacket, + findSentPacket, + isAddressMatch, + pollForReceipt, + RECIPIENT_ADDRESS, + zora721, +} from "@tokenbound/test-fixtures" +import { ethers } from "ethers" +import { JsonRpcProvider, JsonRpcSigner } from "ethers6" +import { + type Address, + createPublicClient, + createTestClient, + createWalletClient, + decodeAbiParameters, + decodeFunctionData, + encodeFunctionData, + getAddress, + type Hex, + http, + type PublicClient, + parseEther, + type TestClient, +} from "viem" +import { privateKeyToAccount } from "viem/accounts" +import { base, type Chain, mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../index" + +const TIMEOUT = 120_000 + +/** The ETH the account sends on the destination chain. */ +const TRANSFER = parseEther("0.001") + +/** The gas the SDK asks LayerZero's executor to forward on delivery. */ +const EXECUTOR_GAS = 200_000n + +const eoa = privateKeyToAccount(ANVIL_ACCOUNTS[0].privateKey) + +/** A TokenboundClient backed by an ethers v5 or v6 signer for `rpcUrl`. */ +function ethersClient(version: 5 | 6, chain: Chain, rpcUrl: string) { + const signer = + version === 5 + ? new ethers.Wallet( + ANVIL_ACCOUNTS[0].privateKey, + new ethers.providers.JsonRpcProvider(rpcUrl), + ) + : new JsonRpcSigner(new JsonRpcProvider(rpcUrl), getAddress(eoa.address)) + return new TokenboundClient({ signer, chain }) +} + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version — cross-chain execution, delivered end to end (mainnet → Base)", + ({ version }) => { + const originFork = createForkInstance() + const destinationFork = createBaseForkInstance() + + let originPublic: PublicClient + let destinationPublic: PublicClient + let destinationTest: TestClient + + /** The tokenbound account — one address, deployed on both chains. */ + let account: Address + let sendHash: Hex + + beforeAll(async () => { + await Promise.all([originFork.start(), destinationFork.start()]) + + originPublic = createPublicClient({ + chain: mainnet, + transport: http(originFork.url), + }) as PublicClient + destinationPublic = createPublicClient({ + chain: base, + transport: http(destinationFork.url), + }) as PublicClient + destinationTest = createTestClient({ + chain: base, + mode: "anvil", + transport: http(destinationFork.url), + }) + + const originClient = ethersClient(version, mainnet, originFork.url) + const destinationClient = ethersClient(version, base, destinationFork.url) + + // Setup that is not under test (the mint and the funding) goes through + // viem; everything the SDK does goes through the ethers client. + const originWallet = createWalletClient({ + chain: mainnet, + account: eoa, + transport: http(originFork.url), + }) + const mint = await pollForReceipt( + originPublic, + await originWallet.sendTransaction({ + to: zora721.proxyContractAddress, + value: zora721.mintPrice, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [1n], + }), + }), + ) + const transferLog = mint.logs.find( + (log) => + isAddressMatch(log.address, zora721.proxyContractAddress) && + log.topics.length === 4, + ) + if (!transferLog?.topics[3]) { + throw new Error("Could not determine the minted tokenId") + } + const nft = { + tokenContract: zora721.proxyContractAddress, + tokenId: BigInt(transferLog.topics[3]).toString(), + } + + // The account must exist on both chains. On Base it is created for the + // mainnet NFT (chainId 1), which is what makes the address identical. + const created = await originClient.createAccount(nft) + await pollForReceipt(originPublic, created.txHash) + account = created.account + + const mirrored = await destinationClient.createAccount({ + ...nft, + chainId: mainnet.id, + }) + await pollForReceipt(destinationPublic, mirrored.txHash) + if (mirrored.account !== account) { + throw new Error( + `Account addresses differ across chains: ${account} vs ${mirrored.account}`, + ) + } + + // The destination call spends the account's Base balance: the LayerZero + // executor forwards no ETH. + const destinationWallet = createWalletClient({ + chain: base, + account: eoa, + transport: http(destinationFork.url), + }) + await pollForReceipt( + destinationPublic, + await destinationWallet.sendTransaction({ + to: account, + value: TRANSFER, + }), + ) + + // The call under test: execute on Base, from mainnet, via ethers. + sendHash = await originClient.execute({ + account, + to: RECIPIENT_ADDRESS, + value: TRANSFER, + data: "0x", + chainId: base.id, + }) + }, TIMEOUT) + + afterAll(async () => { + await Promise.all([originFork.stop(), destinationFork.stop()]) + }) + + it( + "sends the account's execute() call through LayerZero", + async () => { + const receipt = await pollForReceipt(originPublic, sendHash) + // A send with too small a fee reverts in LayerZero's endpoint, so a + // successful transaction also shows the ethers quote was enough. + expect(receipt.status).toBe("success") + + const [sender, payload] = decodeAbiParameters( + [{ type: "address" }, { type: "bytes" }], + findSentPacket(receipt).message, + ) + // The executor calls `sender` on the destination, so this must be + // the account, not the ethers signer. + expect(isAddressMatch(sender, account)).toBe(true) + + const call = decodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + data: payload as Hex, + }) + expect(call.functionName).toBe("execute") + const [to, ...rest] = call.args as [Address, bigint, Hex, number] + expect(isAddressMatch(to, RECIPIENT_ADDRESS)).toBe(true) + expect(rest).toEqual([TRANSFER, "0x", 0]) + }, + TIMEOUT, + ) + + it( + "delivers on the destination and runs the call, within the executor gas", + async () => { + const packet = findSentPacket( + await pollForReceipt(originPublic, sendHash), + ) + const [recipientBefore, accountBefore] = await Promise.all([ + destinationPublic.getBalance({ address: RECIPIENT_ADDRESS }), + destinationPublic.getBalance({ address: account }), + ]) + + const delivery = await deliverPacket({ + packet, + publicClient: destinationPublic, + testClient: destinationTest, + rpcUrl: destinationFork.url, + gasLimit: EXECUTOR_GAS, + }) + expect(delivery.status).toBe("success") + + const [recipientAfter, accountAfter] = await Promise.all([ + destinationPublic.getBalance({ address: RECIPIENT_ADDRESS }), + destinationPublic.getBalance({ address: account }), + ]) + expect(recipientAfter - recipientBefore).toBe(TRANSFER) + expect(accountBefore - accountAfter).toBe(TRANSFER) + }, + TIMEOUT, + ) + }, +)