diff --git a/.changeset/config.json b/.changeset/config.json index 6a2dde7..1d4aa20 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": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["vite-wagmi"] } 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..ef60c81 --- /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-file: .nvmrc + 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-file: .nvmrc + 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..22bd24b 100644 --- a/.github/workflows/on-create-release.yml +++ b/.github/workflows/on-create-release.yml @@ -4,40 +4,70 @@ 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 - strategy: - matrix: - node-version: [18] 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@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-file: .nvmrc registry-url: 'https://registry.npmjs.org' + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint and format check + run: pnpm biome ci . - # Navigate to the specific package directory within the monorepo - - name: Change to package directory - run: cd packages/sdk + # @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: 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 + # 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 --access public --no-git-checks + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + NPM_CONFIG_PROVENANCE: true - - name: Publish package on NPM 📦 - run: cd packages/sdk && pnpm publish --publish-branch main --access public + - name: Publish @tokenbound/ethers 📦 + run: pnpm --filter @tokenbound/ethers publish --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} + NPM_CONFIG_PROVENANCE: true 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 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..2bd5a0a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..aea5fff --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,253 @@ +# 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 | 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 +``` + +
+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" ++ 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 — `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. + +--- + +## 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 | + +## 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. 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..02760e6 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,18 @@ 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 -- **[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 @@ -34,53 +38,67 @@ 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: - -- 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. +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`). -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` +**No environment setup is required.** The mainnet fork falls back to a public RPC endpoint -```ts copy -# VITE_ prefix is required for Vite to pick up the env vars +```bash copy +pnpm install +pnpm build +pnpm test +``` + +Running only one side, or skipping the network entirely: + +```bash copy +pnpm test:viem # @tokenbound/sdk only +pnpm test:ethers # @tokenbound/ethers only +pnpm test:unit # no Anvil, no network calls +``` -# PRIVATE KEYS CAN GO HERE -VITE_PRIVATE_ALCHEMY_API_KEY=REPLACE_WITH_YOUR_ALCHEMY_API_KEY +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`: -# 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 +USE_VERBOSE_TESTS=true pnpm test ``` -2. Build the SDK from `/packages/sdk` +### Optional: use your own RPC endpoint + +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 -pnpm clean && pnpm i && pnpm build +VITE_ANVIL_MAINNET_FORK_ENDPOINT=https://eth-mainnet.g.alchemy.com/v2/ ``` -3. Generate ABIs using [Wagmi CLI](https://wagmi.sh/cli/getting-started) +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 wagmi +VITE_ANVIL_MAINNET_FORK_BLOCK_NUMBER=25835325 ``` -For convenience, you can also execute all commands from steps 2 and 3 using `pnpm prep`. +Pinning is **off by default**, so the suites fork from the chain head. + +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. + +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. -4. Spin up an Anvil instance and start Vitest from the SDK root: +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 -pnpm test +cd packages/sdk && pnpm wagmi ``` -All unit tests will be executed. +This requires `ETHERSCAN_API_KEY` in `packages/sdk/.env.test`. ### Pre-commit Hooks @@ -94,12 +112,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 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_. +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. 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. @@ -107,38 +127,90 @@ 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, 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' 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 }) +``` + +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 -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 +218,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 +585,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/TODO.md b/TODO.md new file mode 100644 index 0000000..97cf020 --- /dev/null +++ b/TODO.md @@ -0,0 +1,82 @@ +# 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.** 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 + +- **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 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. +- **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 + +- **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. diff --git a/biome.json b/biome.json index 69a1c2e..81aec9e 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.14/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/.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/package.json b/examples/vite-wagmi-ethers-rainbowkit/package.json deleted file mode 100644 index f65610a..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "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" - } -} 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 cf75edc..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/src/App.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { ConnectButton } from "@rainbow-me/rainbowkit" -import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" - -import { Account } from "./components" - -import { parseUnits, getAddress } from "viem" -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: 5 }) - // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() - - const tokenboundClient = new TokenboundClient({ signer, chainId: 5 }) - - 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: "", - }) - - 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 792e511..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": "Node", - "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 70fd0ed..0000000 --- a/examples/vite-wagmi-ethers-rainbowkit/vite.config.ts +++ /dev/null @@ -1,24 +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", - }, - }, - define: { - global: "globalThis", - }, - 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/package.json b/examples/vite-wagmi-ethers/package.json index bfec8bc..53ecd0c 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": "catalog:", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "catalog:", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "catalog:", + "vite": "catalog:" + } } diff --git a/examples/vite-wagmi-ethers/polyfills.ts b/examples/vite-wagmi-ethers/polyfills.ts index beda33f..3078d58 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..44c87c7 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 { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" +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 { parseUnits, getAddress } from "viem" -import { useCallback, useEffect } from "react" 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: 5 }) - // or useSigner() from legacy wagmi versions: const { data: signer } = useSigner() - const tokenboundClient = new TokenboundClient({ - signer, - chainId: 5, - }) + 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: "", + 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 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) - // } + 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 || !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, 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 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, + executeTo, + 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 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 071b5fe..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' +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 }) + 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/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 81c0f98..1750192 100644 --- a/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts +++ b/examples/vite-wagmi-ethers/src/hooks/useEthersSigner.ts @@ -1,27 +1,30 @@ -import * as React from 'react' -import { type WalletClient, useWalletClient } from 'wagmi' -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 - 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..c690caf 100644 --- a/examples/vite-wagmi-ethers/src/wagmi.ts +++ b/examples/vite-wagmi-ethers/src/wagmi.ts @@ -1,17 +1,29 @@ -import { getDefaultConfig } from "connectkit"; -import { createConfig } from "wagmi"; -import { baseSepolia } from 'wagmi/chains' +import { getDefaultConfig } from "connectkit" +import type { Chain } from "viem" +import { createConfig } from "wagmi" +import { base, baseSepolia, mainnet, sepolia, zora } from "wagmi/chains" -import type { Chain } from 'viem' +// 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[]] = [baseSepolia] +const chains: readonly [Chain, ...Chain[]] = [...SUPPORTED_CHAINS] 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 792e511..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": "Node", - "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 70fd0ed..eda8ee0 100644 --- a/examples/vite-wagmi-ethers/vite.config.ts +++ b/examples/vite-wagmi-ethers/vite.config.ts @@ -1,24 +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", - }, - }, - define: { - global: "globalThis", - }, - 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/package.json b/examples/vite-wagmi-ethers6/package.json index b6ee820..d8dc0ba 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": "catalog:", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "catalog:", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "catalog:", + "vite": "catalog:" + } } diff --git a/examples/vite-wagmi-ethers6/polyfills.ts b/examples/vite-wagmi-ethers6/polyfills.ts index beda33f..3078d58 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..d6f6827 100644 --- a/examples/vite-wagmi-ethers6/src/App.tsx +++ b/examples/vite-wagmi-ethers6/src/App.tsx @@ -1,124 +1,413 @@ +import { TokenboundClient } from "@tokenbound/ethers" import { ConnectKitButton } from "connectkit" -import { useAccount } from "wagmi" -import { TokenboundClient } from "@tokenbound/sdk" +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 { parseUnits, getAddress } from "viem" -import { useCallback, useEffect } from "react" 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: 5 }) - // 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, chainId: 5 }) + 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: "", - }) + // @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 publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) + + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" - const preparedAccount = await tokenboundClient.prepareCreateAccount({ - tokenContract: "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb", - tokenId: "1", + // 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, + executeTo, + 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 071b5fe..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' +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 }) + 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/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 03d4f17..b4b802a 100644 --- a/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts +++ b/examples/vite-wagmi-ethers6/src/hooks/useEthers6Signer.ts @@ -1,27 +1,30 @@ -import * as React from 'react' -import { type WalletClient, useWalletClient } from 'wagmi' -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 - 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..865a9dd 100644 --- a/examples/vite-wagmi-ethers6/src/main.tsx +++ b/examples/vite-wagmi-ethers6/src/main.tsx @@ -1,19 +1,34 @@ +import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { ConnectKitProvider } from "connectkit" import * as React from "react" import * as ReactDOM from "react-dom/client" -import { createConfig, WagmiProvider } from "wagmi" - -import { baseSepolia } from "wagmi/chains" -import { QueryClientProvider, QueryClient } from "@tanstack/react-query" import { http } from "viem" +import { createConfig, WagmiProvider } from "wagmi" +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-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 792e511..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": "Node", - "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 70fd0ed..eda8ee0 100644 --- a/examples/vite-wagmi-ethers6/vite.config.ts +++ b/examples/vite-wagmi-ethers6/vite.config.ts @@ -1,24 +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", - }, - }, - define: { - global: "globalThis", - }, - 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/package.json b/examples/vite-wagmi-viem/package.json index 65af749..98a63bd 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": "catalog:", + "wagmi": "^2.19.5" + }, + "devDependencies": { + "@biomejs/biome": "catalog:", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "catalog:", + "vite": "catalog:" + } } diff --git a/examples/vite-wagmi-viem/polyfills.ts b/examples/vite-wagmi-viem/polyfills.ts index beda33f..3078d58 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..effe75e 100644 --- a/examples/vite-wagmi-viem/src/App.tsx +++ b/examples/vite-wagmi-viem/src/App.tsx @@ -1,19 +1,21 @@ import { ConnectButton } from "@rainbow-me/rainbowkit" -import { useAccount } from "wagmi" - -import { Account } from "./components" +import { tokenboundActions } from "@tokenbound/sdk/viem" +import { useCallback, useEffect, useMemo, useState } from "react" import { + createPublicClient, createWalletClient, - http, custom, - parseUnits, + formatEther, getAddress, - type WalletClient, + http, + isAddress, + parseAbi, + parseUnits, } from "viem" -import { baseSepolia, baseGoerli } from "viem/chains" -import { TokenboundClient } from "@tokenbound/sdk" -import { useCallback, useEffect } from "react" +import { useAccount } from "wagmi" +import { Account } from "./components" +import { SUPPORTED_CHAINS } from "./main" declare global { interface Window { @@ -21,148 +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 walletClient: WalletClient = createWalletClient({ - chain: baseSepolia, - account: address, - transport: window.ethereum ? custom(window.ethereum) : http(), - }) + 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 tokenboundClient = new TokenboundClient({ - walletClient, - chainId: baseSepolia.id, - // implementationAddress: '0x2d25602551487c3f3354dd80d76d54383a243358', - }) + const chain = useMemo( + () => SUPPORTED_CHAINS.find((c) => c.id === chainId) ?? SUPPORTED_CHAINS[0], + [chainId], + ) - useEffect(() => { - async function testTokenboundClass() { - if (!tokenboundClient) return + // 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 = useMemo( + () => + createWalletClient({ + chain, + account: address, + transport: window.ethereum ? custom(window.ethereum) : http(), + }).extend(tokenboundActions()), + [chain, address], + ) - const tokenboundAccount = tokenboundClient.getAccount({ - tokenContract: originNFT.tokenContract, - tokenId: originNFT.tokenId, - }) + const publicClient = useMemo( + () => createPublicClient({ chain, transport: http() }), + [chain], + ) - const preparedExecution = await tokenboundClient.prepareExecution({ - account: tokenboundAccount, - to: recipientAddress, - value: 0n, - data: "", - }) + const nftIsValid = isAddress(tokenContract) && tokenId.trim() !== "" - const preparedCreateAccount = await tokenboundClient.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) - // } + // 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 [nftOwner, setNftOwner] = useState() + const [isDeployed, setIsDeployed] = useState() + const [tbaBalance, setTbaBalance] = useState() + const [status, setStatus] = useState() - testTokenboundClass() - }, [tokenboundClient]) - - 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 crossChainTransferETH = useCallback(async () => { - if (!tokenboundClient || !address) return - - const execution = { - account: sendingTBA, - to: originNFT.tokenContract, - value: 0n, - data: "", - chain: baseGoerli, + // 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 executedCallTxHash = await tokenboundClient.execute(execution) + const isOwner = + !!nftOwner && !!address && nftOwner.toLowerCase() === address.toLowerCase() - executedCallTxHash && - alert(`Sent blank tx on ${baseGoerli.name}: ${executedCallTxHash}`) - }, [tokenboundClient, address]) + 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: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), + data: "0x", + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + executeTo, + address, + tokenContract, + ethAmount, + ], + ) + + 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, + ], + ) + + // 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], + ) + + 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, + ], + ) + + // 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 + + 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 walletClient + ConnectKit + Vite

+

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 071b5fe..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' +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 }) + 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/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..e002bfb 100644 --- a/examples/vite-wagmi-viem/src/main.tsx +++ b/examples/vite-wagmi-viem/src/main.tsx @@ -1,23 +1,55 @@ 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 { base, baseSepolia, mainnet, sepolia, zora } 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 + +// 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 + // to this alone, which is why Coinbase and WalletConnect are added below. + injected(), + coinbaseWallet({ appName: "Tokenbound SDK Example" }), + ...(walletConnectProjectId + ? [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-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 792e511..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": "Node", - "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 70fd0ed..eda8ee0 100644 --- a/examples/vite-wagmi-viem/vite.config.ts +++ b/examples/vite-wagmi-viem/vite.config.ts @@ -1,24 +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", - }, - }, - define: { - global: "globalThis", - }, - 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-wagmi3-viem/package.json b/examples/vite-wagmi3-viem/package.json new file mode 100644 index 0000000..2d4a762 --- /dev/null +++ b/examples/vite-wagmi3-viem/package.json @@ -0,0 +1,30 @@ +{ + "name": "vite-wagmi3-viem", + "version": "0.0.0", + "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/sdk": "workspace:^", + "buffer": "^6.0.3", + "process": "^0.11.10", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "util": "^0.12.5", + "viem": "catalog:", + "wagmi": "^3.7.7" + }, + "devDependencies": { + "@biomejs/biome": "catalog:", + "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "typescript": "catalog:", + "vite": "catalog:" + } +} diff --git a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts b/examples/vite-wagmi3-viem/polyfills.ts similarity index 50% rename from examples/vite-wagmi-ethers-rainbowkit/polyfills.ts rename to examples/vite-wagmi3-viem/polyfills.ts index beda33f..3078d58 100644 --- a/examples/vite-wagmi-ethers-rainbowkit/polyfills.ts +++ b/examples/vite-wagmi3-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-wagmi3-viem/src/App.tsx b/examples/vite-wagmi3-viem/src/App.tsx new file mode 100644 index 0000000..68161a4 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/App.tsx @@ -0,0 +1,440 @@ +import { tokenboundActions } from "@tokenbound/sdk/viem" +import { useCallback, useEffect, useMemo, useState } from "react" + +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 { + ethereum?: any // CoinbaseWalletSDK also defines window.ethereum, so we have to work around that :( + } +} + +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 [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 = useMemo( + () => + createWalletClient({ + chain, + account: address, + transport: window.ethereum ? custom(window.ethereum) : http(), + }).extend(tokenboundActions()), + [chain, address], + ) + + 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) return undefined + try { + return tokenboundClient.tokenbound.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() + + // 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: getAddress(executeTo || address || tokenContract), + value: parseUnits(ethAmount || "0", 18), + data: "0x", + }) + }), + [ + run, + tokenboundClient, + tokenboundAccount, + executeTo, + address, + tokenContract, + ethAmount, + ], + ) + + 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, + ], + ) + + // 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], + ) + + 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, + ], + ) + + // 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 + + 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 && } + +
+
+

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 new file mode 100644 index 0000000..c6bee76 --- /dev/null +++ b/examples/vite-wagmi3-viem/src/components/Account.tsx @@ -0,0 +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 }) + + if (!ensName) return null + + return
{ensName}
+} 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..206d61e --- /dev/null +++ b/examples/vite-wagmi3-viem/src/main.tsx @@ -0,0 +1,65 @@ +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 { base, baseSepolia, mainnet, sepolia, zora } 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 + +// 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: SUPPORTED_CHAINS, + 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(), + [sepolia.id]: http(), + [base.id]: http(), + [mainnet.id]: http(), + [zora.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 71d7621..71ff457 100644 --- a/package.json +++ b/package.json @@ -1,26 +1,34 @@ { - "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: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 typecheck && pnpm --filter @tokenbound/ethers typecheck", + "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": "catalog:", + "@changesets/cli": "^2.26.2", + "husky": "^8.0.3", + "typescript": "catalog:" + }, + "pnpm": { + "overrides": { + "@walletconnect/logger>pino": "10.0.0" + } + } } diff --git a/packages/ethers/README.md b/packages/ethers/README.md new file mode 100644 index 0000000..823949c --- /dev/null +++ b/packages/ethers/README.md @@ -0,0 +1,129 @@ +# @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 +``` + +
+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 +`@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 + +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.getSDKVersion() // this package's version, e.g. "0.1.0" +``` + +## Limitations + +- The signer must be connected to a Provider for any read operation. + +- `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/package.json b/packages/ethers/package.json new file mode 100644 index 0000000..966b448 --- /dev/null +++ b/packages/ethers/package.json @@ -0,0 +1,76 @@ +{ + "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/index.cjs", + "module": "./dist/index.js", + "exports": { + ".": { + "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 && tsdown", + "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 .", + "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: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": { + "@tokenbound/sdk": "workspace:^" + }, + "peerDependencies": { + "ethers": "^5.7.2 || ^6.0.0", + "viem": "^2.57.7" + }, + "devDependencies": { + "@biomejs/biome": "catalog:", + "@tokenbound/test-fixtures": "workspace:*", + "ethers": "^5.8.0", + "ethers6": "npm:ethers@^6.17.0", + "tsdown": "catalog:", + "typescript": "catalog:", + "viem": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + } +} diff --git a/packages/ethers/src/TokenboundClient.ts b/packages/ethers/src/TokenboundClient.ts new file mode 100644 index 0000000..cfe0024 --- /dev/null +++ b/packages/ethers/src/TokenboundClient.ts @@ -0,0 +1,426 @@ +// 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 CallData, + type CreateAccountParams, + deconstructBytecode as deconstructBytecodeFromHex, + ERC_6551_DEFAULT, + type ERC20TransferParams, + type ETHTransferParams, + type ExecuteParams, + encodeCrossChainCall, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeExecution, + encodeNFTTransfer, + type GetAccountParams, + getAccountAddress, + getImplementationName, + 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" +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" + +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 + implementationAddress?: Address + registryAddress?: Address + version?: TBImplementationVersion +} + +// 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, +} + +// 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 + 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, 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.") + } + + this.chain = chain + this.adapter = resolveAdapter(signer) + + this.deployment = resolveDeployment({ + implementationAddress, + registryAddress, + 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 + } + + /** This package's version. Mirrors @tokenbound/sdk's getSDKVersion(). */ + public getSDKVersion(): string { + return TB_ETHERS_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. + * + * 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 + + if (!this.deployment.supportsV3) { + return await this.prepareExecuteCall(params) + } + + if (chainId !== this.chainId) { + 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({ + 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 data = encodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "isValidSigner", + args: [signerAddress, numberToHex(0, { size: 32 })], + }) + + // 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. */ + public async checkAccountDeployment({ + accountAddress, + }: { + accountAddress: Address + }): Promise { + 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. */ + public async deconstructBytecode({ + accountAddress, + }: { + accountAddress: Address + }): Promise { + const bytecode = await this.adapter.getCode(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: NFTTransferParams): 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: 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: ERC20TransferParams): 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
{ + if (!recipientAddress.endsWith(".eth")) { + return getAddress(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 getAddress(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 Address, + value: tx.value ?? 0n, + data: tx.data as Hex, + }) + } +} diff --git a/packages/ethers/src/adapter.ts b/packages/ethers/src/adapter.ts new file mode 100644 index 0000000..626a2ab --- /dev/null +++ b/packages/ethers/src/adapter.ts @@ -0,0 +1,125 @@ +// 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 { + Address, + 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: Address + value: bigint + data: Hex + }) => Promise + /** Signs a message, normalizing it for the detected ethers version. */ + signMessage: (message: EthersSignableMessage) => Promise + /** Returns the signer's address. */ + 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. */ +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] + + /** + * 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, + 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 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 + }, + } +} + +/** + * 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..9d9e18b --- /dev/null +++ b/packages/ethers/src/index.ts @@ -0,0 +1,27 @@ +// @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 ERC20TransferParams, + type ETHTransferParams, + type ExecuteParams, + type GetAccountParams, + type NFTTransferParams, + 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/TestAllEthers.test.ts b/packages/ethers/src/test/TestAllEthers.test.ts new file mode 100644 index 0000000..01d1ef4 --- /dev/null +++ b/packages/ethers/src/test/TestAllEthers.test.ts @@ -0,0 +1,994 @@ +// 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, + createForkInstance, + ECDSA_SIGNATURE_REGEX, + ENS_NAME, + isAddressMatch, + RECIPIENT_ADDRESS, + TX_HASH_REGEX, + testLog, + WETH_CONTRACT_ADDRESS, + weth, + zora721, + zora1155, +} from "@tokenbound/test-fixtures" +import { ethers } from "ethers" +import { JsonRpcProvider, JsonRpcSigner } 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 = createForkInstance() + const rpcUrl = anvil.url + + 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), + ) + } + // 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), + ) + } + + /** + * 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)], + }), + }) + 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, + } + + // `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". + } + + /** 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 + } + + /** 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), + ], + }), + }) + 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) + } + + /** + * 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", () => { + // Mirrors @tokenbound/sdk's getSDKVersion(), so a consumer migrating + // between the two does not lose the method. + expect(tokenboundClient.getSDKVersion()).toMatch(/^\d+\.\d+\.\d+/) + }) + }) + + 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 getReceipt(txHash) + + 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 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.isRegistryDeployed).toEqual(true) + expect(status.isImplementationDeployed).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({ + 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), + }) + await getReceipt(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 getReceipt(hash) + expect(receipt.status).toBe("success") + }, + 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 getReceipt(hash) + 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 getReceipt(hash) + 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 getReceipt(hash) + expect(receipt.status).toBe("success") + + 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 getReceipt(hash) + + 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 getReceipt(hash) + + 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 getReceipt(hash) + + 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 getReceipt(hash) + + 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 getReceipt(depositHash) + + 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 getReceipt(hash) + + 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("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/TestAllEthersV2.test.ts b/packages/ethers/src/test/TestAllEthersV2.test.ts new file mode 100644 index 0000000..427f726 --- /dev/null +++ b/packages/ethers/src/test/TestAllEthersV2.test.ts @@ -0,0 +1,265 @@ +// V2-SPECIFIC assertions for @tokenbound/ethers. +// +// 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, + createForkInstance, + isAddressMatch, + TX_HASH_REGEX, + zora721, +} from "@tokenbound/test-fixtures" +import { ethers } from "ethers" +import { JsonRpcProvider, JsonRpcSigner } from "ethers6" +import { + createPublicClient, + encodeFunctionData, + getAddress, + type Hex, + http, + isAddress, + type PublicClient, +} from "viem" +import { mainnet } from "viem/chains" +import { afterAll, beforeAll, describe, expect, it } from "vitest" +import { TokenboundClient } from "../index" + +const TIMEOUT = 60000 + +describe.each([{ version: 5 as const }, { version: 6 as const }])( + "ethers v$version — ERC-6551 V2 deployment", + ({ version }) => { + // 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 = createForkInstance() + const rpcUrl = anvil.url + + let publicClient: PublicClient + 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() + + 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 JsonRpcSigner( + new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[0].address), + ) + + // Pin the legacy V2 deployment. + tokenboundClient = new TokenboundClient({ + signer, + chain: mainnet, + version: TBVersion.V2, + }) + + // Mint the NFT that controls the account. + const mint = await signer.sendTransaction({ + to: zora721.proxyContractAddress, + value: 0n, + data: encodeFunctionData({ + abi: zora721.abi, + functionName: "purchase", + args: [1n], + }), + }) + const receipt = await getReceipt(mint.hash as Hex) + const transferLog = receipt.logs.find( + (log) => + isAddressMatch(log.address, zora721.proxyContractAddress) && + 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("derives a V2 account address", () => { + const account = tokenboundClient.getAccount({ + tokenContract: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + 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 JsonRpcSigner( + new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[1].address), + ), + chain: mainnet, + }) + + expect( + v3Client.getAccount({ + tokenContract: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + tokenId, + }) + expect(account).toMatch(ADDRESS_REGEX) + expect(txHash).toMatch(TX_HASH_REGEX) + + const receipt = await getReceipt(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: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + 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: zora721.proxyContractAddress, + tokenId, + appendedCalls: [ + { + target: getAddress(zora721.proxyContractAddress), + allowFailure: false, + callData: "0x", + }, + ], + }), + ).rejects.toThrow(/Multicall via appendedCalls is not supported/) + }) + }, +) diff --git a/packages/ethers/src/test/TestCrossChain.test.ts b/packages/ethers/src/test/TestCrossChain.test.ts new file mode 100644 index 0000000..2a308d6 --- /dev/null +++ b/packages/ethers/src/test/TestCrossChain.test.ts @@ -0,0 +1,177 @@ +// 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, + CROSS_CHAIN_SENDER_NFT, + createForkInstance, + RECIPIENT_ADDRESS, +} from "@tokenbound/test-fixtures" +import { ethers } from "ethers" +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" + +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 = createForkInstance() + const rpcUrl = anvil.url + + 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 JsonRpcSigner( + new JsonRpcProvider(rpcUrl), + getAddress(ANVIL_ACCOUNTS[0].address), + ) + + 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/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, + ) + }, +) diff --git a/packages/ethers/src/test/TestEthersVersions.test.ts b/packages/ethers/src/test/TestEthersVersions.test.ts new file mode 100644 index 0000000..2062e1f --- /dev/null +++ b/packages/ethers/src/test/TestEthersVersions.test.ts @@ -0,0 +1,199 @@ +// 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"), + // 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, +}) + +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("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") + 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/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/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/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/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/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/.env.example b/packages/sdk/.env.example index b34adf4..4e6546e 100644 --- a/packages/sdk/.env.example +++ b/packages/sdk/.env.example @@ -1,10 +1,45 @@ -# 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 (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/ -# 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/sdk/README.md b/packages/sdk/README.md index e9387c3..9f4b264 100644 --- a/packages/sdk/README.md +++ b/packages/sdk/README.md @@ -1,90 +1,229 @@ # @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 viem +``` + +
+pnpm / yarn / bun + +```bash +pnpm add @tokenbound/sdk viem +``` + +```bash +yarn add @tokenbound/sdk viem +``` ```bash -$ npm install @tokenbound/sdk +bun add @tokenbound/sdk viem +``` + +
+ +`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) + +`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" +import { mainnet } from "viem/chains" +import { tokenboundActions } from "@tokenbound/sdk/viem" + +const client = createWalletClient({ + chain: mainnet, + 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 }) + +// 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( + `Missing: ${status.isRegistryDeployed ? "" : "registry "}` + + `${status.isImplementationDeployed ? "" : "implementation"}`, + ) +} ``` -# Usage +`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 | -### Instantiate TokenboundClient +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. -Using viem's WalletClient: +#### 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 +}) -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -import { goerli } from 'viem/chains' -const tokenboundClient = new TokenboundClient({ walletClient, chainId: goerli.id }); +await client.tokenbound.execute({ + account, + to: "0x...", + value: 0n, + data: "0x", +}) ``` -or, with a legacy Wagmi / Ethers signer: +#### 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: -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -const tokenboundClient = new TokenboundClient({ signer, chainId: 1 }); +```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' ``` -### Get account address +#### Available methods + +| Any client | Requires an account | +| --- | --- | +| `getAccount` | `createAccount` | +| `prepareCreateAccount` | `execute` | +| `prepareExecution` | `transferNFT` | +| `checkAccountDeployment` | `transferETH` | +| `checkProtocolDeployment` | `transferERC20` | +| `deconstructBytecode` | `signMessage` | +| `getNFT` | | +| `isValidSigner` | | -```javascript -import { TokenboundClient } from "@tokenbound/sdk"; -import { goerli } from 'viem/chains'; -const tokenboundClient = new TokenboundClient({ walletClient, chainId: goerli.id }); +### The TokenboundClient class -const tokenBoundAccount = tokenboundClient.getAccount({ +```ts +import { TokenboundClient } from "@tokenbound/sdk" +import { mainnet } from "viem/chains" + +const tokenboundClient = new TokenboundClient({ walletClient, chain: mainnet }) + +const tokenboundAccount = tokenboundClient.getAccount({ tokenContract: "", tokenId: "", -}); +}) ``` -### Encode call to account +`chain` is required — pass a viem `Chain`, not a chain id. -```javascript -import { prepareExecuteCall } from "@tokenbound/sdk"; +### Encode a call to an account -const to = "0xe7134a029cd2fd55f678d6809e64d0b6a0caddcb"; // any address -const value = 0n; // amount of ETH to send in WEI -const data = ""; // calldata - -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 - -The SDK supports custom 6551 implementations. - -If you've deployed your own implementation, you can optionally pass custom configuration parameters when instantiating your TokenboundClient: +### Custom implementations -```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: "", }) +``` + +The same options are accepted by the client extension: -### Documentation +```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 24e2027..b6d8cba 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,25 +1,79 @@ { "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", + "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": { ".": { - "import": "./dist/tokenbound-sdk.js", - "require": "./dist/tokenbound-sdk.umd.cjs", - "types": "./dist/src/index.d.ts" - } + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./viem": { + "import": { + "types": "./dist/viem.d.ts", + "default": "./dist/viem.js" + }, + "require": { + "types": "./dist/viem.d.cts", + "default": "./dist/viem.cjs" + } + }, + "./protocol": { + "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", - "test": "vitest --watch=false", + "build": "tsc && tsdown", + "test": "pnpm typecheck && vitest --watch=false", "coverage": "vitest run --coverage", "clean": "rm -rf node_modules/ dist/", "wagmi": "wagmi generate", @@ -27,37 +81,25 @@ "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": "^2.3.7", - "viem": "^2.21.32" + "@layerzerolabs/lz-v2-utilities": "^3.0.168" }, "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", - "@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", - "typescript": "^5.4.5", - "viem": "^2.21.32", - "wagmi": "^2.12.20", - "vite": "^4.4.9", - "vite-plugin-dts": "^3.9.0", - "vitest": "^1.6.0", - "rollup-plugin-visualizer": "^5.12.0" + "@biomejs/biome": "catalog:", + "@tokenbound/test-fixtures": "workspace:*", + "@vitest/coverage-v8": "^1.6.1", + "@wagmi/cli": "^2.10.0", + "rollup-plugin-visualizer": "^5.12.0", + "tsdown": "catalog:", + "typescript": "catalog:", + "viem": "catalog:", + "vite": "catalog:", + "vitest": "catalog:" + }, + "peerDependencies": { + "viem": "^2.57.7" } } diff --git a/packages/sdk/src/TokenboundClient.ts b/packages/sdk/src/TokenboundClient.ts index 915b67c..fa6e32f 100644 --- a/packages/sdk/src/TokenboundClient.ts +++ b/packages/sdk/src/TokenboundClient.ts @@ -1,80 +1,61 @@ import { - type WalletClient, - type PublicClient, + type Address, type Chain, createPublicClient, - http, - type GetBytecodeReturnType, - hexToNumber, - getAddress, + custom, encodeFunctionData, - parseUnits, - type SignableMessage, - isAddressEqual, + 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, + hasBytecode, + 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 { getImplementationName, resolvePossibleENS } from "./utils" 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" + checkProtocolDeployment, + 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 @@ -82,21 +63,20 @@ declare global { } class TokenboundClient { - private chainId: number 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 + + /** Always the configured chain's id; derived rather than stored separately. */ + private get chainId(): number { + return this.chain.id + } constructor(options: TokenboundClientOptions) { const { - chainId, chain, - signer, walletClient, publicClient, implementationAddress, @@ -105,13 +85,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 +97,13 @@ class TokenboundClient { ) } - if (!ERC_6551_DEFAULT.ACCOUNT_PROXY) { - throw new Error("ERC_6551_DEFAULT.ACCOUNT_PROXY is undefined") - } + this.chain = chain + this.walletClient = walletClient - this.chainId = chainId ?? (chain?.id as number) - this.chain = chain ?? chainIdToChain(this.chainId) - - if (signer) { - this.signer = signer - } else if (walletClient) { - 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 +114,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 +128,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 +166,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 +178,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 +191,10 @@ class TokenboundClient { appendedCalls = [], } = params - const getAcct = this.supportsV3 ? getTokenboundV3Account : computeAccount - - const computedAcct = getAcct( - tokenContract, - tokenId, - chainId, - this.implementationAddress, - this.registryAddress, - salt, - ) - - 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, + return await prepareCreateAccountTx( + { tokenContract, tokenId, chainId, salt, appendedCalls }, + this.deployment, ) - - 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 +205,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 +213,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 +231,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 +255,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 +280,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 +291,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) } @@ -456,11 +313,19 @@ 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, - data: data as `0x${string}`, + data: data as Hex, originChainId: this.chainId, destinationChainId: chainId, }) @@ -490,32 +355,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 +370,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", ) @@ -557,11 +398,26 @@ class TokenboundClient { public async checkAccountDeployment({ accountAddress, }: BytecodeParams): Promise { - return await this.publicClient - .getBytecode({ address: accountAddress }) - .then((bytecode: GetBytecodeReturnType) => { - 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, + }) } /** @@ -572,45 +428,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 +461,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 +470,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,51 +481,21 @@ 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 = { - account: tbAccountAddress, - to: tokenContract, - value: BigInt(0), - data: transferCallData, - } + const recipient = await resolvePossibleENS( + this.publicClient, + recipientAddress, + ) - if (this.supportsV3) { - return await this.execute({ - ...execution, - chainId, - }) - } + const transfer = encodeNFTTransfer({ + account: tbAccountAddress, + tokenType, + tokenContract, + tokenId, + recipient, + amount, + }) - return await this.executeCall(execution) - } catch (error) { - console.log(error) - throw error - } + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } /** @@ -713,39 +505,22 @@ 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( - this.publicClient, - recipientAddress, - ) + const recipient = await resolvePossibleENS( + this.publicClient, + 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) - } catch (err) { - console.log(err) - throw err - } + return await this.executeTransfer(tbAccountAddress, transfer, chainId) } /** @@ -757,9 +532,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,41 +542,37 @@ 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) + const recipient = await resolvePossibleENS( + this.publicClient, + recipientAddress, + ) - try { - const recipient = await resolvePossibleENS( - this.publicClient, - recipientAddress, - ) + const transfer = encodeERC20Transfer({ + recipient, + amount, + erc20tokenAddress, + erc20tokenDecimals, + }) - const callData = encodeFunctionData({ - abi: erc20Abi, - functionName: "transfer", - args: [recipient, amountBaseUnit], - }) + return await this.executeTransfer(tbAccountAddress, transfer, chainId) + } - const execution = { - account: tbAccountAddress, - to: erc20tokenAddress, - value: 0n, - data: callData, - } + /** 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.supportsV3) { - return await this.execute({ - ...execution, - chainId, - }) - } - return await this.executeCall(execution) - } catch (error) { - console.log(error) - throw error + if (this.deployment.supportsV3) { + return await this.execute({ ...execution, chainId }) } + return await this.executeCall(execution) } /** @@ -811,37 +580,20 @@ class TokenboundClient { * @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, - }) - } - throw new Error("No wallet client or signer available.") - } 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, + }) } } + 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 +601,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/crossChain.ts b/packages/sdk/src/functions/crossChain.ts deleted file mode 100644 index 9e46746..0000000 --- a/packages/sdk/src/functions/crossChain.ts +++ /dev/null @@ -1,64 +0,0 @@ -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" - -type CrossChainCallParams = { - publicClient: PublicClient - account: `0x${string}` - originChainId: number - destinationChainId: number -} & CallData - -export async function encodeCrossChainCall( - params: CrossChainCallParams, -): Promise { - const { - originChainId, - destinationChainId, - to, - value, - data, - account, - publicClient, - } = params - - const lzExecutorAbi = parseAbi([ - "function quote(uint32 eid, address sender, bytes calldata payload, bytes calldata options) external view returns (uint256 nativeFee, uint256 lzTokenFee)", - "function execute(uint32 eid, bytes calldata payload, bytes calldata options) external payable", - ]) - - const lzExecutor = LZ_EXECUTORS[originChainId] - const lzEid = LZ_EIDS[destinationChainId] - - const destinationExecutionData = encodeFunctionData({ - abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, - functionName: "execute", - args: [to, value, data, 0], - }) - - const txOptions = Options.newOptions().addExecutorLzReceiveOption(200000, 0) - - const txOptionsHex = txOptions.toHex() as `0x${string}` - - const quoteData = await publicClient.readContract({ - address: lzExecutor, - abi: lzExecutorAbi, - functionName: "quote", - args: [lzEid, account, destinationExecutionData, txOptionsHex], - }) - - const txValue = quoteData.at(0) || 0n - - const encodedLzCall = encodeFunctionData({ - abi: lzExecutorAbi, - functionName: "execute", - args: [lzEid, destinationExecutionData, txOptionsHex], - }) - - return { - to: lzExecutor, - value: txValue + 10n, - data: encodedLzCall, - } -} 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..637a58e 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,84 +1,78 @@ -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, + encodeCrossChainCall, + encodeERC20Transfer, + encodeETHTransfer, + encodeExecuteCall, + encodeExecution, + encodeNFTTransfer, + getAccountAddress, getCreationCode, - prepareExecuteCall, + hasBytecode, + isCustomImplementation, + type ProtocolCaller, + type ProtocolDeploymentStatus, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + toProtocolDeploymentStatus, + 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, + PossibleENSAddress, + PrepareCreateAccountParams, + PrepareExecuteCallParams, + PrepareExecutionParams, + Prettify, SegmentedERC6551Bytecode, -} + SignMessageParams, + TBAccountParams, + TBImplementationVersion, + TokenboundAccountNFT, + TokenboundClientOptions, + ValidSignerParams, +} from "./types" +export { CALL_OPERATIONS, TBVersion } from "./types" +export { getImplementationName } from "./utils/getImplementationName" 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..7a48918 --- /dev/null +++ b/packages/sdk/src/protocol/core.ts @@ -0,0 +1,352 @@ +// 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, + } +} + +/** 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 +} + +/** + * 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`. */ + isRegistryDeployed: boolean + /** True when the account implementation is live at `implementationAddress`. */ + isImplementationDeployed: boolean + /** True only when both contracts are present. */ + isFullyDeployed: boolean + registryAddress: Address + implementationAddress: Address +} + +/** Builds the deployment status from two already-fetched bytecode results. */ +export function toProtocolDeploymentStatus(params: { + registryCode: Hex | undefined | null + implementationCode: Hex | undefined | null + registryAddress: Address + implementationAddress: Address +}): ProtocolDeploymentStatus { + const isRegistryDeployed = hasBytecode(params.registryCode) + const isImplementationDeployed = hasBytecode(params.implementationCode) + return { + isRegistryDeployed, + isImplementationDeployed, + isFullyDeployed: isRegistryDeployed && isImplementationDeployed, + registryAddress: params.registryAddress, + implementationAddress: params.implementationAddress, + } +} + +/** + * 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/protocol/functions/crossChain.ts b/packages/sdk/src/protocol/functions/crossChain.ts new file mode 100644 index 0000000..d1ea32e --- /dev/null +++ b/packages/sdk/src/protocol/functions/crossChain.ts @@ -0,0 +1,107 @@ +import { Options } from "@layerzerolabs/lz-v2-utilities" +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< + { + caller: ProtocolCaller + account: `0x${string}` + originChainId: number + destinationChainId: number + } & CallData +> + +export async function encodeCrossChainCall( + params: CrossChainCallParams, +): Promise { + const { + originChainId, + destinationChainId, + to, + value, + data, + account, + caller, + } = params + + const lzExecutorAbi = parseAbi([ + "function quote(uint32 eid, address sender, bytes calldata payload, bytes calldata options) external view returns (uint256 nativeFee, uint256 lzTokenFee)", + "function execute(uint32 eid, bytes calldata payload, bytes calldata options) external payable", + ]) + + const lzExecutor = LZ_EXECUTORS[originChainId] + const lzEid = LZ_EIDS[destinationChainId] + + const destinationExecutionData = encodeFunctionData({ + abi: ERC_6551_DEFAULT.IMPLEMENTATION.ABI, + functionName: "execute", + args: [to, value, data, 0], + }) + + const txOptions = Options.newOptions().addExecutorLzReceiveOption(200000, 0) + + const txOptionsHex = txOptions.toHex() as `0x${string}` + + // 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", + data: quoteResult, + }) + + const txValue = nativeFee ?? 0n + + const encodedLzCall = encodeFunctionData({ + abi: lzExecutorAbi, + functionName: "execute", + args: [lzEid, destinationExecutionData, txOptionsHex], + }) + + return { + to: lzExecutor, + value: txValue + 10n, + data: encodedLzCall, + } +} 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 deleted file mode 100644 index 14a05fe..0000000 --- a/packages/sdk/src/test/TestAll.test.ts +++ /dev/null @@ -1,1204 +0,0 @@ -// This suite tests Tokenbound SDK methods with -// viem walletClient + publicClient and Ethers 5/6. - -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, - createWalletClient, - http, - getAddress, - encodeFunctionData, - type Log, - parseUnits, - formatEther, - getContract, - encodeAbiParameters, - parseAbiParameters, - isAddress, - isHex, -} from "viem" -import { privateKeyToAccount } from "viem/accounts" -import { - ADDRESS_REGEX, - ANVIL_ACCOUNTS, - ANVIL_RPC_URL, - WETH_CONTRACT_ADDRESS, -} from "./constants" -import { resolvePossibleENS } from "../utils" -import { - ethToWei, - getPublicClient, - getWETHBalance, - // 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) -const ANVIL_USER_1 = getAddress(ANVIL_ACCOUNTS[1].address) - -const walletClient = createWalletClient({ - transport: http(ANVIL_RPC_URL), - chain: ANVIL_CONFIG.ACTIVE_CHAIN, - 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) - -type TestConfig = { - testName: string - walletClient?: WalletClient - signer?: any - version?: TBImplementationVersion -} - -const ENABLED_TESTS: Array = [ - { - testName: "viem v2", - 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 }) => { - 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 }) - const CUSTOM_SALT = 6551 - let tokenboundClient: TokenboundClient - let publicClient: PublicClient - let NFT_IN_EOA: CreateAccountParams - let NFT_FOR_MULTICALL_CREATE: CreateAccountParams - 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: `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 - 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 - : ERC6551_DEPLOYMENT.IMPLEMENTATION.ADDRESS, - registryAddress: isV3 - ? undefined - : ERC6551_DEPLOYMENT.REGISTRY.ADDRESS, - }) - - await anvil.start() - console.log(`START → \x1b[94m ${testName} \x1b[0m`) - } catch (err) { - console.error("Error during setup:", err) - } - }, TIMEOUT) - - afterAll(async () => { - await anvil.stop() - 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[] = [] - - // 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, - } - } - }, - }) - - // Prepare mint transaction - const encodedMintFunctionData = encodeFunctionData({ - abi: zora721.abi, - functionName: "purchase", - args: [BigInt(zora721.quantity)], - }) - - const prepared721Mint = { - to: zora721.proxyContractAddress, - value: zora721.mintPrice * BigInt(zora721.quantity), - data: encodedMintFunctionData, - } - - let mintTxHash: `0x${string}` - - 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) - } - - 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", - }) - - 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, - }) - - 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) - - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) - - 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 chainId", - async () => { - const HARDHAT_CHAIN_ID = 31337 - - const { account, txHash } = await tokenboundClient.createAccount({ - ...NFT_IN_EOA, - chainId: HARDHAT_CHAIN_ID, - }) - console.log("CREATED ACCT WITH CUSTOM CHAIN ID", account) - - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) - - const bytecode = await tokenboundClient.deconstructBytecode({ - accountAddress: account, - }) - - if (!bytecode) return false - - const { chainId } = bytecode - - console.log("CHAINID OF CREATED ACCT", chainId) - - expect(isAddress(account)).toEqual(true) - expect(createdAccountTxReceipt.status).toBe("success") - expect(chainId).toBe(HARDHAT_CHAIN_ID) - }, - TIMEOUT, - ) - - v3OnlyIt( - "can createAccount and append multicall transaction(s) that use the deployed TBA", - async () => { - const multicallTBAAddress = tokenboundClient.getAccount( - NFT_FOR_MULTICALL_CREATE, - ) - - // Perform a simple ERC20 balanceOf call to test the appended multicall transaction - const encodedBalanceOfFunctionData = encodeFunctionData({ - abi: erc20Abi, - functionName: "balanceOf", - args: [multicallTBAAddress], - }) - - const preparedBalanceOfByTBA = await tokenboundClient.prepareExecution({ - account: multicallTBAAddress, - to: WETH_CONTRACT_ADDRESS, - value: 0n, - data: encodedBalanceOfFunctionData, - }) - - const appendedCall: Call3 = { - target: multicallTBAAddress, // Execute with TBA - allowFailure: false, - callData: preparedBalanceOfByTBA.data, - } - - const { account, txHash } = await tokenboundClient.createAccount({ - ...NFT_FOR_MULTICALL_CREATE, - appendedCalls: [appendedCall], - }) - console.log("CREATED ACCT WITH MULTICALL", account) - - const createdAccountTxReceipt = - await publicClient.waitForTransactionReceipt({ - hash: txHash, - }) - - ZORA721_TBA_ADDRESS_MULTICALL = account - await vi.waitFor(() => { - expect(account).toMatch(ADDRESS_REGEX) - expect(createdAccountTxReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) - - it("can checkAccountDeployment for the created account", async () => { - const isAccountDeployed = await tokenboundClient.checkAccountDeployment({ - accountAddress: ZORA721_TBA_ADDRESS, - }) - - console.log(`isAccountDeployed ${testName}`, isAccountDeployed) - - expect(isAccountDeployed).toEqual(true) - }) - - it("can getNFT for the created account", async () => { - const nft = await tokenboundClient.getNFT({ - accountAddress: ZORA721_TBA_ADDRESS, - }) - - if (!nft) throw new Error("Bytecode is undefined") - - const { chainId, tokenContract, tokenId } = nft - - expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) - expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) - expect(tokenId).toEqual(NFT_IN_EOA.tokenId) - }) - - it("can deconstructBytecode for the created account", async () => { - const bytecode = await tokenboundClient.deconstructBytecode({ - accountAddress: ZORA721_TBA_ADDRESS, - }) - - 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, - ) - } - - 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", async () => { - const getAccount = tokenboundClient.getAccount(NFT_IN_EOA) - await vi.waitFor(() => { - expect(getAccount).toMatch(ADDRESS_REGEX) - expect(getAccount).toEqual(ZORA721_TBA_ADDRESS) - }) - }) - - it("can getAccount with a custom salt", async () => { - const getAccount = tokenboundClient.getAccount({ - ...NFT_IN_EOA, - salt: CUSTOM_SALT, - }) - await vi.waitFor(() => { - expect(getAccount).toMatch(ADDRESS_REGEX) - expect(getAccount).toEqual(ZORA721_TBA_ADDRESS_CUSTOM_SALT) - }) - }) - - // 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, - ) - - const transferCallData = encodeFunctionData({ - abi: zora721.abi, - functionName: "safeTransferFrom", - args: [ - ANVIL_USER_0, // from - ZORA721_TBA_ADDRESS, // to - BigInt(TOKENID1_IN_TBA), // tokenId - ], - }) - - const preparedNFTTransfer = { - to: zora721.proxyContractAddress, - value: 0n, - data: transferCallData, - } - - let transferHash: `0x${string}` - - if (walletClient) { - if (!walletClient.account?.address) { - throw new Error("walletClient.account.address is undefined") - } - 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, - ...preparedNFTTransfer, - }) - - transferHash = tx.hash - } - - const transactionReceipt = await publicClient.waitForTransactionReceipt( - { - hash: transferHash, - }, - ) - - 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 - ], - }) - - const preparedNFTTransfer = { - to: zora721.proxyContractAddress, - value: 0n, - data: transferCallData, - } - - let transferHash: `0x${string}` - - if (walletClient) { - if (!walletClient.account?.address) { - throw new Error("walletClient.account.address is undefined") - } - 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, - ...preparedNFTTransfer, - }) - transferHash = tx.hash - } - - const transactionReceipt = await publicClient.waitForTransactionReceipt( - { - hash: transferHash, - }, - ) - - 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 - } - - let transferHash: `0x${string}` - if (walletClient) { - if (!walletClient.account?.address) { - throw new Error("walletClient.account.address is undefined") - } - transferHash = await walletClient.sendTransaction({ - chain: ANVIL_CONFIG.ACTIVE_CHAIN, - 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) - - expect(isAddress(preparedCall.to)).toEqual(true) - expect(typeof preparedCall.value).toEqual("bigint") - expect(isHex(preparedCall.data)).toEqual(true) - }) - - // 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 () => { - const execution = { - account: ZORA721_TBA_ADDRESS, - to: zora721.proxyContractAddress, - value: 0n, - data: "", - } - - const executedCallTxHash = isV3 - ? await tokenboundClient.execute(execution) - : await tokenboundClient.executeCall(execution) - - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: executedCallTxHash, - }) - - 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 () => { - const execution = { - account: ZORA721_TBA_ADDRESS, - to: zora721.proxyContractAddress, - value: 0n, - data: "", - } - - const executedCallTxHash = await tokenboundClient.execute(execution) - - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: executedCallTxHash, - }) - - await vi.waitFor(() => { - expect(executedCallTxHash).toMatch(ADDRESS_REGEX) - expect(transactionReceipt.status).toBe("success") - }) - }, - TIMEOUT, - ) - - // Other methods in the SDK implement executeCall, like transferETH, transferNFT, etc. - // so they provide further assurance that executeCall is working as expected: - - it("can transferETH with the TBA", async () => { - const EXPECTED_BALANCE_BEFORE = parseUnits("1", 18) - const EXPECTED_BALANCE_AFTER = parseUnits("0.75", 18) - - 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, - }) - - const transactionReceipt = await publicClient.getTransactionReceipt({ - hash: ethTransferHash, - }) - - 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).toBe(EXPECTED_BALANCE_BEFORE) - expect(balanceAfter).toBe(EXPECTED_BALANCE_AFTER) - }) - }) - - 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 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(balanceBefore).toBe(EXPECTED_BALANCE_BEFORE) - expect(balanceAfter).toBe(EXPECTED_BALANCE_AFTER) - }) - }) - - it("will not allow transferNFT 721 with an amount other than 1", async () => { - vi.spyOn(console, "error") - - 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 () => { - 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, - }) - - 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", - }) - - const addr = await resolvePossibleENS(publicClient, "jeebay.eth") - - const anvilAccount1NFTBalance = await getZora721Balance({ - publicClient, - walletAddress: addr, - }) - - 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)], - }) - - 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 zoraBalanceInTBA = await getZora721Balance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) - - 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) - }) - }) - - it("can mint an 1155 with the TBA", async () => { - const mintingAccount: `0x${string}` = ZORA721_TBA_ADDRESS - - 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 execution = { - account: mintingAccount, - to: zora1155.proxyContractAddress, - value: zora1155.mintFee * zora1155.quantity, - data, - } - - const mint1155TxHash = isV3 - ? await tokenboundClient.execute(execution) - : await tokenboundClient.executeCall(execution) - - const zora1155BalanceInTBA = await getZora1155Balance({ - publicClient, - walletAddress: mintingAccount, - }) - - console.log("1155 Balance", zora1155BalanceInTBA) - - await vi.waitFor(() => { - expect(mint1155TxHash).toMatch(ADDRESS_REGEX) - expect(zora1155BalanceInTBA).toBe(5n) - }) - }) - - it("can transferNFT an 1155 with the TBA", async () => { - 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 anvilAccount1_1155Balance = await getZora1155Balance({ - publicClient, - walletAddress: ANVIL_USER_1, - }) - - console.log("1155 Balance", anvilAccount1_1155Balance) - - 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, - }) - - console.log("isValidSigner?", isValidSigner) - - await vi.waitFor(() => { - expect(isValidSigner).toBe(true) - }) - }, - ) - - // 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) - - 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" }, - }) - - console.log("HEX SIGNED MESSAGE: ", hexSignedMessageHash) - - 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 - - const rawUint8Hash = await tokenboundClient.signMessage({ - message: { raw: uint8ArrayMessage }, - }) - - 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 () => { - vi.spyOn(console, "error") - const arrayMessage: ArrayLike = [72, 101, 108, 108, 111] // "Hello" in ASCII - - await expect(() => - tokenboundClient.signMessage({ - message: arrayMessage, - }), - ).rejects.toThrowError() - }, - ) - - // Test signing Uint8Array message in viem only. - viemOnlyIt( - "throws when viem incorrectly receives an Uint8Array message for signing", - async () => { - const uint8ArrayMessage: Uint8Array = new Uint8Array([ - 72, 101, 108, 108, 111, - ]) // "Hello" in ASCII - - await expect(() => - tokenboundClient.signMessage({ - message: uint8ArrayMessage, - }), - ).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], - }) - - if (walletClient) { - if (!walletClient.account?.address) { - throw new Error("walletClient.account is undefined") - } - - const wethContract = getContract({ - address: WETH_CONTRACT_ADDRESS, - abi: wethABI, - client: { - wallet: walletClient, - }, - }) - - // Convert ETH to WETH in ANVIL_USER_0 wallet - 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({ - 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, - }) - - // 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, - }) - - const tbaWETHFinal = await getWETHBalance({ - publicClient, - walletAddress: ZORA721_TBA_ADDRESS, - }) - - const anvilUser1WETHBalance = await getWETHBalance({ - publicClient, - walletAddress: ANVIL_USER_1, - }) - - 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), - ) - - 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, - ) - }, -) - -describe("Custom client configurations", () => { - it("can use a custom publicClient RPC URL", async () => { - const customPublicClientRPCUrl = "https://cloudflare-eth.com" - const tokenboundClient = new TokenboundClient({ - chain: mainnet, - walletClient, - publicClientRPCUrl: customPublicClientRPCUrl, - }) - - await vi.waitFor(() => { - expect(tokenboundClient.publicClient?.transport?.url).toBe( - customPublicClientRPCUrl, - ) - }) - }) - it("can use a custom chain as parameter", async () => { - const ZORA_CHAIN_ID = 7777777 - - const tokenboundClient = new TokenboundClient({ - walletClient, - chain: zora, - }) - - await vi.waitFor(() => { - expect(tokenboundClient.publicClient?.chain?.id).toBe(ZORA_CHAIN_ID) - }) - }) -}) diff --git a/packages/sdk/src/test/TestAllViem.test.ts b/packages/sdk/src/test/TestAllViem.test.ts new file mode 100644 index 0000000..a915128 --- /dev/null +++ b/packages/sdk/src/test/TestAllViem.test.ts @@ -0,0 +1,1342 @@ +// 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, + createForkInstance, + isAddressMatch, + TEST_CONFIG, + testLog, + WETH_CONTRACT_ADDRESS, + weth, + zora721, + zora1155, +} from "@tokenbound/test-fixtures" +import { + createTestClient, + createWalletClient, + decodeEventLog, + encodeAbiParameters, + encodeFunctionData, + erc20Abi, + formatEther, + getAddress, + getContract, + 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 { + ethToWei, + getPublicClient, + getWETHBalance, + getZora721Balance, + // debugTransaction, + getZora1155Balance, +} from "./utils" + +const TIMEOUT = 60000 // default 10000 +const ANVIL_USER_0 = getAddress(ANVIL_ACCOUNTS[0].address) +const ANVIL_USER_1 = getAddress(ANVIL_ACCOUNTS[1].address) + +const walletClient = createWalletClient({ + transport: http(ANVIL_RPC_URL), + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + account: privateKeyToAccount(ANVIL_ACCOUNTS[0].privateKey), +}) + +// 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 + version?: TBImplementationVersion +} + +const ENABLED_TESTS: Array = [ + { + testName: "viem v2", + walletClient, + version: TBVersion.V2, + }, + { + testName: "viem v3", + walletClient, + }, +] + +describe.each(ENABLED_TESTS)( + "$testName", + ({ testName, walletClient, version }) => { + const isV2 = version === TBVersion.V2 + const isV3 = isV2 === false + const v3OnlyIt = isV3 ? it : it.skip + // Set up Anvil instance + clients + const anvil = createForkInstance() + const CUSTOM_SALT = 6551 + let tokenboundClient: TokenboundClient + let publicClient: PublicClient + let NFT_IN_EOA: CreateAccountParams + let NFT_FOR_MULTICALL_CREATE: CreateAccountParams + 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: `0x${string}` + + 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 { + publicClient = getPublicClient({ chain: ANVIL_CONFIG.ACTIVE_CHAIN }) + + // Pass in the Anvil test walletClient + publicClient + tokenboundClient = new TokenboundClient({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + walletClient, + publicClient, + ...DEPLOYMENT_OVERRIDES, + }) + + 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" }) + + 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`) + }) + + // --------------------------------------------------------------------- + // 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`) + } + + /** Mints 4 Zora 721s into the Anvil EOA and records their token IDs. */ + async function ensureMintedNFTs() { + if (TOKENID_IN_EOA) return + + 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) => + isAddressMatch(log.address, zora721.proxyContractAddress), + ) + .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" && + isAddressMatch((event.args as any)?.to, ANVIL_USER_0), + ) + .map((event) => ((event.args as any).tokenId as bigint).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, + } + } + + /** 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, + }) + } + + /** 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() + testLog(`SDK Version → \x1b[94m ${sdkVersion} \x1b[0m`) + // testLog('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, + }) + + 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 preparedAccount = await tokenboundClient.prepareCreateAccount({ + tokenContract: zora721.proxyContractAddress, + tokenId: "1", + }) + + 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) + testLog("CREATED ACCT", account) + + const createdAccountTxReceipt = await getReceipt(txHash) + + 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 () => { + await ensureMintedNFTs() + const { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_IN_EOA, + salt: CUSTOM_SALT, + }) + testLog("CREATED ACCT WITH CUSTOM SALT", account) + + const createdAccountTxReceipt = await getReceipt(txHash) + + 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 { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_IN_EOA, + chainId: HARDHAT_CHAIN_ID, + }) + testLog("CREATED ACCT WITH CUSTOM CHAIN ID", account) + + const createdAccountTxReceipt = await getReceipt(txHash) + + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: account, + }) + + if (!bytecode) return + + const { chainId } = bytecode + + testLog("CHAINID OF CREATED ACCT", chainId) + + expect(isAddress(account)).toEqual(true) + expect(createdAccountTxReceipt.status).toBe("success") + expect(chainId).toBe(HARDHAT_CHAIN_ID) + }, + TIMEOUT, + ) + + v3OnlyIt( + "can createAccount and append multicall transaction(s) that use the deployed TBA", + async () => { + await ensureMintedNFTs() + const multicallTBAAddress = tokenboundClient.getAccount( + NFT_FOR_MULTICALL_CREATE, + ) + + // Perform a simple ERC20 balanceOf call to test the appended multicall transaction + const encodedBalanceOfFunctionData = encodeFunctionData({ + abi: erc20Abi, + functionName: "balanceOf", + args: [multicallTBAAddress], + }) + + const preparedBalanceOfByTBA = + await tokenboundClient.prepareExecution({ + account: multicallTBAAddress, + to: WETH_CONTRACT_ADDRESS, + value: 0n, + data: encodedBalanceOfFunctionData, + }) + + const appendedCall: Call3 = { + target: multicallTBAAddress, // Execute with TBA + allowFailure: false, + callData: preparedBalanceOfByTBA.data, + } + + const { account, txHash } = await tokenboundClient.createAccount({ + ...NFT_FOR_MULTICALL_CREATE, + appendedCalls: [appendedCall], + }) + testLog("CREATED ACCT WITH MULTICALL", account) + + const createdAccountTxReceipt = await getReceipt(txHash) + + await vi.waitFor(() => { + expect(account).toMatch(ADDRESS_REGEX) + expect(createdAccountTxReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) + }) + + describe("account reads", () => { + it("can checkAccountDeployment for the created account", async () => { + await ensureTBA() + const isAccountDeployed = await tokenboundClient.checkAccountDeployment( + { + accountAddress: ZORA721_TBA_ADDRESS, + }, + ) + + testLog(`isAccountDeployed ${testName}`, isAccountDeployed) + + 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.isRegistryDeployed).toEqual(true) + expect(status.isImplementationDeployed).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({ + accountAddress: ZORA721_TBA_ADDRESS, + }) + + if (!nft) throw new Error("Bytecode is undefined") + + const { chainId, tokenContract, tokenId } = nft + + expect(chainId).toEqual(ANVIL_CONFIG.ACTIVE_CHAIN.id) + expect(tokenContract).toEqual(NFT_IN_EOA.tokenContract) + expect(tokenId).toEqual(NFT_IN_EOA.tokenId) + }) + + it("can deconstructBytecode for the created account", async () => { + await ensureTBA() + const bytecode = await tokenboundClient.deconstructBytecode({ + accountAddress: ZORA721_TBA_ADDRESS, + }) + + 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, + ) + } + + 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", async () => { + await ensureTBA() + const getAccount = tokenboundClient.getAccount(NFT_IN_EOA) + await vi.waitFor(() => { + expect(getAccount).toMatch(ADDRESS_REGEX) + expect(getAccount).toEqual(ZORA721_TBA_ADDRESS) + }) + }) + + 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. + }) + + describe("funding", () => { + it( + "can transfer one of the minted NFTs to the TBA", + async () => { + await ensureTBA() + testLog( + "SAFE_TRANSFER", + ZORA721_TBA_ADDRESS, + "tokenId", + TOKENID1_IN_TBA, + ) + + const transferCallData = encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ + ANVIL_USER_0, // from + ZORA721_TBA_ADDRESS, // to + BigInt(TOKENID1_IN_TBA), // tokenId + ], + }) + + const preparedNFTTransfer = { + to: zora721.proxyContractAddress, + value: 0n, + data: transferCallData, + } + + if (!walletClient.account?.address) { + throw new Error("walletClient.account.address is undefined") + } + + const transferHash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + account: walletClient.account.address, + ...preparedNFTTransfer, + }) + + const transactionReceipt = await getReceipt(transferHash) + + const tbaNFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + testLog("# 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 () => { + await ensureTBA() + const transferCallData = encodeFunctionData({ + abi: zora721.abi, + functionName: "safeTransferFrom", + args: [ + ANVIL_USER_0, // from + ZORA721_TBA_ADDRESS, // to + BigInt(TOKENID2_IN_TBA), // tokenId + ], + }) + + const preparedNFTTransfer = { + to: zora721.proxyContractAddress, + value: 0n, + data: transferCallData, + } + + if (!walletClient.account?.address) { + throw new Error("walletClient.account.address is undefined") + } + + const transferHash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + account: walletClient.account.address, + ...preparedNFTTransfer, + }) + + const transactionReceipt = await getReceipt(transferHash) + + const tbaNFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + testLog("# 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 () => { + await ensureTBA() + const ethAmount = 1 + const ethAmountWei = parseUnits(`${ethAmount}`, 18) + + const preparedETHTransfer = { + to: ZORA721_TBA_ADDRESS, + value: ethAmountWei, + // data is optional if nil + } + + if (!walletClient.account?.address) { + throw new Error("walletClient.account.address is undefined") + } + + const transferHash = await walletClient.sendTransaction({ + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + 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, + }) + + await vi.waitFor(() => { + expect(transferHash).toMatch(ADDRESS_REGEX) + expect(balanceAfter).toBe(ethAmountWei) + }) + }, + TIMEOUT, + ) + }) + + describe("execution", () => { + it(isV2 ? "can prepareExecuteCall" : "can prepareExecution", async () => { + await ensureETHInTBA() + 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) + + expect(isAddress(preparedCall.to)).toEqual(true) + expect(typeof preparedCall.value).toEqual("bigint") + expect(isHex(preparedCall.data)).toEqual(true) + }) + + // 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: "", + } + + const executedCallTxHash = isV3 + ? await tokenboundClient.execute(execution) + : await tokenboundClient.executeCall(execution) + + const transactionReceipt = await getReceipt(executedCallTxHash) + + 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: "", + } + + const executedCallTxHash = await tokenboundClient.execute(execution) + + const transactionReceipt = await getReceipt(executedCallTxHash) + + await vi.waitFor(() => { + expect(executedCallTxHash).toMatch(ADDRESS_REGEX) + expect(transactionReceipt.status).toBe("success") + }) + }, + TIMEOUT, + ) + + // Other methods in the SDK implement executeCall, like transferETH, transferNFT, etc. + // so they provide further assurance that executeCall is working as expected: + }) + + describe("transfers", () => { + it("can transferETH with the TBA", async () => { + 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: ANVIL_USER_1, + }) + + const transactionReceipt = await getReceipt(ethTransferHash) + + const balanceAfter = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + + testLog( + "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) + }) + }) + + it("can transferETH to an ENS with the TBA", async () => { + 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", + }) + // Wait for mining: the send resolves on submission. + await getReceipt(ethTransferHash) + const balanceAfter = await publicClient.getBalance({ + address: ZORA721_TBA_ADDRESS, + }) + + testLog( + "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") + + 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, + }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) + + const anvilAccount1NFTBalance = await getZora721Balance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) + + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1NFTBalance).toBe(1n) + }) + }) + + 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", + }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) + + const addr = await resolvePossibleENS(publicClient, "jeebay.eth") + + const anvilAccount1NFTBalance = await getZora721Balance({ + publicClient, + walletAddress: addr, + }) + + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1NFTBalance).toBe(1n) + }) + }) + }) + + 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 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, + walletAddress: ZORA721_TBA_ADDRESS, + }) + + testLog("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) + }) + }) + + 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 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 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, + walletAddress: mintingAccount, + }) + + testLog("1155 Balance", zora1155BalanceInTBA) + + await vi.waitFor(() => { + expect(mint1155TxHash).toMatch(ADDRESS_REGEX) + expect(zora1155BalanceInTBA).toBe(5n) + }) + }) + + 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, + }) + // Wait for mining: the send resolves on submission. + await getReceipt(transferNFTHash) + + const anvilAccount1_1155Balance = await getZora1155Balance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) + + testLog("1155 Balance", anvilAccount1_1155Balance) + + await vi.waitFor(() => { + expect(transferNFTHash).toMatch(ADDRESS_REGEX) + expect(anvilAccount1_1155Balance).toBe(BigInt(transferAmount)) + }) + }) + }) + + describe("signing", () => { + v3OnlyIt( + "can verify if a wallet isValidSigner for an owned NFT", + async () => { + await ensureTBA() + testLog("ZORA721_TBA_ADDRESS in isValidSigner", ZORA721_TBA_ADDRESS) + const isValidSigner = await tokenboundClient.isValidSigner({ + account: ZORA721_TBA_ADDRESS, + }) + + testLog("isValidSigner?", isValidSigner) + + await vi.waitFor(() => { + expect(isValidSigner).toBe(true) + }) + }, + ) + + it("can sign a message", async () => { + await ensureTBA() + const signedMessageHash = await tokenboundClient.signMessage({ + message: "Sign me", + }) + + testLog("SIGNED MESSAGE: ", signedMessageHash) + + await vi.waitFor(() => { + expect(signedMessageHash).toMatch(ADDRESS_REGEX) + }) + }) + + // Test signing a hex message. + it("can sign a hexified message", async () => { + await ensureTBA() + const hexSignedMessageHash = await tokenboundClient.signMessage({ + message: { raw: "0x68656c6c6f20776f726c64" }, + }) + + testLog("HEX SIGNED MESSAGE: ", hexSignedMessageHash) + + await vi.waitFor(() => { + expect(hexSignedMessageHash).toMatch(ADDRESS_REGEX) + }) + }) + + // 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 }, + }) + + await vi.waitFor(() => { + expect(rawUint8Hash).toMatch(ADDRESS_REGEX) + }) + }) + + // 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({ + // Intentionally invalid: viem rejects ArrayLike at runtime. + message: arrayMessage as unknown as SignableMessage, + }), + ).rejects.toThrowError() + }) + + // 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({ + // Intentionally invalid: a bare Uint8Array must be { raw }. + message: uint8ArrayMessage as unknown as SignableMessage, + }), + ).rejects.toThrowError() + }) + + 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: weth.abi, + functionName: "transfer", + args: [ZORA721_TBA_ADDRESS, depositWeiValue], + }) + + if (!walletClient.account?.address) { + throw new Error("walletClient.account is undefined") + } + + const wethContract = getContract({ + address: WETH_CONTRACT_ADDRESS, + abi: weth.abi, + client: { + wallet: walletClient, + }, + }) + + // Convert ETH to WETH in ANVIL_USER_0 wallet + 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 + const wethTransferHash = await walletClient.sendTransaction({ + account: walletClient.account, + chain: ANVIL_CONFIG.ACTIVE_CHAIN, + to: WETH_CONTRACT_ADDRESS, + value: 0n, + data: wethTransferCallData, + }) + // Wait for mining: the send resolves on submission. + await getReceipt(wethTransferHash) + + 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 jeebay.eth + const ensTransferredERC20Hash = await tokenboundClient.transferERC20({ + account: ZORA721_TBA_ADDRESS, + amount: transferEthValue, + recipientAddress: "jeebay.eth", + erc20tokenAddress: WETH_CONTRACT_ADDRESS, + erc20tokenDecimals: 18, + }) + // Wait for mining: the send resolves on submission. + await getReceipt(ensTransferredERC20Hash) + + const tbaWETHFinal = await getWETHBalance({ + publicClient, + walletAddress: ZORA721_TBA_ADDRESS, + }) + + const anvilUser1WETHBalance = await getWETHBalance({ + publicClient, + walletAddress: ANVIL_USER_1, + }) + + const ensWETHBalance = await getWETHBalance({ + publicClient, + walletAddress: "jeebay.eth", + }) + + testLog( + "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, + ) + }) + }, +) + +describe("Custom client configurations", () => { + it("can use a custom publicClient RPC URL", async () => { + const customPublicClientRPCUrl = "https://cloudflare-eth.com" + const tokenboundClient = new TokenboundClient({ + chain: mainnet, + walletClient, + publicClientRPCUrl: customPublicClientRPCUrl, + }) + + await vi.waitFor(() => { + expect(tokenboundClient.publicClient?.transport?.url).toBe( + customPublicClientRPCUrl, + ) + }) + }) + it("can use a custom chain as parameter", async () => { + const ZORA_CHAIN_ID = 7777777 + + const tokenboundClient = new TokenboundClient({ + walletClient, + chain: zora, + }) + + await vi.waitFor(() => { + expect(tokenboundClient.publicClient?.chain?.id).toBe(ZORA_CHAIN_ID) + }) + }) +}) 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/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/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 6b51b8e..0000000 --- a/packages/sdk/src/test/constants/anvil.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { foundry } from "viem/chains" -import type { AnvilAccount } from "../../types" -import { getAddress } from "viem" - -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/crossChain.test.ts b/packages/sdk/src/test/crossChain.test.ts new file mode 100644 index 0000000..20d4008 --- /dev/null +++ b/packages/sdk/src/test/crossChain.test.ts @@ -0,0 +1,187 @@ +// 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, + CROSS_CHAIN_SENDER_NFT, + createForkInstance, + RECIPIENT_ADDRESS, +} from "@tokenbound/test-fixtures" +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 = createForkInstance() + 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(anvil.url), + }) 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/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/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/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/checkProtocolDeployment.test.ts b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts new file mode 100644 index 0000000..675e1f3 --- /dev/null +++ b/packages/sdk/src/test/unit/checkProtocolDeployment.test.ts @@ -0,0 +1,134 @@ +// 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 } 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({ + isRegistryDeployed: true, + isImplementationDeployed: true, + isFullyDeployed: true, + registryAddress: V3_REGISTRY, + implementationAddress: V3_IMPLEMENTATION, + }) + }) + + it("reports a chain with no deployment at all", async () => { + const status = await checkProtocolDeployment(stubClient({})) + + expect(status.isRegistryDeployed).toBe(false) + expect(status.isImplementationDeployed).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.isRegistryDeployed).toBe(true) + expect(status.isImplementationDeployed).toBe(false) + expect(status.isFullyDeployed).toBe(false) + }) + + 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/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/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/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 new file mode 100644 index 0000000..36a160a --- /dev/null +++ b/packages/sdk/src/test/unit/protocol.test.ts @@ -0,0 +1,333 @@ +// 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") + // Arbitrary recipient — deliberately not a Tokenbound contract address. + const recipient = getAddress("0x000000000000000000000000000000000000d00d") + + 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..47e99e8 --- /dev/null +++ b/packages/sdk/src/test/unit/viemExtension.test.ts @@ -0,0 +1,272 @@ +// 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, + custom, + 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", + "checkProtocolDeployment", + "deconstructBytecode", + "getNFT", + "isValidSigner", + ]) { + expect(typeof (client.tokenbound as never)[method]).toBe("function") + } + }) + + 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 [ + "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..900707a 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 { ANVIL_RPC_URL } from "@tokenbound/test-fixtures" +import { type Chain, createPublicClient, http, type PublicClient } from "viem" +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 deleted file mode 100644 index 26f39cf..0000000 --- a/packages/sdk/src/test/utils/debug.ts +++ /dev/null @@ -1,24 +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/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..9719669 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 { WETH_CONTRACT_ADDRESS } from "@tokenbound/test-fixtures" +import { erc20Abi, type PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" 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..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 { zora1155 } from "../config" -import { zora1155ABI } from "../wagmi-cli-hooks/generated" -import { resolvePossibleENS } from "../../utils" import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" 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 5e2df2b..8c0b061 100644 --- a/packages/sdk/src/test/utils/getZora721Balance.ts +++ b/packages/sdk/src/test/utils/getZora721Balance.ts @@ -1,8 +1,7 @@ -import type { PublicClient, } from "viem" -import { zora721 } from "../config" -import { zora721DropABI } from "../wagmi-cli-hooks/generated" -import { resolvePossibleENS } from "../../utils" +import { zora721 } from "@tokenbound/test-fixtures" +import type { PublicClient } from "viem" import type { PossibleENSAddress } from "../../types" +import { resolvePossibleENS } from "../../utils" 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 3bff077..d3d962f 100644 --- a/packages/sdk/src/test/utils/index.ts +++ b/packages/sdk/src/test/utils/index.ts @@ -1,8 +1,5 @@ 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..531b7d7 100644 --- a/packages/sdk/src/utils/getImplementationName.ts +++ b/packages/sdk/src/utils/getImplementationName.ts @@ -1,15 +1,20 @@ -import { ERC_6551_DEFAULT, ERC_6551_LEGACY_V2 } from "../constants" +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}` } } 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..7c6fd84 --- /dev/null +++ b/packages/sdk/src/viem/actions.ts @@ -0,0 +1,501 @@ +// 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, + 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 { + call, + getCode, + readContract, + sendTransaction, + signMessage as viemSignMessage, +} from "viem/actions" + +import { + deconstructBytecode as deconstructBytecodeFromHex, + encodeERC20Transfer, + encodeETHTransfer, + encodeNFTTransfer, + getAccountAddress, + hasBytecode, + type ProtocolDeploymentStatus, + prepareCreateAccountTx, + type ResolvedDeployment, + resolveDeployment, + toProtocolDeploymentStatus, + VALID_SIGNER_MAGIC_VALUE, +} from "../protocol" +import { ERC_6551_DEFAULT } from "../protocol/constants" +import { + encodeCrossChainCall, + type ProtocolCaller, +} 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({ + caller: toProtocolCaller(client), + 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, + ) +} + +/** 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, + params: { accountAddress: Address }, +): Promise { + 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. */ +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 { ProtocolDeploymentStatus } from "../protocol" +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..5df53a4 --- /dev/null +++ b/packages/sdk/src/viem/index.ts @@ -0,0 +1,33 @@ +// viem-native Tokenbound API: standalone actions plus the `.extend()` decorator. + +export { + checkAccountDeployment, + checkProtocolDeployment, + createAccount, + deconstructBytecode, + type ExecuteActionParams, + execute, + type GetAccountActionParams, + getAccount, + getNFT, + isValidSigner, + type PrepareCreateAccountActionParams, + type ProtocolDeploymentStatus, + 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..65525fb --- /dev/null +++ b/packages/sdk/src/viem/tokenboundActions.ts @@ -0,0 +1,161 @@ +// 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, + checkProtocolDeployment, + createAccount, + deconstructBytecode, + type ExecuteActionParams, + execute, + type GetAccountActionParams, + getAccount, + getNFT, + isValidSigner, + type PrepareCreateAccountActionParams, + type ProtocolDeploymentStatus, + 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 + /** 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 + }) => 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), + checkProtocolDeployment: () => + checkProtocolDeployment(viemClient, config), + 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/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 e0b985a..0000000 --- a/packages/sdk/vite.config.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { resolve } from "node:path" -import { type PluginOption, defineConfig } from "vite" -import { visualizer } from "rollup-plugin-visualizer" -import dts from "vite-plugin-dts" - -// https://vitejs.dev/config/ -export default defineConfig({ - build: { - lib: { - // Could also be a dictionary or array of multiple entry points - entry: resolve(__dirname, "src/index.ts"), - name: "tokenbound-sdk", - // the proper extensions will be added - fileName: "tokenbound-sdk", - }, - rollupOptions: { - // make sure to externalize deps that shouldn't be bundled - // into your library - external: ["viem"], - output: { - // Provide global variables to use in the UMD build - // for externalized deps - globals: { - viem: "viem", - }, - }, - }, - }, - 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, - ], - 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..47bd40c 100644 --- a/packages/sdk/wagmi.config.ts +++ b/packages/sdk/wagmi.config.ts @@ -1,14 +1,26 @@ 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 { 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: "src/test/wagmi-cli-hooks/generated.ts", + 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/packages/test-fixtures/package.json b/packages/test-fixtures/package.json new file mode 100644 index 0000000..558b893 --- /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": "catalog:" + }, + "devDependencies": { + "prool": "0.2.16" + } +} diff --git a/packages/test-fixtures/src/anvil.ts b/packages/test-fixtures/src/anvil.ts new file mode 100644 index 0000000..5feb1ea --- /dev/null +++ b/packages/test-fixtures/src/anvil.ts @@ -0,0 +1,118 @@ +// 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 { Instance } from "prool" +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 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://eth.drpc.org" + +/** + * 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, +} + +/** + * 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 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 }, + ) +} + +/** + * 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/fixtures.ts b/packages/test-fixtures/src/fixtures.ts new file mode 100644 index 0000000..e91fe9b --- /dev/null +++ b/packages/test-fixtures/src/fixtures.ts @@ -0,0 +1,141 @@ +// 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. */ +/** + * 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, + /** 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", +) + +/** + * 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 = [ + { + 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..ea7c103 --- /dev/null +++ b/packages/test-fixtures/src/index.ts @@ -0,0 +1,13 @@ +// 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 "./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`) +} 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 4e4a537..3e84916 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,46 +1,70 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' 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 + importers: .: devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 'catalog:' + version: 2.5.14 '@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 + specifier: 'catalog:' + 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.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.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@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.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 +78,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: '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.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.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: 1.9.4 - version: 1.9.4 + specifier: 'catalog:' + version: 2.5.14 '@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 + specifier: 'catalog:' + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: 'catalog:' + 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.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) '@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 - '@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: link:../../packages/ethers 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.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.7.2 - version: 5.7.2 + 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 @@ -112,48 +133,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: '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.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.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: 1.9.4 - version: 1.9.4 + specifier: 'catalog:' + version: 2.5.14 '@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 + specifier: 'catalog:' + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: 'catalog:' + 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.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.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 - 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) - ethers: - specifier: ^6.13.4 - version: 6.13.4 process: specifier: ^0.11.10 version: 0.11.10 @@ -167,48 +185,42 @@ 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: '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.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.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: 1.9.4 - version: 1.9.4 + specifier: 'catalog:' + version: 2.5.14 '@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 + specifier: 'catalog:' + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: 'catalog:' + 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.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) '@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,10347 +234,10423 @@ 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: '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: ^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: ^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: 1.9.4 - version: 1.9.4 + specifier: 'catalog:' + version: 2.5.14 '@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 + specifier: 'catalog:' + version: 5.9.3 vite: - specifier: ^4.4.9 - version: 4.5.3 + specifier: 'catalog:' + 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: 'catalog:' + version: 2.5.14 + '@tokenbound/test-fixtures': + specifier: workspace:* + version: link:../test-fixtures + 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) + tsdown: + specifier: 'catalog:' + version: 0.23.0(typescript@5.9.3) + typescript: + 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: 'catalog:' + version: 5.4.21(@types/node@26.3.0)(lightningcss@1.33.0) + vitest: + 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: dependencies: '@layerzerolabs/lz-v2-utilities': - specifier: ^2.3.7 - version: 2.3.7 - viem: - specifier: ^2.21.32 - version: 2.21.32(typescript@5.4.5)(zod@3.23.8) + specifier: ^3.0.168 + version: 3.0.168 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 - '@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) + specifier: 'catalog:' + version: 2.5.14 + '@tokenbound/test-fixtures': + specifier: workspace:* + version: link:../test-fixtures + '@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.14)(rollup@4.63.0) + tsdown: + specifier: 'catalog:' + version: 0.23.0(typescript@5.9.3) typescript: - specifier: ^5.4.5 - version: 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.3 - vite-plugin-dts: - specifier: ^3.9.0 - version: 3.9.1(typescript@5.4.5)(vite@4.5.3) + specifier: 'catalog:' + version: 5.4.21(@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) + 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: + packages/test-fixtures: + dependencies: + 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) + devDependencies: + prool: + specifier: 0.2.16 + version: 0.2.16 - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true +packages: - /@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.14': + resolution: {integrity: sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw==} + 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.14': + resolution: {integrity: sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ==} + 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.14': + resolution: {integrity: sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA==} + 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.14': + resolution: {integrity: sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@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.14': + resolution: {integrity: sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@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.14': + resolution: {integrity: sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + 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==} + + '@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.56.0': + resolution: {integrity: sha512-Fwq77OUHRfSihdi/IB3sp2eVplv9UQjiXoZfpU0mYmxD42CRbVINQT9PVrBbn6fxqS9Vlc4XdaB166IPBVfXkA==} peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.5 + '@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 + '@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'} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@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-attributes@7.24.1(@babel/core@7.24.5): - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - 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-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 + '@emotion/is-prop-valid@0.8.8': + resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - /@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@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} - /@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/memoize@0.7.4': + resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - /@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.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - /@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/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - /@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/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@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 + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] - /@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.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + 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/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] - /@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.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + 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-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + 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-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + 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-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + 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-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + 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/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] - /@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/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - /@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/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] - /@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/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - /@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/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] - /@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/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - /@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/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] - /@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/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - /@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/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] - /@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/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - /@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/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] - /@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/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - /@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/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] - /@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/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-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/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] - /@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/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - /@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-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + 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-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + 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-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + 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-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + 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-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + 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-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + 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-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + 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-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + 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 + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] - /@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-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + 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/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - /@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/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] - /@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/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - /@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/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - /@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/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] - /@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/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - /@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/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - /@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/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] - /@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/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - /@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/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] - /@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/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - /@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/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] - /@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/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - /@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/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] - /@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/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - /@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 + '@ethereumjs/common@3.2.0': + resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} - /@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 + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true - /@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 + '@ethereumjs/tx@4.2.0': + resolution: {integrity: sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==} + engines: {node: '>=14'} - /@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 + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} - /@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 + '@ethersproject/abi@5.8.0': + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} - /@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 + '@ethersproject/abstract-provider@5.8.0': + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} - /@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) + '@ethersproject/abstract-signer@5.8.0': + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} - /@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 + '@ethersproject/address@5.8.0': + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} - /@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 + '@ethersproject/base64@5.8.0': + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} - /@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 + '@ethersproject/basex@5.8.0': + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} - /@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 + '@ethersproject/bignumber@5.8.0': + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} - /@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 + '@ethersproject/bytes@5.8.0': + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} - /@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) + '@ethersproject/constants@5.8.0': + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} - /@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 + '@ethersproject/contracts@5.8.0': + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} - /@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) + '@ethersproject/hash@5.8.0': + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} - /@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 + '@ethersproject/hdnode@5.8.0': + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} - /@babel/regjsgen@0.8.0: - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + '@ethersproject/json-wallets@5.8.0': + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} - /@babel/runtime@7.24.5: - resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 + '@ethersproject/keccak256@5.8.0': + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} - /@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 + '@ethersproject/logger@5.8.0': + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} - /@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 + '@ethersproject/networks@5.8.0': + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} - /@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 + '@ethersproject/pbkdf2@5.8.0': + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true + '@ethersproject/properties@5.8.0': + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} - /@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 + '@ethersproject/providers@5.8.0': + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} - /@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 + '@ethersproject/random@5.8.0': + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} - /@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 + '@ethersproject/rlp@5.8.0': + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} - /@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 + '@ethersproject/sha2@5.8.0': + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} - /@biomejs/cli-linux-x64-musl@1.9.4: - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/signing-key@5.8.0': + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} - /@biomejs/cli-linux-x64@1.9.4: - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@ethersproject/solidity@5.8.0': + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} - /@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 + '@ethersproject/strings@5.8.0': + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} - /@biomejs/cli-win32-x64@1.9.4: - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@ethersproject/transactions@5.8.0': + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} - /@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 + '@ethersproject/units@5.8.0': + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} - /@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 + '@ethersproject/wallet@5.8.0': + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - dependencies: - '@changesets/types': 6.0.0 - dev: true + '@ethersproject/web@5.8.0': + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - 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 + '@ethersproject/wordlists@5.8.0': + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} - /@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 - - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - dependencies: - extendable-error: 0.1.7 - dev: true + '@gemini-wallet/core@0.3.2': + resolution: {integrity: sha512-Z4aHi3ECFf5oWYWM3F1rW83GJfB9OvhBYPTmb5q+VyK3uvzvS48lwo+jwh2eOoCRWEuT/crpb9Vwp2QaS5JqgQ==} + peerDependencies: + viem: '>=2.0.0' - /@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 + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: true + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} - /@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 + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} + engines: {node: '>=8'} - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} - dependencies: - chalk: 2.4.2 - dev: 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} - /@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 + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - /@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 + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - /@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 + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: true + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: true + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - /@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 + '@layerzerolabs/lz-v2-utilities@3.0.168': + resolution: {integrity: sha512-5gb5QH3q+JIOkwuJnmv3hWidwLE7ySC0G4IYCL9pwl80bkdkuY9TwfG3KqWri2F5mCzRYs6xx7vaYP5zFqY7yA==} - /@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 + '@lit-labs/ssr-dom-shim@1.6.0': + resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} - /@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 + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} - /@emotion/hash@0.9.1: - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} - dev: false + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true - dependencies: - '@emotion/memoize': 0.7.4 - dev: false - optional: true + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} - dependencies: - '@emotion/memoize': 0.8.1 - dev: false + '@metamask/eth-json-rpc-provider@1.0.1': + resolution: {integrity: sha512-whiUMPlAOrVGmX8aKYVPvlKyG4CpQXiNNyt74vE1xb5sPvmx5oA7B/kOi/JdBvhGQq97U1/AVdXEdk2zkP8qyA==} + engines: {node: '>=14.0.0'} - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false - optional: true + '@metamask/json-rpc-engine@7.3.3': + resolution: {integrity: sha512-dwZPq8wx9yV3IX2caLi9q9xZBw2XeIoYqdyihDDDpuHVCEiqadJLwqM3zy+uwf6F1QYQ65A8aOMQg1Uw7LMLNg==} + engines: {node: '>=16.0.0'} - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false + '@metamask/json-rpc-engine@8.0.2': + resolution: {integrity: sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==} + engines: {node: '>=16.0.0'} - /@emotion/stylis@0.8.5: - resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: false + '@metamask/json-rpc-middleware-stream@7.0.2': + resolution: {integrity: sha512-yUdzsJK04Ev98Ck4D7lmRNQ8FPioXYhEUZOMS01LXW8qTvPGiRVXmVltj2p4wrLkh0vW7u6nv0mNl5xzC5Qmfg==} + engines: {node: '>=16.0.0'} - /@emotion/unitless@0.7.5: - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: false + '@metamask/object-multiplex@2.1.0': + resolution: {integrity: sha512-4vKIiv0DQxljcXwfpnbsXcfa5glMj5Zg9mqn4xpIWqkv6uJ2ma5/GtUfLFSxhlxnR8asRMv8dDmWya1Tc1sDFA==} + engines: {node: ^16.20 || ^18.16 || >=20} - /@esbuild/aix-ppc64@0.19.12: - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + '@metamask/onboarding@1.0.1': + resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: true - optional: true + '@metamask/providers@16.1.0': + resolution: {integrity: sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==} + engines: {node: ^18.18 || >=20} - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@metamask/rpc-errors@6.4.0': + resolution: {integrity: sha512-1ugFO1UoirU2esS3juZanS/Fo8C8XYocCuBpfZI5N7ECtoG+zu0wF+uWZASik6CkO6w9n/Iebt4iI4pT0vptpg==} + engines: {node: '>=16.0.0'} - /@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 + '@metamask/rpc-errors@7.0.2': + resolution: {integrity: sha512-YYYHsVYd46XwY2QZzpGeU4PSdRhHdxnzkB8piWGvJW2xbikZ3R+epAYEL4q/K8bh9JPTucsUdwRFnACor1aOYw==} + engines: {node: ^18.20 || ^20.17 || >=22} - /@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 + '@metamask/safe-event-emitter@2.0.0': + resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} - /@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 + '@metamask/safe-event-emitter@3.1.3': + resolution: {integrity: sha512-Pnl74ukgoOkSItBRmZ9nnhdBbRtBI1ZvpeYjKNgxjVzDWa/AtruKZc+7LjfZ0iO8iYqh7Ts3bPs2Gu7M2hSf7g==} + engines: {node: '>=12.0.0'} - /@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 + '@metamask/scure-bip39@2.1.1': + resolution: {integrity: sha512-1K8aBsAqr6+8jWhguVl06n8e+zjV9sUnys+5PLyVU4mb8LbulQ60F6cq7iQys3xX/yCwKt1+7c7j2nuTEpW+ZQ==} + engines: {node: ^16.20 || ^18.16 || >=20} - /@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 + '@metamask/sdk-analytics@0.0.5': + resolution: {integrity: sha512-fDah+keS1RjSUlC8GmYXvx6Y26s3Ax1U9hGpWb6GSY5SAdmTSIqp2CvYy6yW0WgLhnYhW+6xERuD0eVqV63QIQ==} - /@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 + '@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 - /@esbuild/android-x64@0.19.12: - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@metamask/sdk-install-modal-web@0.32.1': + resolution: {integrity: sha512-MGmAo6qSjf1tuYXhCu2EZLftq+DSt5Z7fsIKr2P+lDgdTPWgLfZB1tJKzNcwKKOdf6q9Qmmxn7lJuI/gq5LrKw==} - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true + '@metamask/sdk@0.33.1': + resolution: {integrity: sha512-1mcOQVGr9rSrVcbKPNVzbZ8eCl1K0FATsYH3WJ/MH4WcZDWGECWrXJPNMZoEAkLxWiMe8jOQBumg2pmcDa9zpQ==} - /@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 + '@metamask/superstruct@3.4.1': + resolution: {integrity: sha512-caTaaBUcwBGbUNf3r0uT48upX4nECRbKhQ9pPOfW4sIkfcIUUDV4S9DZxq/5fuNPVt5KWpyd5xIIz0sP+iWLlg==} + engines: {node: '>=16.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 + '@metamask/utils@11.12.1': + resolution: {integrity: sha512-X97J5AEcaKDTIAfKb4X93ZTLfvOahzDVadlveQW+7OZ7yhXjMxXoFmhX2d9UKv48iS2Dxq9kbGJ1lUfphu9ebQ==} + engines: {node: ^18.18 || ^20.14 || >=22} - /@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 + '@metamask/utils@5.0.2': + resolution: {integrity: sha512-yfmE79bRQtnMzarnKfX7AEJBwFTxvTyw3nBQlu/5rmGXrjAeAMltoGxO62TFurxrQAFMNa/fEjIHNvungZp0+g==} + engines: {node: '>=14.0.0'} - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + '@metamask/utils@8.5.0': + resolution: {integrity: sha512-I6bkduevXb72TIM9q2LRO63JSsF9EXduh3sBr9oybNX2hNNpr/j1tEjXrsG0Uabm4MJ1xkGAQEMwifvKZIkyxQ==} + engines: {node: '>=16.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 + '@metamask/utils@9.3.0': + resolution: {integrity: sha512-w8CVbdkDrVXFJbfBSlDfafDR6BAkpDmv1bC1UJVCoVny5tW2RKAdn9i68Xf7asYT4TnUhl/hN4zfUiKQq9II4g==} + engines: {node: '>=16.0.0'} - /@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 + '@motionone/animation@10.18.0': + resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} - /@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 + '@motionone/dom@10.12.0': + resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} - /@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 + '@motionone/easing@10.18.0': + resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@motionone/generators@10.18.0': + resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@motionone/types@10.17.1': + resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} - /@esbuild/freebsd-x64@0.19.12: - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true + '@motionone/utils@10.18.0': + resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@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 + libc: [glibc] - /@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 + '@noble/ciphers@1.2.1': + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - /@esbuild/linux-arm@0.19.12: - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.8.0': + resolution: {integrity: sha512-j84kjAbzEnQHaSIhRPUmB3/eVXu2k3dKPl2LOrR8fSOIL+89U+7lV117EWHtq/GHM3ReGHM46iRBdZfpc4HRUQ==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-ia32@0.19.12: - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.9.1': + resolution: {integrity: sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} - /@esbuild/linux-loong64@0.19.12: - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.7.0': + resolution: {integrity: sha512-HXydb0DgzTpDPwbVeDGCG1gIu7X6+AuU6Zl6av/E/KG8LMsvPntvq+w17CHRpKBmN6Ybdrt1eP3k4cj8DJa78w==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-mips64el@0.19.12: - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} - /@esbuild/linux-ppc64@0.19.12: - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@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' - /@esbuild/linux-riscv64@0.19.12: - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] + '@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'} + 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.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.14': + resolution: {integrity: sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@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.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.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.14': + resolution: {integrity: sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] + '@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] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] + '@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] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@esbuild/linux-s390x@0.19.12: - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] + '@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] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@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] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} + '@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] - requiresBuild: true - dev: true - optional: true + libc: [glibc] - /@esbuild/linux-x64@0.19.12: - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + '@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] - requiresBuild: true - dev: true - optional: true + libc: [musl] - /@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 + '@rolldown/binding-openharmony-arm64@1.2.14': + resolution: {integrity: sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + '@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] - /@esbuild/netbsd-x64@0.19.12: - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + '@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: [netbsd] - requiresBuild: true - dev: true - optional: true + os: [win32] - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true + '@rolldown/pluginutils@1.0.0-beta.27': + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - /@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 + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - /@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 + '@rollup/rollup-android-arm-eabi@4.63.0': + resolution: {integrity: sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==} + cpu: [arm] + os: [android] - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true + '@rollup/rollup-android-arm64@4.63.0': + resolution: {integrity: sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==} + cpu: [arm64] + os: [android] - /@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 + '@rollup/rollup-darwin-arm64@4.63.0': + resolution: {integrity: sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==} + cpu: [arm64] + os: [darwin] - /@esbuild/sunos-x64@0.19.12: - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + '@rollup/rollup-darwin-x64@4.63.0': + resolution: {integrity: sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==} cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true + os: [darwin] - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@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: [sunos] - requiresBuild: true - dev: true - optional: true + os: [freebsd] - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.63.0': + resolution: {integrity: sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==} + cpu: [arm] + os: [linux] + libc: [glibc] - /@esbuild/win32-arm64@0.19.12: - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + '@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: [win32] - requiresBuild: true - dev: true - optional: true + os: [linux] + libc: [glibc] - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@rollup/rollup-linux-arm64-musl@4.63.0': + resolution: {integrity: sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==} cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true + os: [linux] + libc: [musl] - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true + '@rollup/rollup-linux-loong64-gnu@4.63.0': + resolution: {integrity: sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==} + cpu: [loong64] + os: [linux] + libc: [glibc] - /@esbuild/win32-ia32@0.19.12: - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] + '@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==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.63.0': + resolution: {integrity: sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==} + cpu: [arm64] + os: [openharmony] + + '@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.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 + '@safe-global/safe-apps-provider@0.18.6': + resolution: {integrity: sha512-4LhMmjPWlIO8TTDC2AwLk44XKXaK6hfBTWyljDm0HQ6TWlOEijVWNrt2s3OCVMSxlXAcEzYfqyu1daHZooTC2Q==} - /@ethereumjs/common@3.2.0: - resolution: {integrity: sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==} - dependencies: - '@ethereumjs/util': 8.1.0 - crc-32: 1.2.2 + '@safe-global/safe-apps-sdk@9.1.0': + resolution: {integrity: sha512-N5p/ulfnnA2Pi2M3YeWjULeWbjo7ei22JwU/IXnhoHzKq3pYCN6ynL9mJBOlvDVv892EgLPCWCOwQk/uBT2v0Q==} - /@ethereumjs/rlp@4.0.1: - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true + '@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. - /@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 + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} - /@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 + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} - /@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 + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - /@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 + '@scure/bip32@1.6.2': + resolution: {integrity: sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==} - /@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/bip32@1.7.0': + resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} - /@ethersproject/random@5.7.0: - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - /@ethersproject/rlp@5.7.0: - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 + '@scure/bip39@1.5.4': + resolution: {integrity: sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==} - /@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/bip39@1.6.0': + resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} - /@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 + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - /@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'} + '@sinclair/typebox@0.27.12': + resolution: {integrity: sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==} - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} - /@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 + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - /@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 + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 - /@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 + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 - /@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/accounts@5.5.1': + resolution: {integrity: sha512-TfOY9xixg5rizABuLVuZ9XI2x2tmWUC/OoN556xwfDlhBHBjKfszicYYOyD6nbFmwTGYarCmyGIdteXxTXIdhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + 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} - dependencies: - '@sinclair/typebox': 0.27.8 + '@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 - /@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/assertions@5.5.1': + resolution: {integrity: sha512-YTCSWAlGwSlVPnWtWLm3ukz81wH4j2YaCveK+TjpvUU88hTy6fmUqxi0+hvAMAe4zKXpJyj3Az7BrLJRxbIm4Q==} + 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/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/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/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/resolve-uri@3.1.2: - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + '@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/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@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/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@5.5.1': + resolution: {integrity: sha512-Vea29nJub/bXjfzEV7ZZQ/PWr1pYLZo3z0qW0LQL37uKKVzVFRQlwetd7INk3YtTD3xm9WUYr7bCvYUk3uKy2g==} + 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/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 - /@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/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 - /@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/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 - /@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/instruction-plans@5.5.1': + resolution: {integrity: sha512-7z3CB7YMcFKuVvgcnNY8bY6IsZ8LG61Iytbz7HpNVGX2u1RthOs1tRW8luTzSG1MPL0Ox7afyAVMYeFqSPHnaQ==} + 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/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 - /@lit/reactive-element@1.6.3: - resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} - dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 + '@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 - /@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/kit@5.5.1': + resolution: {integrity: sha512-irKUGiV2yRoyf+4eGQ/ZeCRxa43yjFEL1DUI5B0DkcfZw3cr0VJtVJnrG8OtVF01vT0OUfYOcUn6zJW5TROHvQ==} + 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/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/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/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-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/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/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/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/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/programs@5.5.1': + resolution: {integrity: sha512-7U9kn0Jsx1NuBLn5HRTFYh78MV4XN145Yc3WP/q5BlqAVNlMoU9coG5IUTJIG847TUqC1lRto3Dnpwm6T4YRpA==} + 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/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/onboarding@1.0.1: - resolution: {integrity: sha512-FqHhAsCI+Vacx2qa5mAFcWNSrTcVGMNjzxVgaX8ECSny/BJ9/vgXP9V7WF/8vb9DltPeQkxr+Fnfmm6GHfmdTQ==} - dependencies: - bowser: 2.11.0 + '@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/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/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/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-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/safe-event-emitter@2.0.0: - resolution: {integrity: sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==} + '@solana/rpc-spec@5.5.1': + resolution: {integrity: sha512-m3LX2bChm3E3by4mQrH4YwCAFY57QBzuUSWqlUw7ChuZ+oLLOq7b2czi4i6L4Vna67j3eCmB3e+4tqy1j5wy7Q==} + 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-subscriptions-api@5.5.1': + resolution: {integrity: sha512-5Oi7k+GdeS8xR2ly1iuSFkAv6CZqwG0Z6b1QZKbEgxadE1XGSDrhM2cn59l+bqCozUWCqh4c/A2znU/qQjROlw==} + 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-subscriptions-channel-websocket@5.5.1': + resolution: {integrity: sha512-7tGfBBrYY8TrngOyxSHoCU5shy86iA9SRMRrPSyBhEaZRAk6dnbdpmUTez7gtdVo0BCvh9nzQtUycKWSS7PnFQ==} + 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-spec@5.5.1': + resolution: {integrity: sha512-iq+rGq5fMKP3/mKHPNB6MC8IbVW41KGZg83Us/+LE3AWOTWV1WT20KT2iH1F1ik9roi42COv/TpoZZvhKj45XQ==} + 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@5.5.1': + resolution: {integrity: sha512-CTMy5bt/6mDh4tc6vUJms9EcuZj3xvK0/xq8IQ90rhkpYvate91RjBP+egvjgSayUg9yucU9vNuUpEjz4spM7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: optional: true - react-native: + + '@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: - 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-transport-http@5.5.1': + resolution: {integrity: sha512-yv8GoVSHqEV0kUJEIhkdOVkR2SvJ6yoWC51cJn2rSV7plr6huLGe0JgujCmB7uZhhaLbcbP3zxXxu9sOjsi7Fg==} + 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-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 - 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@5.5.1': + resolution: {integrity: sha512-ku8zTUMrkCWci66PRIBC+1mXepEnZH/q1f3ck0kJZ95a06bOTl5KU7HeXWtskkyefzARJ5zvCs54AD5nxjQJ+A==} + 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/signers@5.5.1': + resolution: {integrity: sha512-FY0IVaBT2kCAze55vEieR6hag4coqcuJ31Aw3hqRH7mv6sV8oqwuJmUrx+uFwOp1gwd5OEAzlv6N4hOOple4sQ==} + 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/subscribable@5.5.1': + resolution: {integrity: sha512-9K0PsynFq0CsmK1CDi5Y2vUIJpCqkgSS5yfDN0eKPgHqEptLEaia09Kaxc90cSZDZU5mKY/zv1NBmB6Aro9zQQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: 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 + + '@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 + + '@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 + + '@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 + + '@tanstack/query-core@5.102.4': + resolution: {integrity: sha512-6eXkL+KFyVAZdpKoThCjPQQylZK8/ZOMYTJEVoPtHLkLs2PYks6vUiim9qzgvFXakSkRIAZwAZTeZLIJmpgRpQ==} + + '@tanstack/react-query@5.102.4': + resolution: {integrity: sha512-Cn6X2eqFHjCtA/sfM/3eiT6/YmcPqo30twNHUlqkfz9LBqRzdt8GN/mFMWXn/qTacYUo3d4nycMzn3LWZmJ7MQ==} + peerDependencies: + react: ^18 || ^19 + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/node@26.3.0': + resolution: {integrity: sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-dom@18.3.7': + resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@vanilla-extract/css@1.20.1': + resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==} + + '@vanilla-extract/dynamic@2.1.5': + resolution: {integrity: sha512-QGIFGb1qyXQkbzx6X6i3+3LMc/iv/ZMBttMBL+Wm/DetQd36KsKsFg5CtH3qy+1hCA/5w93mEIIAiL4fkM8ycw==} + + '@vanilla-extract/private@1.0.9': + resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} + + '@vanilla-extract/sprinkles@1.6.5': + resolution: {integrity: sha512-HOYidLONR/SeGk8NBAeI64I4gYdsMX9vJmniL13ZcLVwawyK0s2GUENEAcGA+GYLIoeyQB61UqmhqPodJry7zA==} + peerDependencies: + '@vanilla-extract/css': ^1.0.0 + + '@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 + + '@vitest/coverage-v8@1.6.1': + resolution: {integrity: sha512-6YeRZwuO4oTGKxD3bijok756oktHSIm3eczVVzNe3scqzuhLwltIF3S9ZL/vwOVIpURmU6SnZhziXXAfw8/Qlw==} + peerDependencies: + vitest: 1.6.1 + + '@vitest/expect@1.6.1': + resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==} + + '@vitest/runner@1.6.1': + resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==} + + '@vitest/snapshot@1.6.1': + resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==} + + '@vitest/spy@1.6.1': + resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==} - /@microsoft/api-extractor@7.43.0: - resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + '@vitest/utils@1.6.1': + resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==} + + '@wagmi/cli@2.10.0': + resolution: {integrity: sha512-2tYt6Bp1q26mWexH+XE6dMpPB5/Gp/3OVtE2SeeJ/gNHKLZmVF/TuoZR75mpJKTpofyvpz/fnuMCkUxzbc/kRw==} 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 + peerDependencies: + typescript: '>=5.7.3' + 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 + '@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 - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: 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 - /@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 + '@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 - /@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 + '@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 - /@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 + '@walletconnect/core@2.21.0': + resolution: {integrity: sha512-o6R7Ua4myxR8aRUAJ1z3gT9nM+jd2B2mfamu6arzy1Cc6vi10fIwFWb6vg3bC8xJ6o9H3n/cN5TOW3aA9Y1XVw==} + engines: {node: '>=18'} - /@motionone/easing@10.17.0: - resolution: {integrity: sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==} - dependencies: - '@motionone/utils': 10.17.0 - tslib: 2.7.0 + '@walletconnect/core@2.21.1': + resolution: {integrity: sha512-Tp4MHJYcdWD846PH//2r+Mu4wz1/ZU/fr9av1UWFiaYQ2t2TPLDiZxjLw54AAEpMqlEHemwCgiRiAmjR1NDdTQ==} + engines: {node: '>=18'} - /@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 + '@walletconnect/environment@1.0.1': + resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - /@motionone/svelte@10.16.4: - resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - dependencies: - '@motionone/dom': 10.17.0 - tslib: 2.7.0 + '@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' - /@motionone/types@10.17.0: - resolution: {integrity: sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==} + '@walletconnect/events@1.0.1': + resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} - /@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 + '@walletconnect/heartbeat@1.2.2': + resolution: {integrity: sha512-uASiRmC5MwhuRuf05vq4AT48Pq8RMi876zV8rr8cV969uTOzWdB/k+Lj5yI2PBtB1bGQisGen7MM1GcZlQTBXw==} - /@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 + '@walletconnect/jsonrpc-http-connection@1.0.8': + resolution: {integrity: sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==} - /@noble/curves@1.2.0: - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - dependencies: - '@noble/hashes': 1.3.2 + '@walletconnect/jsonrpc-provider@1.0.14': + resolution: {integrity: sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==} - /@noble/curves@1.3.0: - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} - dependencies: - '@noble/hashes': 1.3.3 + '@walletconnect/jsonrpc-types@1.0.4': + resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} - /@noble/curves@1.6.0: - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} - engines: {node: ^14.21.3 || >=16} - dependencies: - '@noble/hashes': 1.5.0 + '@walletconnect/jsonrpc-utils@1.0.8': + resolution: {integrity: sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==} - /@noble/hashes@1.3.2: - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + '@walletconnect/jsonrpc-ws-connection@1.0.16': + resolution: {integrity: sha512-G81JmsMqh5nJheE1mPst1W0WfVv0SG3N7JggwLLGnI7iuDZJq8cRJvQwLGKHn5H1WTW7DEPCo00zz5w62AbL3Q==} - /@noble/hashes@1.3.3: - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} + '@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 - /@noble/hashes@1.5.0: - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} + '@walletconnect/logger@2.1.2': + resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - /@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 + '@walletconnect/relay-api@1.0.11': + resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@walletconnect/relay-auth@1.1.0': + resolution: {integrity: sha512-qFw+a9uRz26jRCDgL7Q5TA9qYIgcNY8jpJzI1zAWNZ8i7mQjaijRnWFKsCHAU9CyGjvt6RKrRXyFtFOpWTVmCQ==} - /@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 + '@walletconnect/safe-json@1.0.2': + resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} + + '@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' - /@parcel/watcher-android-arm64@2.4.1: - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} + '@walletconnect/sign-client@2.21.1': + resolution: {integrity: sha512-QaXzmPsMnKGV6tc4UcdnQVNOz4zyXgarvdIQibJ4L3EmLat73r5ZVl4c0cCOcoaV7rgM9Wbphgu5E/7jNcd3Zg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/time@1.0.2': + resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} + + '@walletconnect/types@2.21.0': + resolution: {integrity: sha512-ll+9upzqt95ZBWcfkOszXZkfnpbJJ2CmxMfGgE5GmhdxxxCcO5bGhXkI+x8OpiS555RJ/v/sXJYMSOLkmu4fFw==} + + '@walletconnect/types@2.21.1': + resolution: {integrity: sha512-UeefNadqP6IyfwWC1Yi7ux+ljbP2R66PLfDrDm8izmvlPmYlqRerJWJvYO4t0Vvr9wrG4Ko7E0c4M7FaPKT/sQ==} + + '@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' + + '@walletconnect/universal-provider@2.21.1': + resolution: {integrity: sha512-Wjx9G8gUHVMnYfxtasC9poGm8QMiPCpXpbbLFT+iPoQskDDly8BwueWnqKs4Mx2SdIAWAwuXeZ5ojk5qQOxJJg==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' + + '@walletconnect/utils@2.21.0': + resolution: {integrity: sha512-zfHLiUoBrQ8rP57HTPXW7rQMnYxYI4gT9yTACxVW6LhIFROTF6/ytm5SKNoIvi4a5nX5dfXG4D9XwQUCu8Ilig==} + + '@walletconnect/utils@2.21.1': + resolution: {integrity: sha512-VPZvTcrNQCkbGOjFRbC24mm/pzbRMUq2DSQoiHlhh0X1U7ZhuIrzVtAoKsrzu6rqjz0EEtGxCr3K1TGRqDG4NA==} + + '@walletconnect/window-getters@1.0.1': + resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} + + '@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] - requiresBuild: true - optional: true - /@parcel/watcher-darwin-arm64@2.4.1: - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-darwin-arm64@0.19.0': + resolution: {integrity: sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==} cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@parcel/watcher-darwin-x64@2.4.1: - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-darwin-x64@0.19.0': + resolution: {integrity: sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==} cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@parcel/watcher-freebsd-x64@2.4.1: - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-freebsd-x64@0.19.0': + resolution: {integrity: sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==} cpu: [x64] os: [freebsd] - requiresBuild: true - optional: true - /@parcel/watcher-linux-arm-glibc@2.4.1: - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-linux-arm-gnu@0.19.0': + resolution: {integrity: sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==} cpu: [arm] os: [linux] - requiresBuild: true - optional: true + 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] - /@parcel/watcher-linux-arm64-glibc@2.4.1: - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + resolution: {integrity: sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true + libc: [glibc] - /@parcel/watcher-linux-arm64-musl@2.4.1: - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-linux-arm64-musl@0.19.0': + resolution: {integrity: sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==} cpu: [arm64] os: [linux] - requiresBuild: true - optional: true + libc: [musl] - /@parcel/watcher-linux-x64-glibc@2.4.1: - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-linux-x64-gnu@0.19.0': + resolution: {integrity: sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true + libc: [glibc] - /@parcel/watcher-linux-x64-musl@2.4.1: - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-linux-x64-musl@0.19.0': + resolution: {integrity: sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==} cpu: [x64] os: [linux] - requiresBuild: true - optional: true - - /@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 + libc: [musl] - /@parcel/watcher-win32-arm64@2.4.1: - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-win32-arm64@0.19.0': + resolution: {integrity: sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==} cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - - /@parcel/watcher-win32-ia32@2.4.1: - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true - /@parcel/watcher-win32-x64@2.4.1: - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} + '@yuku-core/binding-win32-x64@0.19.0': + resolution: {integrity: sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==} cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@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 + '@yuku-toolchain/types@0.19.0': + resolution: {integrity: sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==} - /@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 + 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 - /@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 + abitype@1.0.8: + resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true - /@react-native-community/cli-debugger-ui@13.6.6: - resolution: {integrity: sha512-Vv9u6eS4vKSDAvdhA0OiQHoA7y39fiPIgJ6biT32tN4avHDtxlc6TWZGiqv7g98SBvDWvoVAmdPLcRf3kU+c8g==} - dependencies: - serve-static: 1.15.0 - transitivePeerDependencies: - - supports-color + 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 - /@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 + abitype@1.3.0: + resolution: {integrity: sha512-fk6Te+bojIFrMvMZrnOO+SxCB+RUksTGOzq/60ZRvs1L+BVzvi2bqt9L3W/17ZLdZsyM1FuYf65P5nlmoiH1Bg==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3.22.0 || ^4.0.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true - /@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 + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} - /@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 + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true - /@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 + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - /@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 + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - /@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 + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} - /@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 + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} - /@react-native-community/cli-types@13.6.6: - resolution: {integrity: sha512-733iaYzlmvNK7XYbnWlMjdE+2k0hlTBJW071af/xb6Bs+hbJqBP9c03FZuYH2hFFwDDntwj05bkri/P7VgSxug==} - dependencies: - joi: 17.13.1 + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} - /@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 + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - /@react-native/assets-registry@0.74.83: - resolution: {integrity: sha512-2vkLMVnp+YTZYTNSDIBZojSsjz8sl5PscP3j4GcV6idD8V978SZfwFlk8K0ti0BzRs11mzL0Pj17km597S/eTQ==} - engines: {node: '>=18'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} - /@react-native/babel-plugin-codegen@0.74.83(@babel/preset-env@7.24.5): - resolution: {integrity: sha512-+S0st3t4Ro00bi9gjT1jnK8qTFOU+CwmziA7U9odKyWrCoRJrgmrvogq/Dr1YXlpFxexiGIupGut1VHxr+fxJA==} - engines: {node: '>=18'} - dependencies: - '@react-native/codegen': 0.74.83(@babel/preset-env@7.24.5) - transitivePeerDependencies: - - '@babel/preset-env' - - supports-color + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - /@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 + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} - /@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 + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - /@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 + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /@react-native/debugger-frontend@0.74.83: - resolution: {integrity: sha512-RGQlVUegBRxAUF9c1ss1ssaHZh6CO+7awgtI9sDeU0PzDZY/40ImoPD5m0o0SI6nXoVzbPtcMGzU+VO590pRfA==} - engines: {node: '>=18'} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} - /@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 + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - /@react-native/gradle-plugin@0.74.83: - resolution: {integrity: sha512-Pw2BWVyOHoBuJVKxGVYF6/GSZRf6+v1Ygc+ULGz5t20N8qzRWPa2fRZWqoxsN7TkNLPsECYY8gooOl7okOcPAQ==} - engines: {node: '>=18'} + async-mutex@0.2.6: + resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - /@react-native/js-polyfills@0.74.83: - resolution: {integrity: sha512-/t74n8r6wFhw4JEoOj3bN71N1NDLqaawB75uKAsSjeCwIR9AfCxlzZG0etsXtOexkY9KMeZIQ7YwRPqUdNXuqw==} - engines: {node: '>=18'} + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /@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 + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} - /@react-native/normalize-colors@0.74.83: - resolution: {integrity: sha512-jhCY95gRDE44qYawWVvhTjTplW1g+JtKTKM3f8xYT1dJtJ8QWv+gqEtKcfmOHfDkSDaMKG0AGBaDTSK8GXLH8Q==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} - /@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'} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} peerDependencies: - '@types/react': ^18.2.6 - react: '*' - react-native: '*' - peerDependenciesMeta: - '@types/react': - 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) + axios: 0.x || 1.x - /@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 + axios@1.20.0: + resolution: {integrity: sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==} - /@rollup/pluginutils@5.1.0: - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} + babel-plugin-styled-components@2.3.0: + resolution: {integrity: sha512-nP/y6PbBqS/qtKROnJCgpGo8hYUzlBAVXN1QAjSBANL6vZiQXPQN7FYW/nUwoxY7nZhBEGm9T5tjL9gbzwulDw==} 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 + '@babel/core': ^7.0.0 + styled-components: '>= 2' - /@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 + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /@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 + base-x@4.0.1: + resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} - /@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 + base-x@5.0.1: + resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - /@rollup/rollup-darwin-x64@4.17.2: - resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - /@rollup/rollup-linux-arm-gnueabihf@4.17.2: - resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + baseline-browser-mapping@2.11.23: + resolution: {integrity: sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==} + engines: {node: '>=6.0.0'} + hasBin: true - /@rollup/rollup-linux-arm-musleabihf@4.17.2: - resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - /@rollup/rollup-linux-arm64-gnu@4.17.2: - resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} - /@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 + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} - /@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 + bn.js@4.12.5: + resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} - /@rollup/rollup-linux-riscv64-gnu@4.17.2: - resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true + bn.js@5.2.5: + resolution: {integrity: sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==} - /@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 + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - /@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 + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - /@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 + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} - /@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 + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - /@rollup/rollup-win32-ia32-msvc@4.17.2: - resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: 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 - /@rollup/rollup-win32-x64-msvc@4.17.2: - resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true + bs58@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} - /@rushstack/node-core-library@4.0.2: - resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - 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 - - /@rushstack/terminal@0.10.0: - resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} - peerDependencies: - '@types/node': '*' - peerDependenciesMeta: - '@types/node': - optional: true - dependencies: - '@rushstack/node-core-library': 4.0.2 - supports-color: 8.1.1 - dev: true + bs58@6.0.0: + resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - /@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 + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - /@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 + bufferutil@4.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} - /@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 + 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' - /@safe-global/safe-gateway-typescript-sdk@3.21.1: - resolution: {integrity: sha512-7nakIjcRSs6781LkizYpIfXh1DYlkUDqyALciqz/BjFU/S97sVjZdL4cuKsG9NEarytE+f6p0Qbq2Bo1aocVUA==} - engines: {node: '>=16'} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} - /@scure/base@1.1.9: - resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + cac@7.1.0: + resolution: {integrity: sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==} + engines: {node: '>=20.19.0'} - /@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 + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} - /@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 + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} - /@scure/bip39@1.2.2: - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} - dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.9 + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} - /@scure/bip39@1.4.0: - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.9 + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - /@sideway/address@4.1.5: - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - dependencies: - '@hapi/hoek': 9.3.0 + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - /@sideway/formula@3.0.1: - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} - /@sideway/pinpoint@2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.1 + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - /@socket.io/component-emitter@3.1.2: - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - /@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 + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - /@stablelib/aead@1.0.1: - resolution: {integrity: sha512-q39ik6sxGHewqtO0nP4BuSe3db5G1fEJE8ukvngS2gLkBXyy6E7pLubhbYgnkDFv6V8cWaxcE4Xn0t6LWcJkyg==} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} - /@stablelib/binary@1.0.1: - resolution: {integrity: sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==} - dependencies: - '@stablelib/int': 1.0.1 + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} - /@stablelib/bytes@1.0.1: - resolution: {integrity: sha512-Kre4Y4kdwuqL8BR2E9hV/R5sOrUj6NanZaZis0V6lX5yzqC3hBuVSDXUIBqQv/sCpmuWRiHLwqiT1pqqjuBXoQ==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} - /@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 + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - /@stablelib/chacha@1.0.1: - resolution: {integrity: sha512-Pmlrswzr0pBzDofdFuVe1q7KdsHKhhU24e8gkEwnTGOmlC7PADzLVxGdn2PoNVBBabdg0l/IfLKg6sHAbTQugg==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} - /@stablelib/constant-time@1.0.1: - resolution: {integrity: sha512-tNOs3uD0vSJcK6z1fvef4Y+buN7DXhzHDPqRLSXUel1UfqMB1PWNsnnAezrKfEwTLpN0cGH2p9NNjs6IqeD0eg==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} - /@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 + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} - /@stablelib/hash@1.0.1: - resolution: {integrity: sha512-eTPJc/stDkdtOcrNMZ6mcMK1e6yBbqRBaNW55XA1jU8w/7QdnCF0CmMmOD1m7VSkBR44PWrMHU2l6r8YEQHMgg==} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /@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 + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} - /@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 + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} - /@stablelib/int@1.0.1: - resolution: {integrity: sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /@stablelib/keyagreement@1.0.1: - resolution: {integrity: sha512-VKL6xBwgJnI6l1jKrBAfn265cspaWBPAPEc62VBQrWHLqVgNRE09gQ/AnOEyKUWrrqfD+xSQ3u42gJjLDdMDQg==} - dependencies: - '@stablelib/bytes': 1.0.1 + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - /@stablelib/poly1305@1.0.1: - resolution: {integrity: sha512-1HlG3oTSuQDOhSnLwJRKeTRSAdFNVB/1djy2ZbS35rBSJ/PFqx9cf9qatinWghC2UbfOYD8AcrtbUQl8WoxabA==} - dependencies: - '@stablelib/constant-time': 1.0.1 - '@stablelib/wipe': 1.0.1 + 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 - /@stablelib/random@1.0.2: - resolution: {integrity: sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==} - dependencies: - '@stablelib/binary': 1.0.1 - '@stablelib/wipe': 1.0.1 + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - /@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 + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} - /@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 + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true - /@stablelib/wipe@1.0.1: - resolution: {integrity: sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - /@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 + cross-fetch@4.1.0: + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} - /@tanstack/query-core@5.59.13: - resolution: {integrity: sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + 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 + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} - /@testing-library/dom@10.1.0: - resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} 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'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + cuer@0.0.3: + resolution: {integrity: sha512-f/UNxRMRCYtfLEGECAViByA3JNflZImOk11G9hwSd+44jvzrc99J35u5l+fbdQ2+ZG441GvOpaeGYBmWquZsbQ==} peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' + react: '>=18' + react-dom: '>=18' + typescript: '>=5.4.0' peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: + typescript: 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 - /@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==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: - '@types/react': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + supports-color: '*' peerDependenciesMeta: - '@types/react': + supports-color: 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 - /@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'} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - '@testing-library/dom': '>=7.21.4' - dependencies: - '@testing-library/dom': 10.1.0 - dev: true + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} - /@types/aria-query@5.0.4: - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - dev: true + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - /@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 + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.24.5 - dev: true + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - /@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 + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - dependencies: - '@babel/types': 7.24.5 - dev: true + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - dependencies: - '@types/node': 22.7.5 - dev: false + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - /@types/dom-screen-wake-lock@1.0.3: - resolution: {integrity: sha512-3Iten7X3Zgwvk6kh6/NRdwN7WbZ760YgFCsF5AxDifltUQzW1RaW+WRmcVtgwFzLjaNu64H+0MPJ13yRa8g3Dw==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - /@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 + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 + derive-valtio@0.1.0: + resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} + peerDependencies: + valtio: '*' - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + detect-europe-js@0.1.2: + resolution: {integrity: sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==} - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - dependencies: - '@types/node': 22.7.5 + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} - /@types/node@18.15.13: - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - dev: true + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - /@types/node@18.19.33: - resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} - dependencies: - undici-types: 5.26.5 + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /@types/node@22.7.5: - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - dependencies: - undici-types: 6.19.8 + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} - /@types/prop-types@15.7.12: - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} - /@types/react-dom@18.3.0: - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - dependencies: - '@types/react': 18.3.11 - dev: true + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} - /@types/react@18.3.11: - resolution: {integrity: sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + 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 - /@types/react@18.3.2: - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} - /@types/secp256k1@4.0.6: - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - dependencies: - '@types/node': 22.7.5 + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true + electron-to-chromium@1.5.427: + resolution: {integrity: sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==} - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - /@types/testing-library__jest-dom@5.14.9: - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} - dependencies: - '@types/jest': 29.5.12 - dev: true + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} - /@types/uuid@10.0.0: - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - /@types/ws@7.4.7: - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - dependencies: - '@types/node': 22.7.5 - dev: false + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + engine.io-client@6.6.6: + resolution: {integrity: sha512-iY6QdftLQ9pyiPoX082bpf/u1UewnOaJrtJIF9T0++QB34lZrj0uP+Q/bj8AlUsAxqhnkTV2BS8SBZSxOmoV5Q==} - /@types/yargs@15.0.19: - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - dependencies: - '@types/yargs-parser': 21.0.3 + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} - /@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 + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} - /@vanilla-extract/dynamic@2.1.2: - resolution: {integrity: sha512-9BGMciD8rO1hdSPIAh1ntsG4LPD3IYKhywR7VOmmz9OO4Lx1hlwkSg3E6X07ujFx7YuBfx0GDQnApG9ESHvB2A==} - dependencies: - '@vanilla-extract/private': 1.0.6 - dev: false + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} - /@vanilla-extract/private@1.0.6: - resolution: {integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==} - dev: false + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} - /@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 + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} - /@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 + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} - /@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 + es-toolkit@1.33.0: + resolution: {integrity: sha512-X13Q/ZSc+vsO1q600bvNK4bxgXMkHcf//RxCmYDaRY5DAcT+eoXjY5hoAPGMdRnWQjvyLEcyauG3b6hz76LNqg==} - /@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 + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + 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 + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true - /@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 + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} - /@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 + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - /@vitest/spy@1.6.0: - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} - dependencies: - tinyspy: 2.2.1 - dev: true + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - /@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 + eth-block-tracker@7.1.0: + resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} + engines: {node: '>=14.0.0'} - /@volar/language-core@1.11.1: - resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} - dependencies: - '@volar/source-map': 1.11.1 - dev: true + eth-json-rpc-filters@6.0.1: + resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} + engines: {node: '>=14.0.0'} - /@volar/source-map@1.11.1: - resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} - dependencies: - muggle-string: 0.3.1 - dev: true + eth-query@2.1.2: + resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - /@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 + eth-rpc-errors@4.0.3: + resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} - /@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 + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - /@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 + ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} - /@vue/language-core@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - 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 - - /@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 + ethers@6.17.0: + resolution: {integrity: sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==} + engines: {node: '>=14.0.0'} - /@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 + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - /@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==} - 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.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 + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - /@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==} - peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: - 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 + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - /@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==} - peerDependencies: - '@tanstack/query-core': '>=5.0.0' - typescript: '>=5.0.4' - viem: 2.x - peerDependenciesMeta: - '@tanstack/query-core': - optional: true - typescript: - 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 + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - /@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 + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} - /@walletconnect/environment@1.0.1: - resolution: {integrity: sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==} - dependencies: - tslib: 1.14.1 + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} - /@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 + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - /@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 + extension-port-stream@3.0.0: + resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} + engines: {node: '>=12.0.0'} - /@walletconnect/events@1.0.1: - resolution: {integrity: sha512-NPTqaoi0oPBVNuLv7qPaJazmGHs5JGyO8eEAk5VGKmJzDR7AHzD4k6ilox5kxk1iwiOnFopBOOMLs86Oa76HpQ==} - dependencies: - keyvaluestorage-interface: 1.0.0 - tslib: 1.14.1 + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /@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 + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} - /@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 + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - /@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 + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} - /@walletconnect/jsonrpc-types@1.0.4: - resolution: {integrity: sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==} - dependencies: - events: 3.3.0 - keyvaluestorage-interface: 1.0.0 + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true - /@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 + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} - /@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 + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} - /@walletconnect/keyvaluestorage@1.1.1: - resolution: {integrity: sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA==} + filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} peerDependencies: - '@react-native-async-storage/async-storage': 1.x + debug: '*' peerDependenciesMeta: - '@react-native-async-storage/async-storage': + debug: 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 - /@walletconnect/logger@2.1.2: - resolution: {integrity: sha512-aAb28I3S6pYXZHQm5ESB+V6rDqIYfsnHaQyzFbwUUBFY4H0OXx/YtTl8lvhUNhMMfb9UxbwEBS253TlXUYJWSw==} - dependencies: - '@walletconnect/safe-json': 1.0.2 - pino: 7.11.0 + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} - /@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 + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} - /@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 + 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' - /@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 + framesync@6.0.1: + resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} - /@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 + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=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 + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} - /@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 + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /@walletconnect/relay-api@1.0.11: - resolution: {integrity: sha512-tLPErkze/HmC9aCmdZOhtVmYZq1wKfWTJtygQHoWtgg722Jd4homo54Cs4ak2RUFUZIGO2RsOpIcWipaua5D5Q==} - dependencies: - '@walletconnect/jsonrpc-types': 1.0.4 + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] - /@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 + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - /@walletconnect/safe-json@1.0.2: - resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - dependencies: - tslib: 1.14.1 + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} - /@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 + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - /@walletconnect/time@1.0.2: - resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - dependencies: - tslib: 1.14.1 + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - /@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 + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - /@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 + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} - /@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 + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} - /@walletconnect/window-getters@1.0.1: - resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} - dependencies: - tslib: 1.14.1 + get-port@7.2.0: + resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} + engines: {node: '>=16'} - /@walletconnect/window-metadata@1.0.1: - resolution: {integrity: sha512-9koTqyGrM2cqFRW517BPY/iEtUDx2r1+Pwwu5m7sJ7ka79wi3EyqhqcICk/yDmv6jAS1rjKgTKXlEhanYjijcA==} - dependencies: - '@walletconnect/window-getters': 1.0.1 - tslib: 1.14.1 + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} - /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 + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} - /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 + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 + get-tsconfig@5.0.0-beta.6: + resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} + engines: {node: '>=20.20.0'} - /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 + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - dev: true + 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 - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} - /aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - /aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /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 + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - dependencies: - humanize-ms: 1.2.1 - dev: false + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - /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 + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - /anser@1.4.10: - resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} - /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 + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - /ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + hono@4.13.8: + resolution: {integrity: sha512-/Gng7NfoykZl2pjukW5Z6+8Yxm3BPRf86GTbQnt0SbySkvax4fyL4H3HhY1cCpBGmiW9XDRFzRV+CXK2W8QudQ==} + engines: {node: '>=16.9.0'} - /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 + hookable@6.1.2: + resolution: {integrity: sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==} - /appdirsjs@1.2.7: - resolution: {integrity: sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - dependencies: - dequal: 2.0.3 - dev: true + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} - /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 + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} - /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 + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} - /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 + human-id@4.2.1: + resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} + hasBin: true + + 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'} + hasBin: true - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - dev: true - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true + idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} - /ast-types@0.15.2: - resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} - engines: {node: '>=4'} - dependencies: - tslib: 2.7.0 + idb-keyval@6.3.0: + resolution: {integrity: sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==} - /astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - /async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - /async-mutex@0.2.6: - resolution: {integrity: sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==} - dependencies: - tslib: 2.7.0 + import-without-cache@0.4.1: + resolution: {integrity: sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==} + engines: {node: ^22.18.0 || >=24.0.0} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - 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. - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - /babel-core@7.0.0-bridge.0(@babel/core@7.24.5): - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.5 + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - /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 + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} - /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 + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true - /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 + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - /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==} - 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 + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - /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' + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} - /base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - dependencies: - safe-buffer: 5.2.1 - dev: false + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} - /bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} - dependencies: - is-windows: 1.0.2 - dev: true + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} - /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 + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + + is-standalone-pwa@0.1.1: + resolution: {integrity: sha512-9Cbovsa52vNQCjdXOzeQq5CnCbAcRk05aU62K20WO372NrTv0NxibLFCK6lQ4/iZEFdEA3p3t2VNOn8AJ53F5g==} - /binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} - /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 + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} - /bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} - /bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} - /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 + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} - /bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.6: + resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} + peerDependencies: + ws: '*' + + isows@1.0.7: + resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - dependencies: - wcwidth: 1.0.1 - dev: true + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} - /brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} - /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) + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} - /bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.9 - dev: false + jose@6.2.12: + resolution: {integrity: sha512-9NiFmJEex0sy2Dk58j2UGBSHgUs2ypF9eZSu4L6vjOX3Dp96Sw1F3uL+H+D1sx02jZZdzUT0HgvCy59CuvXcWw==} - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} + hasBin: true - /bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.1 + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + hasBin: true - /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} + jsdom@24.1.3: + resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + engines: {node: '>=18'} peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.19.12 - load-tsconfig: 0.2.5 - dev: true + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true - /bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + 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==} - /c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} 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 - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - 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 + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} - /caller-callsite@2.0.0: - resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} - engines: {node: '>=4'} - dependencies: - callsites: 2.0.0 + keyvaluestorage-interface@1.0.0: + resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - /caller-path@2.0.0: - resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} - engines: {node: '>=4'} - dependencies: - caller-callsite: 2.0.0 + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - /callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - /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 + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + 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] - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - /caniuse-lite@1.0.30001618: - resolution: {integrity: sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - /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 + 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] - /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 + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - /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 + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - /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 + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} - /change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - dev: true + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + lit-html@3.3.3: + resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} - /check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true + lit@3.3.0: + resolution: {integrity: sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==} - /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 - - /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 - - /ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - dependencies: - consola: 3.2.3 + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 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 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - /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 + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - /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 + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - /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 + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true - /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 + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - /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 + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} - /clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - /clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - dev: false + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - /colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - /command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - /commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} - /commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - /compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - /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 + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - /computeds@0.0.1: - resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} - dev: true + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - /confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} - /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 + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} - /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'} + mipd@0.0.7: + resolution: {integrity: sha512-aAPZPNDQ3uMTdKbuO2YmAw2TxLHO0moa4YKAyETM/DTj5FloZo+a+8tU+iv4GmW+sOxKLSRwcSFuczk+Cpt6fg==} 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 + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true - /consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - /cookie-es@1.1.0: - resolution: {integrity: sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==} + modern-ahocorasick@1.1.0: + resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - /core-js-compat@3.37.1: - resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - dependencies: - browserslist: 4.23.0 + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /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 + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true + multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} - /cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + 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 - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + nanospinner@1.2.2: + resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} - /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 + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - /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 + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - /crossws@0.2.4: - resolution: {integrity: sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: - uWebSockets.js: '*' + encoding: ^0.1.0 peerDependenciesMeta: - uWebSockets.js: + encoding: optional: true - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true - /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 + node-mock-http@1.0.5: + resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==} - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: false + node-releases@2.0.55: + resolution: {integrity: sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==} + engines: {node: '>=18'} - /css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - dev: true + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - /cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - dependencies: - rrweb-cssom: 0.6.0 - dev: true - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + nwsapi@2.2.27: + resolution: {integrity: sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==} - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: true + obj-multiplex@1.0.0: + resolution: {integrity: sha512-0GNJAOsHoBHeNTvl5Vt6IWnpUEcc3uSRxzBri7EDyIcMgYvnY2JL2qdeV5zTMjWQX5OHcD5amcW2HFfDh0gjIA==} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: true + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: true + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} - /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 + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - /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 + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} - /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 + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - /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 + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} - /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 + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} - /date-fns@2.30.0: - resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} - engines: {node: '>=0.11'} - dependencies: - '@babel/runtime': 7.24.5 + openapi-fetch@0.13.8: + resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} - /dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} - /de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - dev: true + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: false + ox@0.14.56: + resolution: {integrity: sha512-Feinlj+deWEam6RIwurRE+eHZ2N3hoUb3AAjQ10BmxRCYIymfqNkv0eZ+4ln4GkgDmSGLD2rGtTMqsFYSVDC6w==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + ox@0.6.7: + resolution: {integrity: sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==} peerDependencies: - supports-color: '*' + typescript: '>=5.4.0' peerDependenciesMeta: - supports-color: + typescript: optional: true - dependencies: - ms: 2.0.0 - /debug@4.3.4(supports-color@5.5.0): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + ox@0.6.9: + resolution: {integrity: sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==} peerDependencies: - supports-color: '*' + typescript: '>=5.4.0' peerDependenciesMeta: - supports-color: + typescript: optional: true - dependencies: - ms: 2.1.2 - supports-color: 5.5.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 + ox@0.9.17: + resolution: {integrity: sha512-rKAnhzhRU3Xh3hiko+i1ZxywZ55eWQzeS/Q4HRKLx2PqfHOolisZHErSsJVipGlmQKHW5qwOED/GighEw9dbLg==} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: true + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} - /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 + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - /deep-object-diff@1.1.9: - resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - dev: false + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - dependencies: - clone: 1.0.4 + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - /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 + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + 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'} - /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 + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} - /defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} - /delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - dev: false + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - /denodeify@1.2.1: - resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: true + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} - /destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + picomatch@3.0.2: + resolution: {integrity: sha512-cfDHL6LStTEKlNilboNtobT/kEa30PtAf2Q1OgszfrG/rpVl1xaFWT9ktfkS306GmHgmnad1Sw4wabhlvFtsTw==} + engines: {node: '>=10'} - /destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} - /detect-browser@5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} - /detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + pify@5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} - /detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - dev: false + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} - /dijkstrajs@1.0.3: - resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + pino@10.0.0: + resolution: {integrity: sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA==} + hasBin: true - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - /dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - dev: true + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} - /dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dev: true + pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: true + popmotion@11.0.3: + resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: true + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} + hasBin: true + 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 - /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 + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} - /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 + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} - /electron-to-chromium@1.4.767: - resolution: {integrity: sha512-nzzHfmQqBss7CE3apQHkHjXW77+8w3ubGCIoEijKCJebPufREaFETgGXWTkh32t259F3Kcq+R8MZdFdOJROgYw==} + preact@10.24.2: + resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - /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 + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true - /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 + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true - /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 + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + pretty-ms@9.3.1: + resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} + engines: {node: '>=18'} - /encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - /encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + process-warning@5.1.0: + resolution: {integrity: sha512-jQSaVHsPgtyw60e1rQ/A+/ArPEj/S8pS/vFnyGa/gYFXrKk/6RuDkoqVDQ5NI5MmS01698ltlAk0NoDBNLujRw==} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} - /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 + 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 - /engine.io-parser@5.2.2: - resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} - engines: {node: '>=10.0.0'} + proxy-compare@2.6.0: + resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} - /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 + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - /envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} - hasBin: true + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - /error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 + qr@0.7.0: + resolution: {integrity: sha512-/VrrACmOAwZVipuRITwfEwOL5oAMEHH5PTmBWaGtlTom2Thxaa+rhmna4zU9PRN2uLw2wdccbkHOLGZb1Q9SdA==} + engines: {node: '>= 20.19.0'} - /errorhandler@1.5.1: - resolution: {integrity: sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==} - engines: {node: '>= 0.8'} - dependencies: - accepts: 1.3.8 - escape-html: 1.0.3 + qrcode@1.5.3: + resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} + engines: {node: '>=10.13.0'} + hasBin: true - /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 + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - /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 + query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} - /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 + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: true + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /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 + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - /es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - /es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - dependencies: - es6-promise: 4.2.8 - dev: false + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - 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==} - engines: {node: '>=12'} - 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'} - 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'} + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + 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 - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + 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 - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + 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 - /estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - dev: true + react-transition-state@1.1.5: + resolution: {integrity: sha512-ITY2mZqc2dWG2eitJkYNdcSFW8aKeOlkL2A/vowRrLL8GH3J6Re/SpD/BLvQzrVOTqjsP0b5S9N10vgNNzwMUQ==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - dependencies: - '@types/estree': 1.0.5 - dev: true + 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 - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - /etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} - /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 + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - /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 + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} - /eth-query@2.1.2: - resolution: {integrity: sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==} - dependencies: - json-rpc-random-id: 1.0.1 - xtend: 4.0.2 + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - /eth-rpc-errors@4.0.3: - resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} - dependencies: - fast-safe-stringify: 2.1.1 + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} - /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 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} - /ethers@6.12.1: - resolution: {integrity: sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==} - engines: {node: '>=14.0.0'} - 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 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} - /ethers@6.13.4: - resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} - engines: {node: '>=14.0.0'} - 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 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /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 + 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 - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - 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 + rolldown@1.2.14: + resolution: {integrity: sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - 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 + 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 - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: 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 - /extension-port-stream@3.0.0: - resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} - engines: {node: '>=12.0.0'} - dependencies: - readable-stream: 3.6.2 - webextension-polyfill: 0.10.0 + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - /eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - dev: false + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - 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 + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} - /fast-redact@3.5.0: - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} - engines: {node: '>=6'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + 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==} - /fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - dev: false + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - /fast-xml-parser@4.3.6: - resolution: {integrity: sha512-M2SovcRxD4+vC493Uc2GZVcZaj66CCJhWurC4viynVSTvrpErCShNcDz1lAho6n9REQKvL/ll4A4/fw6Y9z8nw==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dependencies: - strnum: 1.0.5 - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /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 + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + 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==} - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - /filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + 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@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + 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'} + + socket.io-parser@4.2.7: + resolution: {integrity: sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==} + engines: {node: '>=10.0.0'} + + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.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 + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} - /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 + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + 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==} + + strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - dev: true + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - dependencies: - micromatch: 4.0.5 - pkg-dir: 4.2.0 - dev: true + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} - /flow-enums-runtime@0.0.6: - resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} - /flow-parser@0.236.0: - resolution: {integrity: sha512-0OEk9Gr+Yj7wjDW2KgaNYUypKau71jAfFyeLQF5iVtxqc6uJHag/MT7pmaEApf4qM7u86DkBcd4ualddYMfbLw==} - engines: {node: '>=0.4.0'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + 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: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 + superstruct@1.0.4: + resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} + engines: {node: '>=14.0.0'} - /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 + 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'} - /forge-std@1.1.2: - resolution: {integrity: sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw==} - dev: true + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true + 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 - /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' - 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 + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} - /framesync@6.0.1: - resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} - dependencies: - tslib: 2.7.0 - dev: false + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} - /fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + thread-stream@3.2.0: + resolution: {integrity: sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw==} - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - /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 + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + 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'} + + 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'} + + 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==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + 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.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==} + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + 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==} + + 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'} + + 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' + + 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 + + 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 + + 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: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + viem@2.57.7: + resolution: {integrity: sha512-x3UqqrcQuESaRVK6a0BvNmoNP0SVhu913uxEAxYLJx1lNYnj6ylTntfUdakCUKjk1+T+63gkdwFGJQ2O5C/nRw==} + 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@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 + + 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 + + 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==} + + 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@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'} + + 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'} + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + + 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==} + + 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.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.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': {} + + '@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.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.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' + - '@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.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.14': + optional: true + + '@biomejs/cli-darwin-x64@2.5.14': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.5.14': + optional: true + + '@biomejs/cli-linux-arm64@2.5.14': + optional: true + + '@biomejs/cli-linux-x64-musl@2.5.14': + optional: true + + '@biomejs/cli-linux-x64@2.5.14': + optional: true + + '@biomejs/cli-win32-arm64@2.5.14': + optional: true + + '@biomejs/cli-win32-x64@2.5.14': + 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.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.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.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 + - debug + - fastestsmallesttextencoderdecoder + - supports-color + - 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.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' + - 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.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' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + optional: true + + '@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.21.5': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.25.12': + 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.21.5': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + 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.21.5': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.25.12': + 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.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.57.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@3.25.76) + 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 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + + '@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.7.0 + 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 + + '@motionone/animation@10.18.0': + dependencies: + '@motionone/easing': 10.18.0 + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.7.0 + + '@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.7.0 + + '@motionone/easing@10.18.0': + dependencies: + '@motionone/utils': 10.18.0 + tslib: 2.7.0 + + '@motionone/generators@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + '@motionone/utils': 10.18.0 + tslib: 2.7.0 + + '@motionone/types@10.17.1': {} + + '@motionone/utils@10.18.0': + dependencies: + '@motionone/types': 10.17.1 + hey-listen: 1.0.8 + tslib: 2.7.0 + + '@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.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) + '@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.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 + - 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.57.7(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.57.7(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.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: + '@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.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' + - '@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.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' + - '@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 + 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: + '@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 + optional: true + + '@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 + 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: + '@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 + 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: + '@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.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' + - '@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.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' + - '@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 + optional: true + + '@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.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' + - '@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.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' + - '@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 + optional: true + + '@rolldown/binding-android-arm-eabi@1.2.14': + optional: true + + '@rolldown/binding-android-arm64@1.2.14': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.14': + optional: true + + '@rolldown/binding-darwin-x64@1.2.14': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.14': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.14': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.14': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.14': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.14': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.14': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.14': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.14': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.27': {} + + '@rolldown/pluginutils@1.0.1': {} + + '@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 + + '@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 + 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.57.7(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.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': {} + + '@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 + + '@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))': + 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/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 + + '@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 + + '@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.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 + 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.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.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.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.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: + - '@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.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.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) + '@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) + '@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.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.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 + 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.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.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 + 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 + 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: + '@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 + optional: true + + '@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 + optional: true + + '@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: 10.0.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 + 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: + '@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 + optional: true + + '@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 + 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: + '@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 + + '@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: + '@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 + - 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: + '@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 + - zod + + '@walletconnect/utils@2.21.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.0 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(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 + 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: + '@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 + + '@walletconnect/utils@2.21.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.4.3)': + dependencies: + '@noble/ciphers': 1.2.1 + '@noble/curves': 1.8.1 + '@noble/hashes': 1.7.1 + '@walletconnect/jsonrpc-utils': 1.0.8 + '@walletconnect/keyvaluestorage': 1.1.1 + '@walletconnect/relay-api': 1.0.11 + '@walletconnect/relay-auth': 1.1.0 + '@walletconnect/safe-json': 1.0.2 + '@walletconnect/time': 1.0.2 + '@walletconnect/types': 2.21.1 + '@walletconnect/window-getters': 1.0.1 + '@walletconnect/window-metadata': 1.0.1 + bs58: 6.0.0 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: 3.1.0 + viem: 2.23.2(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 + optional: true + + '@walletconnect/window-getters@1.0.1': + dependencies: + tslib: 1.14.1 + + '@walletconnect/window-metadata@1.0.1': dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + '@walletconnect/window-getters': 1.0.1 + tslib: 1.14.1 - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + '@yuku-core/binding-android-arm64@0.19.0': + optional: true - /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 + '@yuku-core/binding-darwin-arm64@0.19.0': optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + '@yuku-core/binding-darwin-x64@0.19.0': + optional: true - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - dev: true + '@yuku-core/binding-freebsd-x64@0.19.0': + optional: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + '@yuku-core/binding-linux-arm-gnu@0.19.0': + optional: true - /futoin-hkdf@1.5.3: - resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} - engines: {node: '>=8'} + '@yuku-core/binding-linux-arm-musl@0.19.0': + optional: true - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + optional: true - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + '@yuku-core/binding-linux-arm64-musl@0.19.0': + optional: true - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + '@yuku-core/binding-linux-x64-gnu@0.19.0': + optional: true - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.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 + '@yuku-core/binding-linux-x64-musl@0.19.0': + optional: true - /get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - dev: false + '@yuku-core/binding-win32-arm64@0.19.0': + optional: true - /get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + '@yuku-core/binding-win32-x64@0.19.0': + optional: true - /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 + '@yuku-toolchain/types@0.19.0': {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + abitype@1.0.6(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + abitype@1.0.8(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - dev: true + abitype@1.0.8(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 + optional: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 + abitype@1.2.3(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - 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 + abitype@1.2.3(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + abitype@1.2.3(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - dev: true + abitype@1.3.0(typescript@5.9.3)(zod@3.22.4): + optionalDependencies: + typescript: 5.9.3 + zod: 3.22.4 - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - 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 + abitype@1.3.0(typescript@5.9.3)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.3 + zod: 3.25.76 + + abitype@1.3.0(typescript@5.9.3)(zod@4.4.3): + optionalDependencies: + typescript: 5.9.3 + zod: 4.4.3 - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + acorn-walk@8.3.5: dependencies: - get-intrinsic: 1.2.4 + acorn: 8.18.0 - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + acorn@8.18.0: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + aes-js@3.0.0: {} - /h3@1.11.1: - resolution: {integrity: sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==} + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: 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 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - - uWebSockets.js - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + - supports-color - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + agent-base@7.1.4: + optional: true - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + ansi-colors@4.1.3: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + ansi-styles@4.3.0: dependencies: - es-define-property: 1.0.0 - - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + color-convert: 2.0.1 - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + ansi-styles@5.2.0: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + anymatch@3.1.3: dependencies: - has-symbols: 1.0.3 + normalize-path: 3.0.0 + picomatch: 2.3.2 - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + argparse@1.0.10: dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 + sprintf-js: 1.0.3 - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + argparse@2.0.1: {} + + array-union@2.1.0: {} + + assertion-error@1.1.0: {} + + async-mutex@0.2.6: dependencies: - function-bind: 1.1.2 + tslib: 2.7.0 - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - dev: true + asynckit@0.4.0: {} - /hermes-estree@0.19.1: - resolution: {integrity: sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==} + atomic-sleep@1.0.0: {} - /hermes-estree@0.20.1: - resolution: {integrity: sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 - /hermes-parser@0.19.1: - resolution: {integrity: sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==} + axios-retry@4.5.0(axios@1.20.0): dependencies: - hermes-estree: 0.19.1 + axios: 1.20.0 + is-retry-allowed: 2.2.0 - /hermes-parser@0.20.1: - resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} + axios@1.20.0: dependencies: - hermes-estree: 0.20.1 + 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 - /hermes-profile-transformer@0.0.6: - resolution: {integrity: sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==} - engines: {node: '>=8'} + 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: - source-map: 0.7.4 + '@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@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - supports-color - /hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + balanced-match@1.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 + base-x@4.0.1: {} - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false + base-x@5.0.1: {} - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true + base64-js@1.5.1: {} - /html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} - dependencies: - whatwg-encoding: 3.1.1 - dev: true + baseline-browser-mapping@2.11.23: {} - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + bech32@1.1.4: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + better-path-resolve@1.0.0: dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 + is-windows: 1.0.2 - /http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + big.js@6.2.2: {} + + bn.js@4.12.5: {} + + bn.js@5.2.5: {} + + bowser@2.14.1: {} + + brace-expansion@1.1.18: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true + balanced-match: 1.0.2 + concat-map: 0.0.1 - /http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + braces@3.0.3: dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true + fill-range: 7.1.1 - /http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + brorand@1.1.0: {} - /https-proxy-agent@7.0.4: - resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} - engines: {node: '>= 14'} + browserslist@4.28.9: dependencies: - agent-base: 7.1.1 - debug: 4.3.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true + 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) - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: true + bs58@5.0.0: + dependencies: + base-x: 4.0.1 - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + bs58@6.0.0: + dependencies: + base-x: 5.0.1 - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + bundle-require@5.1.0(esbuild@0.25.12): dependencies: - ms: 2.1.3 - dev: false + esbuild: 0.25.12 + load-tsconfig: 0.2.5 - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: true + cac@6.7.14: {} - /i18next-browser-languagedetector@7.1.0: - resolution: {integrity: sha512-cr2k7u1XJJ4HTOjM9GyOMtbOA47RtUoWRAtt52z43r3AoMs2StYKyjS3URPhzHaf+mn10hY9dZWamga5WPQjhA==} - dependencies: - '@babel/runtime': 7.24.5 + cac@7.1.0: {} - /i18next@23.11.5: - resolution: {integrity: sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==} + call-bind-apply-helpers@1.0.2: dependencies: - '@babel/runtime': 7.24.5 + es-errors: 1.3.0 + function-bind: 1.1.2 - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + call-bind@1.0.9: dependencies: - safer-buffer: 2.1.2 - 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 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + call-bound@1.0.4: dependencies: - safer-buffer: 2.1.2 - dev: true + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - /idb-keyval@6.2.1: - resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + camelcase@5.3.1: {} - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + camelize@1.0.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + caniuse-lite@1.0.30001810: {} - /image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} - engines: {node: '>=16.x'} - hasBin: true + chai@4.5.0: dependencies: - queue: 6.0.2 + 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 - /import-fresh@2.0.0: - resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} - engines: {node: '>=4'} - dependencies: - caller-path: 2.0.0 - resolve-from: 3.0.0 + chalk@5.6.2: {} - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + change-case@5.4.4: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + chardet@2.2.0: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + charenc@0.0.2: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + check-error@1.0.3: dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + get-func-name: 2.0.2 - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + chokidar@4.0.1: dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - dev: true + readdirp: 4.1.2 - /invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + chokidar@5.0.0: dependencies: - loose-envify: 1.4.0 + readdirp: 5.1.1 - /iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + chownr@3.0.0: {} - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + cliui@6.0.0: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + cliui@8.0.1: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - dev: true + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + clsx@1.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true + clsx@2.1.1: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + color-convert@2.0.1: dependencies: - binary-extensions: 2.3.0 + color-name: 1.1.4 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + color-name@1.1.4: {} + + combined-stream@1.0.8: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - dev: true + delayed-stream: 1.0.0 - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + commander@14.0.2: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + 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: - hasown: 2.0.2 + '@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 + framer-motion: 6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + 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@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) + transitivePeerDependencies: + - '@babel/core' + - react-is - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + convert-source-map@2.0.0: {} + + cookie-es@1.2.3: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + cross-fetch@3.2.0: dependencies: - is-typed-array: 1.1.13 - dev: true + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + cross-fetch@4.1.0: dependencies: - has-tostringtag: 1.0.2 - dev: true + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding - /is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true + crossws@0.3.5: + dependencies: + uncrypto: 0.1.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 + crypt@0.0.2: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + css-color-keywords@1.0.0: {} - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + css-what@6.2.2: {} - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + cssstyle@4.6.0: dependencies: - has-tostringtag: 1.0.2 + '@asamuzakjp/css-color': 3.2.0 + rrweb-cssom: 0.8.0 + optional: true - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + csstype@3.2.3: {} + + cuer@0.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.9.3): dependencies: - is-extglob: 2.1.1 + qr: 0.7.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + typescript: 5.9.3 - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + data-urls@5.0.0: dependencies: - is-docker: 3.0.0 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + optional: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.7 - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: true + dayjs@1.11.13: {} - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + debug@4.3.4: + dependencies: + ms: 2.1.2 - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + debug@4.4.3(supports-color@5.5.0): dependencies: - has-tostringtag: 1.0.2 - dev: true + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + decamelize@1.2.0: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + decimal.js@10.6.0: + optional: true - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 + decode-uri-component@0.2.2: {} - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true + dedent@0.7.0: {} - /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 + dedent@1.7.2: {} - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + deep-eql@4.1.4: dependencies: - call-bind: 1.0.7 - dev: true + type-detect: 4.1.0 - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + deep-object-diff@1.1.9: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + deepmerge@4.3.1: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + define-data-property@1.1.4: dependencies: - has-tostringtag: 1.0.2 - dev: true + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - dependencies: - better-path-resolve: 1.0.0 - dev: true + define-lazy-prop@2.0.0: {} - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true + defu@6.1.7: {} - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + delayed-stream@1.0.0: {} + + derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.31)(react@18.3.1)): dependencies: - which-typed-array: 1.1.15 + valtio: 1.13.2(@types/react@18.3.31)(react@18.3.1) - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + destr@2.0.5: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: true + detect-browser@5.3.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.7 - dev: true + detect-europe-js@0.1.2: {} - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + detect-indent@6.1.0: {} - /is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} + detect-libc@2.1.2: + optional: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 + detect-node-es@1.1.0: {} - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - dependencies: - is-inside-container: 1.0.0 + diff-sequences@29.6.3: {} - /is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} - dependencies: - system-architecture: 0.1.0 + dijkstrajs@1.0.3: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + dotenv-expand@10.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dotenv@16.6.1: {} - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + dts-resolver@3.0.0: {} - /isomorphic-ws@4.0.1(ws@7.5.9): - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' + dunder-proto@1.0.1: dependencies: - ws: 7.5.9 - dev: false + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - /isows@1.0.6(ws@8.18.0): - resolution: {integrity: sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==} - peerDependencies: - ws: '*' + eciesjs@0.4.18: dependencies: - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@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 - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + electron-to-chromium@1.5.427: {} - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + elliptic@6.6.1: dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true + 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 - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + emoji-regex@8.0.0: {} + + empathic@2.1.0: {} + + encode-utf8@1.0.3: {} + + end-of-stream@1.4.5: dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true + once: 1.4.0 - /jayson@4.1.0: - resolution: {integrity: sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==} - engines: {node: '>=8'} - hasBin: true + engine.io-client@6.6.6(bufferutil@4.1.0)(utf-8-validate@5.0.10): 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 + '@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 - dev: false - /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 + engine.io-parser@5.2.3: {} - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + enquirer@2.4.1: 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 + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + entities@6.0.1: + optional: true - /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} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + es-define-property@1.0.1: {} - /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} - 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 + es-errors@1.3.0: {} - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + es-object-atoms@1.1.2: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.7.5 - jest-util: 29.7.0 + es-errors: 1.3.0 - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + es-set-tostringtag@2.1.0: 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 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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 + es-toolkit@1.33.0: {} - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + 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@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + eth-block-tracker@7.1.0: dependencies: - '@types/node': 22.7.5 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - 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 - /joi@17.13.1: - resolution: {integrity: sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==} + eth-json-rpc-filters@6.0.1: 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 - - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - 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 - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + eth-query@2.1.2: dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - /jsc-android@250231.0.0: - resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} + json-rpc-random-id: 1.0.1 + xtend: 4.0.2 - /jsc-safe-url@0.2.4: - resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + eth-rpc-errors@4.0.3: + dependencies: + fast-safe-stringify: 2.1.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 + 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: - - supports-color + - bufferutil + - utf-8-validate - /jsdom@24.0.0: - resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + ethers@6.17.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): 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 + '@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 - - supports-color - utf-8-validate - dev: true - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true + eventemitter2@6.4.9: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + eventemitter3@4.0.7: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + eventemitter3@5.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + events@3.3.0: {} - /json-rpc-engine@6.1.0: - resolution: {integrity: sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==} - engines: {node: '>=10.0.0'} + execa@8.0.1: dependencies: - '@metamask/safe-event-emitter': 2.0.0 - eth-rpc-errors: 4.0.3 - - /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==} - dev: true - - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 + 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 - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true + 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 - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + extendable-error@0.1.7: {} - /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - requiresBuild: true + extension-port-stream@3.0.0: dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 readable-stream: 3.6.2 + webextension-polyfill: 0.10.0 - /keyvaluestorage-interface@1.0.0: - resolution: {integrity: sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==} - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + fast-deep-equal@3.1.3: {} - /kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - 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 - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + fast-safe-stringify@2.1.1: {} - /lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + fastq@1.20.3: dependencies: - debug: 2.6.9 - marky: 1.2.5 - transitivePeerDependencies: - - supports-color + reusify: 1.1.0 - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + fdir@6.5.0(picomatch@3.0.2): + optionalDependencies: + picomatch: 3.0.2 - /listhen@1.7.2: - resolution: {integrity: sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==} - hasBin: true - 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 - transitivePeerDependencies: - - uWebSockets.js + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 - /lit-element@3.3.3: - resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} + figures@6.1.0: dependencies: - '@lit-labs/ssr-dom-shim': 1.2.0 - '@lit/reactive-element': 1.6.3 - lit-html: 2.8.0 + is-unicode-supported: 2.1.0 - /lit-html@2.8.0: - resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} + fill-range@7.1.1: dependencies: - '@types/trusted-types': 2.0.7 + to-regex-range: 5.0.1 - /lit@2.8.0: - resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} + filter-obj@1.1.0: {} + + find-up@4.1.0: dependencies: - '@lit/reactive-element': 1.6.3 - lit-element: 3.3.3 - lit-html: 2.8.0 + locate-path: 5.0.0 + path-exists: 4.0.0 - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + follow-redirects@1.16.0: {} - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + for-each@0.3.5: dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true + is-callable: 1.2.7 - /local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + form-data@4.0.6: dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - 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 - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + framer-motion@6.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 + '@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 - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + framesync@6.0.1: dependencies: - p-locate: 4.1.0 + tslib: 2.7.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + fs-extra@7.0.1: dependencies: - p-locate: 5.0.0 + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - /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} + fs-extra@8.1.0: dependencies: - p-locate: 6.0.0 - dev: true + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 - /lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + fs.realpath@1.0.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + fsevents@2.3.3: + optional: true - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + function-bind@1.1.2: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + generator-function@2.0.1: {} - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + gensync@1.0.0-beta.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + get-caller-file@2.0.5: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + get-func-name@2.0.2: {} - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} + get-intrinsic@1.3.0: dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: true + 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 - /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 + get-nonce@1.0.1: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 + get-port@7.2.0: {} - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + get-proto@1.0.1: dependencies: - get-func-name: 2.0.2 - dev: true + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 - /lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + get-stream@8.0.1: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + get-stream@9.0.1: dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + get-tsconfig@5.0.0-beta.6: dependencies: - yallist: 3.1.1 + resolve-pkg-maps: 1.0.0 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + glob-parent@5.1.2: dependencies: - yallist: 4.0.0 - dev: true - - /lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - dev: true + is-glob: 4.0.3 - /magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + glob@7.2.3: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true + 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 - /make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + globby@11.1.0: dependencies: - pify: 4.0.1 - semver: 5.7.2 + 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 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.2 - dev: true + gopd@1.2.0: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 + graceful-fs@4.2.11: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + 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 - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + has-flag@3.0.0: {} - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + has-flag@4.0.0: {} - /media-query-parser@2.0.2: - resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + has-property-descriptors@1.0.2: dependencies: - '@babel/runtime': 7.24.5 - dev: false + es-define-property: 1.0.1 - /memoize-one@5.2.1: - resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} + has-symbols@1.1.0: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + has-tostringtag@1.0.2: 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==} + has-symbols: 1.1.0 - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /metro-babel-transformer@0.80.9: - resolution: {integrity: sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==} - engines: {node: '>=18'} + hash.js@1.1.7: dependencies: - '@babel/core': 7.24.5 - hermes-parser: 0.20.1 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - - /metro-cache-key@0.80.9: - resolution: {integrity: sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==} - engines: {node: '>=18'} + inherits: 2.0.4 + minimalistic-assert: 1.0.1 - /metro-cache@0.80.9: - resolution: {integrity: sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==} - engines: {node: '>=18'} + hasown@2.0.4: dependencies: - metro-core: 0.80.9 - rimraf: 3.0.2 + function-bind: 1.1.2 - /metro-config@0.80.9: - resolution: {integrity: sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==} - engines: {node: '>=18'} - 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 + hey-listen@1.0.8: {} - /metro-core@0.80.9: - resolution: {integrity: sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==} - engines: {node: '>=18'} + hmac-drbg@1.0.1: dependencies: - lodash.throttle: 4.1.1 - metro-resolver: 0.80.9 + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - /metro-file-map@0.80.9: - resolution: {integrity: sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==} - engines: {node: '>=18'} + hoist-non-react-statics@3.3.2: 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 - transitivePeerDependencies: - - supports-color + react-is: 16.13.1 - /metro-minify-terser@0.80.9: - resolution: {integrity: sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==} - engines: {node: '>=18'} - dependencies: - terser: 5.31.0 + hono@4.13.8: {} - /metro-resolver@0.80.9: - resolution: {integrity: sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==} - engines: {node: '>=18'} + hookable@6.1.2: {} - /metro-runtime@0.80.9: - resolution: {integrity: sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==} - engines: {node: '>=18'} + html-encoding-sniffer@4.0.0: dependencies: - '@babel/runtime': 7.24.5 + whatwg-encoding: 3.1.1 + optional: true - /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 + html-escaper@2.0.2: {} - /metro-symbolicate@0.80.9: - resolution: {integrity: sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==} - engines: {node: '>=18'} - hasBin: true + http-proxy-agent@7.0.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 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color + optional: true - /metro-transform-plugins@0.80.9: - resolution: {integrity: sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==} - engines: {node: '>=18'} + http-proxy@1.18.1: 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 + eventemitter3: 4.0.7 + follow-redirects: 1.16.0 + requires-port: 1.0.0 transitivePeerDependencies: - - supports-color + - debug - /metro-transform-worker@0.80.9: - resolution: {integrity: sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==} - engines: {node: '>=18'} + https-proxy-agent@5.0.1: 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 + agent-base: 6.0.2 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - - bufferutil - - encoding - supports-color - - utf-8-validate - /metro@0.80.9: - resolution: {integrity: sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==} - engines: {node: '>=18'} - hasBin: true + https-proxy-agent@7.0.6: 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 + agent-base: 7.1.4 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - - bufferutil - - encoding - supports-color - - utf-8-validate + optional: true - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + human-id@4.2.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 + human-signals@5.0.0: {} - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + human-signals@8.0.1: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + husky@8.0.3: {} + + iconv-lite@0.6.3: dependencies: - mime-db: 1.52.0 + safer-buffer: 2.1.2 + optional: true - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true + idb-keyval@6.2.1: {} - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true + idb-keyval@6.3.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + ieee754@1.2.1: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + ignore@5.3.2: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + import-without-cache@0.4.1: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + inherits@2.0.4: {} - /minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - dependencies: - brace-expansion: 1.1.11 - dev: true + iron-webcrypto@1.2.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + is-arguments@1.2.0: dependencies: - brace-expansion: 1.1.11 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.2: dependencies: - brace-expansion: 2.0.1 - dev: true + 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 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + is-glob@4.0.3: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true + is-extglob: 2.1.1 - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + is-number@7.0.0: {} - /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 - dependencies: - typescript: 5.4.5 + is-plain-obj@4.1.0: {} - /mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - dev: true + is-potential-custom-element-name@1.0.1: + optional: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + is-regex@1.2.1: dependencies: - minimist: 1.2.8 + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + is-retry-allowed@2.2.0: {} - /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 + is-standalone-pwa@0.1.1: {} - /modern-ahocorasick@1.0.1: - resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} - dev: false + is-stream@2.0.1: {} - /motion@10.16.2: - resolution: {integrity: sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ==} - 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 + is-stream@3.0.0: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + is-stream@4.0.1: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + is-unicode-supported@2.1.0: {} - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - dev: true + is-windows@1.0.2: {} - /multiformats@9.9.0: - resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + isarray@1.0.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + isarray@2.0.5: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + isexe@2.0.0: {} - /nocache@3.0.4: - resolution: {integrity: sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==} - engines: {node: '>=12.0.0'} + isows@1.0.6(ws@8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + isows@1.0.7(ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + istanbul-lib-coverage@3.2.2: {} - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - /node-addon-api@7.1.0: - resolution: {integrity: sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==} - engines: {node: ^16 || ^18 || >= 20} + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color - /node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} + istanbul-reports@3.2.0: dependencies: - minimatch: 3.1.2 + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - /node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + jose@6.2.12: {} - /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 + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.15.2: dependencies: - whatwg-url: 5.0.0 + argparse: 1.0.10 + esprima: 4.0.1 - /node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + js-yaml@4.3.2: + dependencies: + argparse: 2.0.1 - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true + jsdom@24.1.3(bufferutil@4.1.0)(utf-8-validate@5.0.10): + dependencies: + 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 + - supports-color + - utf-8-validate + optional: true - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + jsesc@3.1.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + json-rpc-engine@6.1.0: + dependencies: + '@metamask/safe-event-emitter': 2.0.0 + eth-rpc-errors: 4.0.3 - /node-stream-zip@1.15.0: - resolution: {integrity: sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==} - engines: {node: '>=0.12.0'} + json-rpc-random-id@1.0.1: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: true + json5@2.2.3: {} - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + keccak@3.0.4: dependencies: - path-key: 3.1.1 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 + keyvaluestorage-interface@1.0.0: {} - /nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + lightningcss-android-arm64@1.33.0: + optional: true - /nwsapi@2.2.10: - resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} - dev: true + lightningcss-darwin-arm64@1.33.0: + optional: true - /ob1@0.80.9: - resolution: {integrity: sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==} - engines: {node: '>=18'} + lightningcss-darwin-x64@1.33.0: + optional: true - /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 + lightningcss-freebsd-x64@1.33.0: + optional: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true - /ofetch@1.3.4: - resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} - dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.3 + lightningcss-linux-x64-musl@1.33.0: + optional: true - /ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + lightningcss-win32-arm64-msvc@1.33.0: + optional: true - /on-exit-leak-free@0.2.0: - resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==} + lightningcss-win32-x64-msvc@1.33.0: + optional: true - /on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + lightningcss@1.33.0: dependencies: - ee-first: 1.1.1 + 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 - /on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + lit-element@4.2.2: dependencies: - ee-first: 1.1.1 - - /on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + '@lit-labs/ssr-dom-shim': 1.6.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.3 - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + lit-html@3.3.3: dependencies: - wrappy: 1.0.2 + '@types/trusted-types': 2.0.7 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + lit@3.3.0: dependencies: - mimic-fn: 2.1.0 + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 + load-tsconfig@0.2.5: {} - /open@6.4.0: - resolution: {integrity: sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==} - engines: {node: '>=8'} + local-pkg@0.5.1: dependencies: - is-wsl: 1.1.0 + mlly: 1.8.2 + pkg-types: 1.3.1 - /open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 + p-locate: 4.1.0 - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 + lodash.startcase@4.4.0: {} - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + lodash@4.17.23: {} + + loose-envify@1.4.0: 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 + js-tokens: 4.0.0 - /ora@6.3.1: - resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + loupe@2.3.7: 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 + get-func-name: 2.0.2 - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: true + lru-cache@10.4.3: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - dependencies: - p-map: 2.1.0 - dev: true + lru-cache@11.5.2: {} - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + lru-cache@5.1.1: dependencies: - p-try: 2.2.0 + yallist: 3.1.1 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + magic-string@0.30.21: dependencies: - yocto-queue: 0.1.0 + '@jridgewell/sourcemap-codec': 1.5.5 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magicast@0.3.5: dependencies: - yocto-queue: 1.0.0 - dev: true + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + source-map-js: 1.2.1 - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + make-dir@4.0.0: dependencies: - yocto-queue: 1.0.0 - dev: true + semver: 7.8.5 - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 + math-intrinsics@1.1.0: {} - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + md5@2.3.0: dependencies: - p-limit: 2.3.0 + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + media-query-parser@2.0.2: dependencies: - p-limit: 3.1.0 + '@babel/runtime': 7.29.7 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - p-limit: 4.0.0 - dev: true + merge-stream@2.0.0: {} - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: true + merge2@1.4.1: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + micro-ftch@0.3.1: {} - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + micromatch@4.0.8: dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 + braces: 3.0.3 + picomatch: 2.3.2 - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - 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 + mime-db@1.52.0: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + mime-types@2.1.35: dependencies: - entities: 4.5.0 - dev: true + mime-db: 1.52.0 - /parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + mimic-fn@4.0.0: {} - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: true + minimalistic-assert@1.0.1: {} - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + minimalistic-crypto-utils@1.0.1: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.18 - /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 + minipass@7.1.3: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + mipd@0.0.7(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + mkdirp@3.0.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + modern-ahocorasick@1.1.0: {} - /pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + mri@1.2.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + ms@2.1.2: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + ms@2.1.3: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + multiformats@9.9.0: {} - /picomatch@3.0.1: - resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} - engines: {node: '>=10'} - dev: true + nanoid@3.3.18: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + nanospinner@1.2.2: + dependencies: + picocolors: 1.1.1 - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + node-addon-api@2.0.2: {} - /pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} + node-fetch-native@1.6.7: {} - /pino-abstract-transport@0.5.0: - resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==} + node-fetch@2.7.0: dependencies: - duplexify: 4.1.3 - split2: 4.2.0 + whatwg-url: 5.0.0 - /pino-std-serializers@4.0.0: - resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==} + node-gyp-build@4.8.4: {} - /pino@7.11.0: - resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==} - hasBin: true - 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 - quick-format-unescaped: 4.0.4 - real-require: 0.1.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 2.8.0 - thread-stream: 0.15.2 + node-mock-http@1.0.5: {} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + node-releases@2.0.55: {} - /pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 + normalize-path@3.0.0: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + npm-run-path@5.3.0: dependencies: - find-up: 4.1.0 - dev: true + path-key: 4.0.0 - /pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + npm-run-path@6.0.0: dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - - /pngjs@5.0.0: - resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} - engines: {node: '>=10.13.0'} + path-key: 4.0.0 + unicorn-magic: 0.3.0 - /pony-cause@2.1.11: - resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} - engines: {node: '>=12.0.0'} + nwsapi@2.2.27: + optional: true - /popmotion@11.0.3: - resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} + obj-multiplex@1.0.0: dependencies: - framesync: 6.0.1 - hey-listen: 1.0.8 - style-value-types: 5.0.0 - tslib: 2.7.0 - dev: false + end-of-stream: 1.4.5 + once: 1.4.0 + readable-stream: 2.3.8 - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + obug@2.2.1: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + obug@3.0.0: {} - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + ofetch@1.5.1: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - dev: true + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 - /preact@10.21.0: - resolution: {integrity: sha512-aQAIxtzWEwH8ou+OovWVSVNlFImL7xUCwJX3YMqA3U8iKCNC34999fFOnWjYNsylgfPgMexpbk7WYOLtKr/mxg==} + on-exit-leak-free@2.1.2: {} - /preferred-pm@3.1.3: - resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} - engines: {node: '>=10'} + once@1.4.0: 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 - - /prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - dev: true + wrappy: 1.0.2 - /pretty-format@26.6.2: - resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} - engines: {node: '>= 10'} + onetime@6.0.0: dependencies: - '@jest/types': 26.6.2 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 17.0.2 + mimic-fn: 4.0.0 - /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} + open@8.4.2: dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + openapi-fetch@0.13.8: 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==} + openapi-typescript-helpers: 0.0.15 - /process-warning@1.0.0: - resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + openapi-typescript-helpers@0.0.15: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false + outdent@0.5.0: {} - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + ox@0.14.56(typescript@5.9.3)(zod@3.22.4): dependencies: - asap: 2.0.6 + '@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 - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + ox@0.14.56(typescript@5.9.3)(zod@3.25.76): dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - /proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} + '@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 - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true + ox@0.14.56(typescript@5.9.3)(zod@4.4.3): + dependencies: + '@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 - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true + ox@0.6.7(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@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 - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + ox@0.6.7(typescript@5.9.3)(zod@4.4.3): dependencies: - end-of-stream: 1.4.4 - once: 1.4.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 + optional: true - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + ox@0.6.9(typescript@5.9.3)(zod@3.25.76): + dependencies: + '@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 - /qr-code-styling@1.6.0-rc.1: - resolution: {integrity: sha512-ModRIiW6oUnsP18QzrRYZSc/CFKFKIdj7pUs57AEVH20ajlglRpN3HukjHk0UbNMTlKGuaYl7Gt6/O5Gg2NU2Q==} + ox@0.6.9(typescript@5.9.3)(zod@4.4.3): dependencies: - qrcode-generator: 1.4.4 + '@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 + optional: true - /qrcode-generator@1.4.4: - resolution: {integrity: sha512-HM7yY8O2ilqhmULxGMpcHSF1EhJJ9yBj8gvDEuZ6M+KGJ0YY2hKpnXvRD+hZPLrDVck3ExIGhmPtSdcjC+guuw==} + ox@0.9.17(typescript@5.9.3)(zod@4.4.3): + dependencies: + '@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 - /qrcode-terminal-nooctal@0.12.1: - resolution: {integrity: sha512-jy/kkD0iIMDjTucB+5T6KBsnirlhegDH47vHgrj5MejchSQmi/EAMM0xMFeePgV9CJkkAapNakpVUWYgHvtdKg==} - hasBin: true + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 - /qrcode@1.5.3: - resolution: {integrity: sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==} - engines: {node: '>=10.13.0'} - hasBin: true + p-limit@2.3.0: dependencies: - dijkstrajs: 1.0.3 - encode-utf8: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 + p-try: 2.2.0 - /qrcode@1.5.4: - resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} - engines: {node: '>=10.13.0'} - hasBin: true + p-limit@5.0.0: dependencies: - dijkstrajs: 1.0.3 - pngjs: 5.0.0 - yargs: 15.4.1 - dev: false + yocto-queue: 1.2.2 - /query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} + p-locate@4.1.0: dependencies: - decode-uri-component: 0.2.2 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 + p-limit: 2.3.0 + + p-map@2.1.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. + p-try@2.2.0: {} - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + parse-ms@4.0.0: {} - /queue@6.0.2: - resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + parse5@7.3.0: dependencies: - inherits: 2.0.4 + entities: 6.0.1 + optional: true - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + path-exists@4.0.0: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + path-is-absolute@1.0.1: {} - /radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + path-key@3.1.1: {} - /range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + path-key@4.0.0: {} - /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 + path-type@4.0.0: {} - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + pathe@1.1.2: {} - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false + pathe@2.0.3: {} - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + pathval@1.1.1: {} - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + picocolors@1.1.1: {} - /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) + picomatch@2.3.2: {} - /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 + picomatch@3.0.2: {} - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} + picomatch@4.0.7: {} - /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 + pify@3.0.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 - 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 + pify@4.0.1: {} - /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 - dependencies: - object-assign: 4.1.1 - react: 18.3.1 - react-is: 18.3.1 + pify@5.0.0: {} - /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 + pino-abstract-transport@2.0.0: 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 + split2: 4.2.0 - /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' - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false + pino-std-serializers@7.1.0: {} - /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' + pino@10.0.0: dependencies: - debounce: 1.2.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false + atomic-sleep: 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.2.0 + safe-stable-stringify: 2.5.0 + slow-redact: 0.3.2 + sonic-boom: 4.2.1 + thread-stream: 3.2.0 - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + pkg-types@1.3.1: dependencies: - loose-envify: 1.4.0 + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 - /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 + pngjs@5.0.0: {} - /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 + pony-cause@2.1.11: {} - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + popmotion@11.0.3: dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.1 - pify: 4.0.1 - strip-bom: 3.0.0 - dev: true + framesync: 6.0.1 + hey-listen: 1.0.8 + style-value-types: 5.0.0 + tslib: 2.7.0 - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + 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: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 + '@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.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.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 + - use-sync-external-store - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + possible-typed-array-names@1.1.0: {} - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + postcss-value-parser@4.2.0: {} + + postcss@8.5.26: dependencies: - picomatch: 2.3.1 + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 - /readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} + preact@10.24.2: {} - /real-require@0.1.0: - resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==} - engines: {node: '>= 12.13.0'} + prettier@2.8.8: {} - /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 + prettier@3.9.6: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + pretty-format@29.7.0: dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} - engines: {node: '>=4'} + pretty-ms@9.3.1: dependencies: - regenerate: 1.4.2 + parse-ms: 4.0.0 - /regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + process-nextick-args@2.0.1: {} - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + process-warning@5.1.0: {} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + process@0.11.10: {} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + prool@0.2.16: dependencies: - '@babel/runtime': 7.24.5 + 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 - /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 + proxy-compare@2.6.0: {} - /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 + proxy-from-env@2.1.0: {} - /regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} - hasBin: true + psl@1.15.0: dependencies: - jsesc: 0.5.0 + punycode: 2.3.1 + optional: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + punycode@2.3.1: + optional: true - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true + qr@0.7.0: {} - /resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false + qrcode@1.5.3: + dependencies: + dijkstrajs: 1.0.3 + encode-utf8: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} + quansync@0.2.11: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + quansync@1.0.0: {} - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + query-string@7.1.3: dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - dev: true + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + querystringify@2.2.0: + optional: true - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 + queue-microtask@1.2.3: {} - /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 + quick-format-unescaped@4.0.4: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + radix3@1.1.2: {} - /rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + react-dom@18.3.1(react@18.3.1): dependencies: - glob: 7.2.3 + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 + react-is@16.13.1: {} - /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 - dependencies: - open: 8.4.2 - picomatch: 2.3.1 - source-map: 0.7.4 - yargs: 17.7.2 + react-is@18.3.1: {} - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true + react-refresh@0.17.0: {} - /rollup@4.17.2: - resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + react-remove-scroll-bar@2.3.8(@types/react@18.3.31)(react@18.3.1): dependencies: - '@types/estree': 1.0.5 + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.31)(react@18.3.1) + tslib: 2.7.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 + '@types/react': 18.3.31 - /rpc-websockets@7.11.0: - resolution: {integrity: sha512-IkLYjayPv6Io8C/TdCL5gwgzd1hFz2vmBZrjMw/SPEXo51ETOhnzgS4Qy5GWi2JQN7HKHa66J3+2mv0fgNh/7w==} + react-remove-scroll@2.7.2(@types/react@18.3.31)(react@18.3.1): dependencies: - eventemitter3: 4.0.7 - uuid: 8.3.2 - ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + 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.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: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - dev: false + '@types/react': 18.3.31 - /rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + react-style-singleton@2.2.3(@types/react@18.3.31)(react@18.3.1): dependencies: - queue-microtask: 1.2.3 + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.7.0 + optionalDependencies: + '@types/react': 18.3.31 - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + react-transition-state@1.1.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + react-use-measure@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - dev: true - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + react@18.3.1: + dependencies: + loose-envify: 1.4.0 - /saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + read-yaml-file@1.1.0: dependencies: - xmlchars: 2.2.0 - dev: true + graceful-fs: 4.2.11 + js-yaml: 3.15.2 + pify: 4.0.1 + strip-bom: 3.0.0 - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + readable-stream@2.3.8: dependencies: - loose-envify: 1.4.0 + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 - /scheduler@0.24.0-canary-efb381bbf-20230505: - resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} + readable-stream@3.6.2: dependencies: - loose-envify: 1.4.0 + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + readdirp@4.1.2: {} - /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 + readdirp@5.1.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 + real-require@0.2.0: {} + + require-directory@2.1.1: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + require-main-filename@2.0.0: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + requires-port@1.0.0: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true + resize-observer-polyfill@1.5.1: {} - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true + resolve-from@5.0.0: {} - /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 + resolve-pkg-maps@1.0.0: {} - /serialize-error@2.1.0: - resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} - engines: {node: '>=0.10.0'} + reusify@1.1.0: {} - /serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + rolldown-plugin-dts@0.28.8(rolldown@1.2.14)(typescript@5.9.3): dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.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: - - supports-color - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + - oxc-resolver - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + rolldown@1.2.14: 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 + '@oxc-project/types': 0.154.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@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.14 + rollup: 4.63.0 - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + rollup@4.63.0: dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - dev: true + '@types/estree': 1.0.9 + optionalDependencies: + '@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 - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + rrweb-cssom@0.7.1: + optional: true - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + rrweb-cssom@0.8.0: + optional: true + + run-parallel@1.2.0: dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 + queue-microtask: 1.2.3 - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: dependencies: - kind-of: 6.0.3 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false + safe-stable-stringify@2.5.0: {} - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + safer-buffer@2.1.2: {} + + saxes@6.0.0: dependencies: - shebang-regex: 1.0.0 - dev: true + xmlchars: 2.2.0 + optional: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + scheduler@0.23.2: dependencies: - shebang-regex: 3.0.0 + loose-envify: 1.4.0 - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true + scrypt-js@3.0.1: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + semver@6.3.1: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + semver@7.8.5: {} - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + set-blocking@2.0.0: {} + + set-function-length@1.2.2: dependencies: - call-bind: 1.0.7 + define-data-property: 1.1.4 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true + sha.js@2.4.12: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + to-buffer: 1.2.2 - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + shallowequal@1.1.0: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + shebang-regex@3.0.0: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + siginfo@2.0.0: {} - /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'} + 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 - 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@4.2.1: 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'} - - /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 + source-map-js@1.2.1: {} - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /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 - - /statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + cross-spawn: 7.0.6 + signal-exit: 4.1.0 - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + split-on-first@1.1.0: {} - /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 + split2@4.2.0: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + sprintf-js@1.0.3: {} - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - dependencies: - mixme: 0.5.10 - dev: true + stackback@0.0.2: {} - /strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} + std-env@3.10.0: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + strict-uri-encode@2.0.0: {} - /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-final-newline@4.0.0: {} - /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 - - /strnum@1.0.5: - resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + js-tokens: 9.0.1 - /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 - /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@18.3.1)(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@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 @@ -10572,825 +10660,398 @@ packages: 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: {} - /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@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'} - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@7.2.0: 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'} + symbol-tree@3.2.4: + optional: true - /temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} + tar@7.2.0: dependencies: - rimraf: 2.6.3 + '@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: - 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 + term-size@2.2.1: {} - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: - '@istanbuljs/schema': 0.1.3 + '@istanbuljs/schema': 0.1.6 glob: 7.2.3 - minimatch: 3.1.2 - dev: true + minimatch: 3.1.5 - /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==} + thread-stream@3.2.0: dependencies: - real-require: 0.1.0 - - /throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + real-require: 0.2.0 - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 + tiny-invariant@1.3.3: {} - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false + tinybench@2.9.0: {} - /tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - dev: false + tinyexec@1.3.1: {} - /tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - dev: true + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - /tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} - dev: true + tinypool@0.8.4: {} - /tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - dev: true + tinyspy@2.2.1: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + to-buffer@1.2.2: 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'} + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: 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'} + tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.15.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==} - - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true - - /tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - 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 - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - dev: true - - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.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 - dev: true - - /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'} - 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 + 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 + 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 - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + tslib@1.14.1: {} - /uint8arrays@3.1.0: - resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} - dependencies: - multiformats: 9.9.0 + tslib@2.7.0: {} - /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 - - /uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 - /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'} + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.1.0 + quansync: 1.0.0 - /unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + uncrypto@0.1.3: {} - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + undici-types@6.19.8: {} - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true + undici-types@7.29.1: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + undici-types@8.3.0: + optional: true - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unicorn-magic@0.3.0: {} - /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 - 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 + universalify@0.1.2: {} - /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 + universalify@0.2.0: + optional: true - /update-browserslist-db@1.0.16(browserslist@4.23.0): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + unstorage@1.17.5(idb-keyval@6.3.0): dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.1 - - /uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} + anymatch: 3.1.3 + 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 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + update-browserslist-db@1.3.3(browserslist@4.28.9): dependencies: - punycode: 2.3.1 - dev: true + browserslist: 4.28.9 + escalade: 3.2.0 + picocolors: 1.1.1 - /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 + 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 + 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 - - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.22 - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true + uuid@9.0.1: {} - /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==} - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: true + verkit@0.4.1: {} - /validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - dev: true + 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 + '@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 + optional: true - /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.57.7(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.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 + 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.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 + '@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.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 + 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.57.7(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.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 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 - 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) - 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) - 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 - dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.17.2 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /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 + - supports-color + - terser + + 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==} - 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: '*' - 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 - /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.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.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.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 - 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.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: - '@azure/app-configuration' - '@azure/cosmos' @@ -11399,370 +11060,166 @@ 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@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.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': 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 - 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.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: - - '@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' + - '@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/kv' - - bufferutil - - encoding + - '@walletconnect/ethereum-provider' + - accounts - immer - - ioredis - - react-dom - - react-native - - rollup - - supports-color - - uWebSockets.js - - 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@5.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 +11233,64 @@ 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.2.2: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yoctocolors@2.2.0: {} - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true + yuku-ast@0.19.0: dependencies: - lodash.get: 4.4.2 - lodash.isequal: 4.5.0 - validator: 13.12.0 - optionalDependencies: - commander: 9.5.0 - dev: true + '@yuku-toolchain/types': 0.19.0 + + yuku-codegen@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + yuku-core@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + optionalDependencies: + '@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 - /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 + yuku-parser@0.19.0: dependencies: - '@types/react': 18.3.11 + '@yuku-toolchain/types': 0.19.0 + yuku-core: 0.19.0 + + zod@3.22.4: {} + + 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/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 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..194bc11 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,20 +1,20 @@ { - "compilerOptions": { - "target": "ESNext", - "useDefineForClassFields": true, - "module": "ESNext", - "lib": ["ESNext", "DOM"], - "moduleResolution": "Node", - "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"] }