Repository: graphprotocol/graph-tooling
Pull request #1820 (2024-12-11 10:46:37)

chore(deps): update nick-fields/retry action to v3
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [nick-fields/retry](https://redirect.github.com/nick-fields/retry) | action | major | `v2` -> `v3` |

---

### Release Notes

<details>
<summary>nick-fields/retry (nick-fields/retry)</summary>

### [`v3`](https://redirect.github.com/nick-fields/retry/compare/v2...v3)

[Compare Source](https://redirect.github.com/nick-fields/retry/compare/v2...v3)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/graphprotocol/graph-tooling).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS41OC4xIiwidXBkYXRlZEluVmVyIjoiMzkuNTguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwZW5kZW5jaWVzIl19-->


cloudflare-workers-and-pages[bot]: ## Deploying graph-tooling with &nbsp;<a href="https://pages.dev"><img alt="Cloudflare Pages" src="https://user-images.githubusercontent.com/23264/106598434-9e719e00-654f-11eb-9e59-6167043cfa01.png" width="16"></a> &nbsp;Cloudflare Pages

<table><tr><td><strong>Latest commit:</strong> </td><td>
<code>3e535fc</code>
</td></tr>
<tr><td><strong>Status:</strong></td><td>⚡️&nbsp; Build in progress...</td></tr>
</table>

[View logs](https://dash.cloudflare.com/?to=/:account/pages/view/graph-tooling/01eb687a-cdc9-414c-80b9-4b0a68fee8b5)

changeset-bot[bot]: ###  ⚠️  No Changeset found

Latest commit: 3e535fc141104096207b3ddbdea419b065db9728

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.**

<details><summary>This PR includes no changesets</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/graphprotocol/graph-tooling/new/renovate/nick-fields-retry-3.x?filename=.changeset/friendly-snakes-hear.md&value=---%0A%0A---%0A%0Achore(deps)%3A%20update%20nick-fields%2Fretry%20action%20to%20v3%0A)


github-actions[bot]: <!-- changesetsSnapshotPrCommentKey -->
### 🚀 Snapshot Release (`alpha`)

The latest changes of this PR are available as `alpha` on npm (based on the declared `changesets`):
| Package | Version | Info |
|------|---------|----|
| `@graphprotocol/graph-cli` | `0.92.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728` | [npm ↗︎](https://www.npmjs.com/package/@graphprotocol/graph-cli/v/0.92.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728) [unpkg ↗︎](https://unpkg.com/browse/@graphprotocol/graph-cli@0.92.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728/) |
| `@graphprotocol/graph-ts` | `0.37.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728` | [npm ↗︎](https://www.npmjs.com/package/@graphprotocol/graph-ts/v/0.37.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728) [unpkg ↗︎](https://unpkg.com/browse/@graphprotocol/graph-ts@0.37.0-alpha-20241211104710-3e535fc141104096207b3ddbdea419b065db9728/) |

Patch:
diff --git a/.changeset/@graphprotocol_graph-cli-1829-dependencies.md b/.changeset/@graphprotocol_graph-cli-1829-dependencies.md
new file mode 100644
index 00000000..9ad443a3
--- /dev/null
+++ b/.changeset/@graphprotocol_graph-cli-1829-dependencies.md
@@ -0,0 +1,5 @@
+---
+"@graphprotocol/graph-cli": patch
+---
+dependencies updates:
+  - Updated dependency [`prettier@3.4.2` ↗︎](https://www.npmjs.com/package/prettier/v/3.4.2) (from `3.4.1`, in `dependencies`)
diff --git a/.changeset/short-keys-boil.md b/.changeset/short-keys-boil.md
new file mode 100644
index 00000000..f10fd68f
--- /dev/null
+++ b/.changeset/short-keys-boil.md
@@ -0,0 +1,5 @@
+---
+'@graphprotocol/graph-cli': patch
+---
+
+fix bug with clashing \_id field name in schema
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 19d4b483..49d7b33e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -53,7 +53,7 @@ jobs:
         run: pnpm build # will also check types
 
       - name: Run Tests
-        uses: nick-fields/retry@v2
+        uses: nick-fields/retry@v3
         with:
           timeout_minutes: 10
           max_attempts: 3
@@ -81,7 +81,7 @@ jobs:
         run: pnpm i
 
       - name: Run Tests
-        uses: nick-fields/retry@v2
+        uses: nick-fields/retry@v3
         with:
           timeout_minutes: 10
           max_attempts: 3
@@ -106,7 +106,7 @@ jobs:
         run: pnpm build # will also check types
 
       - name: Run Tests
-        uses: nick-fields/retry@v2
+        uses: nick-fields/retry@v3
         with:
           timeout_minutes: 10
           max_attempts: 3
diff --git a/package.json b/package.json
index b3fbf192..2dfa643a 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,6 @@
     "@theguild/prettier-config": "3.0.0",
     "@types/node": "^22.10.1",
     "eslint": "9.16.0",
-    "prettier": "3.4.1"
+    "prettier": "3.4.2"
   }
 }
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 61d6e739..2df71041 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -52,7 +52,7 @@
     "js-yaml": "4.1.0",
     "kubo-rpc-client": "^5.0.2",
     "open": "10.1.0",
-    "prettier": "3.4.1",
+    "prettier": "3.4.2",
     "semver": "7.6.3",
     "tmp-promise": "3.0.3",
     "web3-eth-abi": "4.4.1",
diff --git a/packages/cli/src/scaffold/mapping.ts b/packages/cli/src/scaffold/mapping.ts
index 56c50dce..60244a92 100644
--- a/packages/cli/src/scaffold/mapping.ts
+++ b/packages/cli/src/scaffold/mapping.ts
@@ -13,29 +13,23 @@ export const generateFieldAssignments = ({ index, input }: { index: number; inpu
         [input.name || `param${index}`],
       );
 
-type BlacklistDictionary = Record<string, string>;
-
 /**
  * Map of input names that are reserved so we do not use them as field names to avoid conflicts
+ * see https://github.com/graphprotocol/graph-tooling/issues/710
+ * name => mappedName
  */
-export const INPUT_NAMES_BLACKLIST = {
-  /** Related to https://github.com/graphprotocol/graph-tooling/issues/710 */
-  id: 'id',
+const NAMES_REMAP_DICTIONARY: Record<string, string> = {
+  id: 'internal_id',
+  _id: 'internal__id',
 } as const;
 
-export const renameInput = (name: string, subgraphName: string) => {
-  const inputMap: BlacklistDictionary = {
-    [INPUT_NAMES_BLACKLIST.id]: `${subgraphName}_id`,
-  };
-
-  return inputMap?.[name] ?? name;
+export const renameNameIfNeeded = (name: string) => {
+  return NAMES_REMAP_DICTIONARY[name] ?? name;
 };
 
-export const generateEventFieldAssignments = (event: any, contractName: string) =>
+export const generateEventFieldAssignments = (event: any, _contractName: string) =>
   event.inputs.reduce((acc: any[], input: any, index: number) => {
-    if (Object.values(INPUT_NAMES_BLACKLIST).includes(input.name)) {
-      input.mappedName = renameInput(input.name, contractName ?? 'contract');
-    }
+    input.mappedName = renameNameIfNeeded(input.name);
     return acc.concat(generateFieldAssignments({ input, index }));
   }, []);
 
diff --git a/packages/cli/src/scaffold/schema.ts b/packages/cli/src/scaffold/schema.ts
index 8f2d4c82..e3b00b9b 100644
--- a/packages/cli/src/scaffold/schema.ts
+++ b/packages/cli/src/scaffold/schema.ts
@@ -2,7 +2,7 @@ import immutable from 'immutable';
 import { ascTypeForProtocol, valueTypeForAsc } from '../codegen/types/index.js';
 import * as util from '../codegen/util.js';
 import Protocol from '../protocols/index.js';
-import { INPUT_NAMES_BLACKLIST, renameInput } from './mapping.js';
+import { renameNameIfNeeded } from './mapping.js';
 
 export function abiEvents(abi: { data: immutable.Collection<any, any> }) {
   return util.disambiguateNames({
@@ -73,9 +73,7 @@ export const generateEventType = (
         id: Bytes!
         ${event.inputs
           .reduce((acc: any[], input: any, index: number) => {
-            if (Object.values(INPUT_NAMES_BLACKLIST).includes(input.name)) {
-              input.name = renameInput(input.name, contractName ?? 'contract');
-            }
+            input.name = renameNameIfNeeded(input.name);
             return acc.concat(generateEventFields({ input, index, protocolName }));
           }, [])
           .join('\n')}
diff --git a/packages/cli/src/validation/schema.ts b/packages/cli/src/validation/schema.ts
index c057f97f..b62cf0bd 100644
--- a/packages/cli/src/validation/schema.ts
+++ b/packages/cli/src/validation/schema.ts
@@ -679,7 +679,7 @@ const validateFulltextArgumentIncludeFields = (def: any, directive: any, field:
         loc: directive.name.loc,
         entity: def.name.value,
         directive: fulltextDirectiveName(directive),
-        message: `@fulltext argument 'include > ${field.name.value}' must be be one of: entity, fields`,
+        message: `@fulltext argument 'include > ${field.name.value}' must be one of: entity, fields`,
       }),
     ]);
   }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 4dded82e..94a5ce1b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -22,7 +22,7 @@ importers:
         version: 0.13.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)
       '@theguild/prettier-config':
         specifier: 3.0.0
-        version: 3.0.0(prettier@3.4.1)
+        version: 3.0.0(prettier@3.4.2)
       '@types/node':
         specifier: ^22.10.1
         version: 22.10.1
@@ -30,8 +30,8 @@ importers:
         specifier: 9.16.0
         version: 9.16.0(jiti@2.4.1)
       prettier:
-        specifier: 3.4.1
-        version: 3.4.1
+        specifier: 3.4.2
+        version: 3.4.2
 
   examples/aggregations:
     dependencies:
@@ -295,8 +295,8 @@ importers:
         specifier: 10.1.0
         version: 10.1.0
       prettier:
-        specifier: 3.4.1
-        version: 3.4.1
+        specifier: 3.4.2
+        version: 3.4.2
       semver:
         specifier: 7.6.3
         version: 7.6.3
@@ -369,22 +369,22 @@ importers:
         version: 1.3.2(react@18.3.1)
       '@radix-ui/react-label':
         specifier: ^2.1.0
-        version: 2.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 2.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-select':
         specifier: ^2.1.2
-        version: 2.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 2.1.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-slot':
         specifier: ^1.1.0
-        version: 1.1.0(@types/react@18.3.14)(react@18.3.1)
+        version: 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-toast':
         specifier: ^1.2.2
-        version: 1.2.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        version: 1.2.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@tanstack/react-query':
         specifier: ^5.62.2
         version: 5.62.3(react@18.3.1)
       '@tanstack/react-router':
-        specifier: ^1.85.4
-        version: 1.87.1(@tanstack/router-generator@1.86.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+        specifier: ^1.87.12
+        version: 1.87.12(@tanstack/router-generator@1.87.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       base-x:
         specifier: ^5.0.0
         version: 5.0.0
@@ -396,7 +396,7 @@ importers:
         version: 2.1.1
       connectkit:
         specifier: ^1.8.2
-        version: 1.8.2(@babel/core@7.26.0)(@tanstack/react-query@5.62.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))
+        version: 1.8.2(@babel/core@7.26.0)(@tanstack/react-query@5.62.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8))
       file-type:
         specifier: ^19.6.0
         version: 19.6.0
@@ -432,13 +432,13 @@ importers:
         version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2)))
       viem:
         specifier: ^2.21.53
-        version: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+        version: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
       vite-plugin-node-polyfills:
         specifier: ^0.22.0
         version: 0.22.0(rollup@4.28.1)(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))
       wagmi:
         specifier: ^2.13.3
-        version: 2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+        version: 2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
       yaml:
         specifier: 2.6.1
         version: 2.6.1
@@ -450,11 +450,11 @@ importers:
         specifier: ^1.12.16
         version: 1.12.16(graphql@16.9.0)(typescript@5.7.2)
       '@tanstack/router-cli':
-        specifier: ^1.85.3
-        version: 1.86.0
+        specifier: 1.87.7
+        version: 1.87.7
       '@tanstack/router-vite-plugin':
-        specifier: ^1.85.3
-        version: 1.86.0(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))
+        specifier: 1.87.13
+        version: 1.87.13(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))
       '@types/node':
         specifier: ^22.10.1
         version: 22.10.1
@@ -483,7 +483,7 @@ importers:
         specifier: ^9.16.0
         version: 9.16.0(jiti@2.4.1)
       eslint-plugin-react-hooks:
-        specifier: ^5.0.0
+        specifier: ^5.1.0
         version: 5.1.0(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-react-refresh:
         specifier: ^0.4.16
@@ -2852,11 +2852,11 @@ packages:
   '@radix-ui/number@1.1.0':
     resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
 
-  '@radix-ui/primitive@1.1.0':
-    resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
+  '@radix-ui/primitive@1.1.1':
+    resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==}
 
-  '@radix-ui/react-arrow@1.1.0':
-    resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
+  '@radix-ui/react-arrow@1.1.1':
+    resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2868,8 +2868,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-collection@1.1.0':
-    resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==}
+  '@radix-ui/react-collection@1.1.1':
+    resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2881,17 +2881,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-compose-refs@1.1.0':
-    resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-
-  '@radix-ui/react-context@1.1.0':
-    resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
+  '@radix-ui/react-compose-refs@1.1.1':
+    resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==}
     peerDependencies:
       '@types/react': '*'
       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -2917,8 +2908,8 @@ packages:
       '@types/react':
         optional: true
 
-  '@radix-ui/react-dismissable-layer@1.1.1':
-    resolution: {integrity: sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==}
+  '@radix-ui/react-dismissable-layer@1.1.2':
+    resolution: {integrity: sha512-kEHnlhv7wUggvhuJPkyw4qspXLJOdYoAP4dO2c8ngGuXTq1w/HZp1YeVB+NQ2KbH1iEG+pvOCGYSqh9HZOz6hg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2939,8 +2930,8 @@ packages:
       '@types/react':
         optional: true
 
-  '@radix-ui/react-focus-scope@1.1.0':
-    resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
+  '@radix-ui/react-focus-scope@1.1.1':
+    resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2966,8 +2957,8 @@ packages:
       '@types/react':
         optional: true
 
-  '@radix-ui/react-label@2.1.0':
-    resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==}
+  '@radix-ui/react-label@2.1.1':
+    resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2979,8 +2970,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-popper@1.2.0':
-    resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
+  '@radix-ui/react-popper@1.2.1':
+    resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -2992,8 +2983,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-portal@1.1.2':
-    resolution: {integrity: sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==}
+  '@radix-ui/react-portal@1.1.3':
+    resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3005,8 +2996,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-presence@1.1.1':
-    resolution: {integrity: sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==}
+  '@radix-ui/react-presence@1.1.2':
+    resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3018,8 +3009,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-primitive@2.0.0':
-    resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
+  '@radix-ui/react-primitive@2.0.1':
+    resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3031,8 +3022,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-select@2.1.2':
-    resolution: {integrity: sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==}
+  '@radix-ui/react-select@2.1.3':
+    resolution: {integrity: sha512-tlLwaewTfrKetiex8iW9wwME/qrYlzlH0qcgYmos7xS54MO00SiPHasLoAykg/yVrjf41GQptPPi4oXzrP+sgg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3044,8 +3035,8 @@ packages:
       '@types/react-dom':
         optional: true
 
-  '@radix-ui/react-slot@1.1.0':
-    resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
+  '@radix-ui/react-slot@1.1.1':
+    resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==}
     peerDependencies:
       '@types/react': '*'
       react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -3053,8 +3044,8 @@ packages:
       '@types/react':
         optional: true
 
-  '@radix-ui/react-toast@1.2.2':
-    resolution: {integrity: sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==}
+  '@radix-ui/react-toast@1.2.3':
+    resolution: {integrity: sha512-oB8irs7CGAml6zWbum7MNySTH/sR7PM1ZQyLV8reO946u73sU83yZUKijrMLNbm4hTOrJY4tE8Oa/XUKrOr2Wg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3129,8 +3120,8 @@ packages:
       '@types/react':
         optional: true
 
-  '@radix-ui/react-visually-hidden@1.1.0':
-    resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==}
+  '@radix-ui/react-visually-hidden@1.1.1':
+    resolution: {integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==}
     peerDependencies:
       '@types/react': '*'
       '@types/react-dom': '*'
@@ -3606,8 +3597,8 @@ packages:
     resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
     engines: {node: '>=14.16'}
 
-  '@tanstack/history@1.85.3':
-    resolution: {integrity: sha512-62z1qXIILvjdkQyMTVPFQedHOc6kQgunz9GHV9jSy2z1ixsDqyI9GxNj3AWx8Ucmhjwd5/P+v3XN10bsb+FzRA==}
+  '@tanstack/history@1.87.6':
+    resolution: {integrity: sha512-5OPHcc20Ye5XR+RBkFk+64TtRJ83clrpaOcC/S8t4N0k+/xPDJpkPEPnoENb3sQeRI28y1dJaUuvXt/dv/ylaQ==}
     engines: {node: '>=12'}
 
   '@tanstack/query-core@5.62.3':
@@ -3618,11 +3609,11 @@ packages:
     peerDependencies:
       react: ^18 || ^19
 
-  '@tanstack/react-router@1.87.1':
-    resolution: {integrity: sha512-LqpP235wfHJQl1LmjfoII4xll29IOjmFFp1i3G/k1zIffjdmsEshmsAJozPxgsJEe6M8r34mlG7IBvfmYmXK6w==}
+  '@tanstack/react-router@1.87.12':
+    resolution: {integrity: sha512-zrzAELXkZVia66zXKO8LOXt7TZKQPCoRBu7RMYJnhH276/h4+5iUQOGcY9Qo+Ea+4Q1+ENcCd3NSwZIYf8TCAA==}
     engines: {node: '>=12'}
     peerDependencies:
-      '@tanstack/router-generator': ^1.86.0
+      '@tanstack/router-generator': ^1.87.7
       react: '>=18'
       react-dom: '>=18'
     peerDependenciesMeta:
@@ -3635,17 +3626,17 @@ packages:
       react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
       react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
 
-  '@tanstack/router-cli@1.86.0':
-    resolution: {integrity: sha512-aA3RGiXnpk1zJ67pKKZ2bIDLpmj+xVOOCxCLGRwtniUoYv+8UU3ifjlbZ6VYo0dqHOVw5aAOe4gmlmDmu5O2YQ==}
+  '@tanstack/router-cli@1.87.7':
+    resolution: {integrity: sha512-xpN/BJC0LKv2mwBiQs5E3YLjllnugXtZTGXleQ0skzIsFzCnR38EZLDmVK8baXRJcHb+cINT3cw71OdrOr/6Zw==}
     engines: {node: '>=12'}
     hasBin: true
 
-  '@tanstack/router-generator@1.86.0':
-    resolution: {integrity: sha512-6UrQmysjRNZZp1KnAR4aghqrHJKz+5TwGpq8w+kjVWj7ac6OLekqaWbF+LvfwRs03rLiRNxI9VYHmrSkCvIF+A==}
+  '@tanstack/router-generator@1.87.7':
+    resolution: {integrity: sha512-w9Px1C6DM0YNVXvu1VjUuZ5el0ykOeofEmEZBW83VUTzvCXFpcjPCHncU9FO9uXup8NFIxNfGz+xpwf93GoFnQ==}
     engines: {node: '>=12'}
 
-  '@tanstack/router-plugin@1.86.0':
-    resolution: {integrity: sha512-cKBgHBva1amOV+86AKP3DwIT9DYH9keF7GDjqhEMzLHgsTAtJ8IqEQk87xnGw9z55acQJGaVGkP6xuRCACy9eQ==}
+  '@tanstack/router-plugin@1.87.13':
+    resolution: {integrity: sha512-h5dD0m5ixSsmIMOrNXd4NBH2Fwx+4Mb5GK0JCUVlcegjtNQ9Zx9kdWqWXi+4P595XKCmjdHVOP4vhBr9cfwozg==}
     engines: {node: '>=12'}
     peerDependencies:
       '@rsbuild/core': '>=1.0.2'
@@ -3659,15 +3650,15 @@ packages:
       webpack:
         optional: true
 
-  '@tanstack/router-vite-plugin@1.86.0':
-    resolution: {integrity: sha512-+3YjIIjy5RMppOPtBQqxQ28Ut684wNksGCaY9v/EmwWcADWqlR+WrRlO72qAN1JAb0vONChDqK56Db+d7h9VHA==}
+  '@tanstack/router-vite-plugin@1.87.13':
+    resolution: {integrity: sha512-CwNoMVZa/UA9YMpj2CtNRKU0x/77KsazjJJQHOK0Qq38BvgTxNi5bp8oAgCO512YO2tOclLEKOEEPI/rqNHK8g==}
     engines: {node: '>=12'}
 
   '@tanstack/store@0.6.0':
     resolution: {integrity: sha512-+m2OBglsjXcLmmKOX6/9v8BDOCtyxhMmZLsRUDswOOSdIIR9mvv6i0XNKsmTh3AlYU8c1mRcodC8/Vyf+69VlQ==}
 
-  '@tanstack/virtual-file-routes@1.81.9':
-    resolution: {integrity: sha512-jV5mWJrsh3QXHpb/by6udSqwva0qK50uYHpIXvKsLaxnlbjbLfflfPjFyRWXbMtZsnzCjSUqp5pm5/p+Wpaerg==}
+  '@tanstack/virtual-file-routes@1.87.6':
+    resolution: {integrity: sha512-PTpeM8SHL7AJM0pJOacFvHribbUODS51qe9NsMqku4mogh6BWObY1EeVmeGnp9o3VngAEsf+rJMs2zqIVz3WFA==}
     engines: {node: '>=12'}
 
   '@theguild/eslint-config@0.13.1':
@@ -8180,6 +8171,9 @@ packages:
   preact@10.25.1:
     resolution: {integrity: sha512-frxeZV2vhQSohQwJ7FvlqC40ze89+8friponWUFeVEkaCfhC6Eu4V0iND5C9CXz8JLndV07QRDeXzH1+Anz5Og==}
 
+  preact@10.25.2:
+    resolution: {integrity: sha512-GEts1EH3oMnqdOIeXhlbBSddZ9nrINd070WBOiPO2ous1orrKGUM4SMDbwyjSWD1iMS2dBvaDjAa5qUhz3TXqw==}
+
   prelude-ls@1.1.2:
     resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
     engines: {node: '>= 0.8.0'}
@@ -8210,8 +8204,8 @@ packages:
     engines: {node: '>=14'}
     hasBin: true
 
-  prettier@3.4.1:
-    resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==}
+  prettier@3.4.2:
+    resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
     engines: {node: '>=14'}
     hasBin: true
 
@@ -9674,8 +9668,8 @@ packages:
   vfile@6.0.3:
     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
 
-  viem@2.21.54:
-    resolution: {integrity: sha512-G9mmtbua3UtnVY9BqAtWdNp+3AO+oWhD0B9KaEsZb6gcrOWgmA4rz02yqEMg+qW9m6KgKGie7q3zcHqJIw6AqA==}
+  viem@2.21.55:
+    resolution: {integrity: sha512-PgXew7C11cAuEtOSgRyQx2kJxEOPUwIwZA9dMglRByqJuFVA7wSGZZOOo/93iylAA8E15bEdqy9xulU3oKZ70Q==}
     peerDependencies:
       typescript: '>=5.0.4'
     peerDependenciesMeta:
@@ -11712,7 +11706,7 @@ snapshots:
       eth-json-rpc-filters: 6.0.1
       eventemitter3: 5.0.1
       keccak: 3.0.4
-      preact: 10.25.1
+      preact: 10.25.2
       sha.js: 2.4.11
     transitivePeerDependencies:
       - supports-color
@@ -12407,13 +12401,13 @@ snapshots:
 
   '@humanwhocodes/retry@0.4.1': {}
 
-  '@ianvs/prettier-plugin-sort-imports@4.4.0(prettier@3.4.1)':
+  '@ianvs/prettier-plugin-sort-imports@4.4.0(prettier@3.4.2)':
     dependencies:
       '@babel/generator': 7.26.3
       '@babel/parser': 7.26.3
       '@babel/traverse': 7.26.4(supports-color@5.5.0)
       '@babel/types': 7.26.3
-      prettier: 3.4.1
+      prettier: 3.4.2
       semver: 7.6.3
     transitivePeerDependencies:
       - supports-color
@@ -12815,7 +12809,7 @@ snapshots:
     dependencies:
       '@ethereumjs/tx': 4.2.0
       '@types/debug': 4.1.12
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       semver: 7.6.3
       superstruct: 1.0.4
     transitivePeerDependencies:
@@ -13050,7 +13044,7 @@ snapshots:
 
   '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.17(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))(typescript@5.7.2)(utf-8-validate@5.0.10))':
     dependencies:
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)
       hardhat: 2.22.17(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))(typescript@5.7.2)(utf-8-validate@5.0.10)
       lodash.isequal: 4.5.0
@@ -13071,7 +13065,7 @@ snapshots:
       '@nomicfoundation/ignition-core': 0.15.8(bufferutil@4.0.8)(utf-8-validate@5.0.10)
       '@nomicfoundation/ignition-ui': 0.15.8
       chalk: 4.1.2
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       fs-extra: 10.1.0
       hardhat: 2.22.17(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))(typescript@5.7.2)(utf-8-validate@5.0.10)
       json5: 2.2.3
@@ -13133,7 +13127,7 @@ snapshots:
       '@ethersproject/abi': 5.7.0
       '@ethersproject/address': 5.7.0
       cbor: 8.1.0
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       hardhat: 2.22.17(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.10.1)(typescript@5.7.2))(typescript@5.7.2)(utf-8-validate@5.0.10)
       lodash.clonedeep: 4.5.0
       picocolors: 1.1.1
@@ -13148,7 +13142,7 @@ snapshots:
       '@ethersproject/address': 5.6.1
       '@nomicfoundation/solidity-analyzer': 0.1.2
       cbor: 9.0.2
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)
       fs-extra: 10.1.0
       immer: 10.0.2
@@ -13523,36 +13517,30 @@ snapshots:
 
   '@radix-ui/number@1.1.0': {}
 
-  '@radix-ui/primitive@1.1.0': {}
+  '@radix-ui/primitive@1.1.1': {}
 
-  '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-collection@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-context': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-slot': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-context': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-slot': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.14)(react@18.3.1)':
-    dependencies:
-      react: 18.3.1
-    optionalDependencies:
-      '@types/react': 18.3.14
-
-  '@radix-ui/react-context@1.1.0(@types/react@18.3.14)(react@18.3.1)':
+  '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.14)(react@18.3.1)':
     dependencies:
       react: 18.3.1
     optionalDependencies:
@@ -13570,11 +13558,11 @@ snapshots:
     optionalDependencies:
       '@types/react': 18.3.14
 
-  '@radix-ui/react-dismissable-layer@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-dismissable-layer@1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/primitive': 1.1.0
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/primitive': 1.1.1
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
@@ -13589,10 +13577,10 @@ snapshots:
     optionalDependencies:
       '@types/react': 18.3.14
 
-  '@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -13611,22 +13599,22 @@ snapshots:
     optionalDependencies:
       '@types/react': 18.3.14
 
-  '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-label@2.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-context': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-context': 1.1.1(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
@@ -13638,9 +13626,9 @@ snapshots:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-portal@1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -13648,9 +13636,9 @@ snapshots:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-presence@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -13658,36 +13646,36 @@ snapshots:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-slot': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-slot': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-select@2.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-select@2.1.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
       '@radix-ui/number': 1.1.0
-      '@radix-ui/primitive': 1.1.0
-      '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/primitive': 1.1.1
+      '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-context': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-direction': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-dismissable-layer': 1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-id': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-slot': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-slot': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       aria-hidden: 1.2.4
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
@@ -13696,27 +13684,27 @@ snapshots:
       '@types/react': 18.3.14
       '@types/react-dom': 18.3.2
 
-  '@radix-ui/react-slot@1.1.0(@types/react@18.3.14)(react@18.3.1)':
+  '@radix-ui/react-slot@1.1.1(@types/react@18.3.14)(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       react: 18.3.1
     optionalDependencies:
       '@types/react': 18.3.14
 
-  '@radix-ui/react-toast@1.2.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-toast@1.2.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/primitive': 1.1.0
-      '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.14)(react@18.3.1)
+      '@radix-ui/primitive': 1.1.1
+      '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-context': 1.1.1(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-dismissable-layer': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-portal': 1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-presence': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-dismissable-layer': 1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.14)(react@18.3.1)
       '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.14)(react@18.3.1)
-      '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
@@ -13769,9 +13757,9 @@ snapshots:
     optionalDependencies:
       '@types/react': 18.3.14
 
-  '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+      '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.2)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       react: 18.3.1
       react-dom: 18.3.1(react@18.3.1)
     optionalDependencies:
@@ -13872,7 +13860,7 @@ snapshots:
   '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)':
     dependencies:
       '@safe-global/safe-gateway-typescript-sdk': 3.22.4
-      viem: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+      viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
     transitivePeerDependencies:
       - bufferutil
       - typescript
@@ -14394,7 +14382,7 @@ snapshots:
     dependencies:
       defer-to-connect: 2.0.1
 
-  '@tanstack/history@1.85.3': {}
+  '@tanstack/history@1.87.6': {}
 
   '@tanstack/query-core@5.62.3': {}
 
@@ -14403,9 +14391,9 @@ snapshots:
       '@tanstack/query-core': 5.62.3
       react: 18.3.1
 
-  '@tanstack/react-router@1.87.1(@tanstack/router-generator@1.86.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+  '@tanstack/react-router@1.87.12(@tanstack/router-generator@1.87.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
-      '@tanstack/history': 1.85.3
+      '@tanstack/history': 1.87.6
       '@tanstack/react-store': 0.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
       jsesc: 3.0.2
       react: 18.3.1
@@ -14413,7 +14401,7 @@ snapshots:
       tiny-invariant: 1.3.3
       tiny-warning: 1.0.3
     optionalDependencies:
-      '@tanstack/router-generator': 1.86.0
+      '@tanstack/router-generator': 1.87.7
 
   '@tanstack/react-store@0.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
     dependencies:
@@ -14422,20 +14410,20 @@ snapshots:
       react-dom: 18.3.1(react@18.3.1)
       use-sync-external-store: 1.4.0(react@18.3.1)
 
-  '@tanstack/router-cli@1.86.0':
+  '@tanstack/router-cli@1.87.7':
     dependencies:
-      '@tanstack/router-generator': 1.86.0
+      '@tanstack/router-generator': 1.87.7
       chokidar: 3.6.0
       yargs: 17.7.2
 
-  '@tanstack/router-generator@1.86.0':
+  '@tanstack/router-generator@1.87.7':
     dependencies:
-      '@tanstack/virtual-file-routes': 1.81.9
-      prettier: 3.4.1
+      '@tanstack/virtual-file-routes': 1.87.6
+      prettier: 3.4.2
       tsx: 4.19.2
       zod: 3.23.8
 
-  '@tanstack/router-plugin@1.86.0(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))':
+  '@tanstack/router-plugin@1.87.13(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))':
     dependencies:
       '@babel/core': 7.26.0
       '@babel/generator': 7.26.3
@@ -14445,8 +14433,8 @@ snapshots:
       '@babel/template': 7.25.9
       '@babel/traverse': 7.26.4(supports-color@5.5.0)
       '@babel/types': 7.26.3
-      '@tanstack/router-generator': 1.86.0
-      '@tanstack/virtual-file-routes': 1.81.9
+      '@tanstack/router-generator': 1.87.7
+      '@tanstack/virtual-file-routes': 1.87.6
       '@types/babel__core': 7.20.5
       '@types/babel__generator': 7.6.8
       '@types/babel__template': 7.4.4
@@ -14460,9 +14448,9 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@tanstack/router-vite-plugin@1.86.0(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))':
+  '@tanstack/router-vite-plugin@1.87.13(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))':
     dependencies:
-      '@tanstack/router-plugin': 1.86.0(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))
+      '@tanstack/router-plugin': 1.87.13(vite@6.0.3(@types/node@22.10.1)(jiti@2.4.1)(tsx@4.19.2)(yaml@2.6.1))
     transitivePeerDependencies:
       - '@rsbuild/core'
       - supports-color
@@ -14471,7 +14459,7 @@ snapshots:
 
   '@tanstack/store@0.6.0': {}
 
-  '@tanstack/virtual-file-routes@1.81.9': {}
+  '@tanstack/virtual-file-routes@1.87.6': {}
 
   '@theguild/eslint-config@0.13.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)':
     dependencies:
@@ -14480,7 +14468,7 @@ snapshots:
       '@typescript-eslint/parser': 8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)
       eslint: 9.16.0(jiti@2.4.1)
       eslint-config-prettier: 9.1.0(eslint@9.16.0(jiti@2.4.1))
-      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1))
+      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-jsonc: 2.18.2(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-jsx-a11y: 6.10.2(eslint@9.16.0(jiti@2.4.1))
@@ -14489,7 +14477,7 @@ snapshots:
       eslint-plugin-promise: 7.1.0(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-react: 7.37.2(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-react-hooks: 5.0.0(eslint@9.16.0(jiti@2.4.1))
-      eslint-plugin-sonarjs: 2.0.4(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
+      eslint-plugin-sonarjs: 2.0.4(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-unicorn: 56.0.1(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-yml: 1.15.0(eslint@9.16.0(jiti@2.4.1))
       typescript: 5.6.2
@@ -14501,12 +14489,12 @@ snapshots:
       - eslint-plugin-import-x
       - supports-color
 
-  '@theguild/prettier-config@3.0.0(prettier@3.4.1)':
+  '@theguild/prettier-config@3.0.0(prettier@3.4.2)':
     dependencies:
-      '@ianvs/prettier-plugin-sort-imports': 4.4.0(prettier@3.4.1)
-      prettier: 3.4.1
-      prettier-plugin-pkg: 0.18.1(prettier@3.4.1)
-      prettier-plugin-sh: 0.14.0(prettier@3.4.1)
+      '@ianvs/prettier-plugin-sort-imports': 4.4.0(prettier@3.4.2)
+      prettier: 3.4.2
+      prettier-plugin-pkg: 0.18.1(prettier@3.4.2)
+      prettier-plugin-sh: 0.14.0(prettier@3.4.2)
     transitivePeerDependencies:
       - '@vue/compiler-sfc'
       - supports-color
@@ -14723,7 +14711,7 @@ snapshots:
 
   '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)':
     dependencies:
-      '@eslint-community/regexpp': 4.11.1
+      '@eslint-community/regexpp': 4.12.1
       '@typescript-eslint/parser': 8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)
       '@typescript-eslint/scope-manager': 7.16.1
       '@typescript-eslint/type-utils': 7.16.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)
@@ -14999,16 +14987,16 @@ snapshots:
       loupe: 3.1.2
       tinyrainbow: 1.2.0
 
-  '@wagmi/connectors@5.5.3(@types/react@18.3.14)(@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)':
+  '@wagmi/connectors@5.5.3(@types/react@18.3.14)(@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)':
     dependencies:
       '@coinbase/wallet-sdk': 4.2.3
       '@metamask/sdk': 0.31.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)
       '@safe-global/safe-apps-provider': 0.18.4(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
       '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
-      '@wagmi/core': 2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
+      '@wagmi/core': 2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
       '@walletconnect/ethereum-provider': 2.17.0(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(utf-8-validate@5.0.10)
       cbw-sdk: '@coinbase/wallet-sdk@3.9.3'
-      viem: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+      viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
     optionalDependencies:
       typescript: 5.7.2
     transitivePeerDependencies:
@@ -15033,11 +15021,11 @@ snapshots:
       - utf-8-validate
       - zod
 
-  '@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))':
+  '@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))':
     dependencies:
       eventemitter3: 5.0.1
       mipd: 0.0.7(typescript@5.7.2)
-      viem: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+      viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
       zustand: 5.0.0(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1))
     optionalDependencies:
       '@tanstack/query-core': 5.62.3
@@ -16445,7 +16433,7 @@ snapshots:
       ini: 1.3.8
       proto-list: 1.2.4
 
-  connectkit@1.8.2(@babel/core@7.26.0)(@tanstack/react-query@5.62.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)):
+  connectkit@1.8.2(@babel/core@7.26.0)(@tanstack/react-query@5.62.3(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)):
     dependencies:
       '@tanstack/react-query': 5.62.3(react@18.3.1)
       buffer: 6.0.3
@@ -16458,8 +16446,8 @@ snapshots:
       react-use-measure: 2.1.1(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.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)
-      viem: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
-      wagmi: 2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+      viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+      wagmi: 2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
     transitivePeerDependencies:
       - '@babel/core'
       - react-is
@@ -17187,13 +17175,13 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1)):
+  eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)):
     dependencies:
       '@nolyfill/is-core-module': 1.0.39
       debug: 4.3.7(supports-color@5.5.0)
       enhanced-resolve: 5.17.1
       eslint: 9.16.0(jiti@2.4.1)
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       fast-glob: 3.3.2
       get-tsconfig: 4.8.1
       is-bun-module: 1.3.0
@@ -17233,14 +17221,14 @@ snapshots:
       - bluebird
       - supports-color
 
-  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1)):
+  eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)):
     dependencies:
       debug: 3.2.7
     optionalDependencies:
       '@typescript-eslint/parser': 8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)
       eslint: 9.16.0(jiti@2.4.1)
       eslint-import-resolver-node: 0.3.9
-      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.1))
+      eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
     transitivePeerDependencies:
       - supports-color
 
@@ -17251,7 +17239,7 @@ snapshots:
       eslint: 9.16.0(jiti@2.4.1)
       eslint-compat-utils: 0.5.1(eslint@9.16.0(jiti@2.4.1))
 
-  eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1)):
+  eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)):
     dependencies:
       '@rtsao/scc': 1.1.0
       array-includes: 3.1.8
@@ -17262,7 +17250,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.16.0(jiti@2.4.1)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       hasown: 2.0.2
       is-core-module: 2.15.1
       is-glob: 4.0.3
@@ -17290,7 +17278,7 @@ snapshots:
       doctrine: 2.1.0
       eslint: 9.16.0(jiti@2.4.1)
       eslint-import-resolver-node: 0.3.9
-      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
+      eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       hasown: 2.0.2
       is-core-module: 2.15.1
       is-glob: 4.0.3
@@ -17459,7 +17447,7 @@ snapshots:
       string.prototype.matchall: 4.0.11
       string.prototype.repeat: 1.0.0
 
-  eslint-plugin-sonarjs@2.0.4(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1)):
+  eslint-plugin-sonarjs@2.0.4(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)):
     dependencies:
       '@babel/core': 7.25.2
       '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@9.16.0(jiti@2.4.1))
@@ -17473,7 +17461,7 @@ snapshots:
       builtin-modules: 3.3.0
       bytes: 3.1.2
       eslint: 9.16.0(jiti@2.4.1)
-      eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@9.16.0(jiti@2.4.1))
+      eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.15.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-jsx-a11y: 6.10.0(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-react: 7.36.1(eslint@9.16.0(jiti@2.4.1))
       eslint-plugin-react-hooks: 4.6.2(eslint@9.16.0(jiti@2.4.1))
@@ -20506,25 +20494,27 @@ snapshots:
 
   preact@10.25.1: {}
 
+  preact@10.25.2: {}
+
   prelude-ls@1.1.2: {}
 
   prelude-ls@1.2.1: {}
 
-  prettier-plugin-pkg@0.18.1(prettier@3.4.1):
+  prettier-plugin-pkg@0.18.1(prettier@3.4.2):
     dependencies:
-      prettier: 3.4.1
+      prettier: 3.4.2
 
-  prettier-plugin-sh@0.14.0(prettier@3.4.1):
+  prettier-plugin-sh@0.14.0(prettier@3.4.2):
     dependencies:
       mvdan-sh: 0.10.1
-      prettier: 3.4.1
+      prettier: 3.4.2
       sh-syntax: 0.4.2
 
   prettier@2.8.8: {}
 
   prettier@3.0.3: {}
 
-  prettier@3.4.1: {}
+  prettier@3.4.2: {}
 
   private@0.1.8: {}
 
@@ -21071,7 +21061,7 @@ snapshots:
 
   scslre@0.3.0:
     dependencies:
-      '@eslint-community/regexpp': 4.11.1
+      '@eslint-community/regexpp': 4.12.1
       refa: 0.12.1
       regexp-ast-analysis: 0.7.1
 
@@ -21834,7 +21824,7 @@ snapshots:
   typechain@8.3.2(typescript@5.7.2):
     dependencies:
       '@types/prettier': 2.7.3
-      debug: 4.3.7(supports-color@5.5.0)
+      debug: 4.4.0
       fs-extra: 7.0.1
       glob: 7.1.7
       js-sha3: 0.8.0
@@ -22185,7 +22175,7 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8):
+  viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8):
     dependencies:
       '@noble/curves': 1.7.0
       '@noble/hashes': 1.6.1
@@ -22302,14 +22292,14 @@ snapshots:
 
   wabt@1.0.24: {}
 
-  wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8):
+  wagmi@2.13.5(@tanstack/query-core@5.62.3)(@tanstack/react-query@5.62.3(react@18.3.1))(@types/react@18.3.14)(bufferutil@4.0.8)(encoding@0.1.13)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8):
     dependencies:
       '@tanstack/react-query': 5.62.3(react@18.3.1)
-      '@wagmi/connectors': 5.5.3(@types/react@18.3.14)(@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
-      '@wagmi/core': 2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
+      '@wagmi/connectors': 5.5.3(@types/react@18.3.14)(@wagmi/core@2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)))(bufferutil@4.0.8)(encoding@0.1.13)(react@18.3.1)(typescript@5.7.2)(utf-8-validate@5.0.10)(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)
+      '@wagmi/core': 2.15.2(@tanstack/query-core@5.62.3)(@types/react@18.3.14)(immer@10.0.2)(react@18.3.1)(typescript@5.7.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8))
       react: 18.3.1
       use-sync-external-store: 1.2.0(react@18.3.1)
-      viem: 2.21.54(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
+      viem: 2.21.55(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10)(zod@3.23.8)
     optionalDependencies:
       typescript: 5.7.2
     transitivePeerDependencies:
diff --git a/renovate.json b/renovate.json
index 0ef5388d..f09e4b4e 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,3 +1,14 @@
 {
-  "extends": ["github>the-guild-org/shared-config:renovate"]
+  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+  "extends": ["config:recommended"],
+  "prConcurrentLimit": 25,
+  "reviewers": ["YaroShkvorets", "0237h"],
+  "automerge": false,
+  "lockFileMaintenance": {
+    "enabled": true,
+    "automerge": true
+  },
+  "recreateWhen": "never",
+  "labels": ["dependencies"],
+  "rebaseWhen": "conflicted"
 }
diff --git a/website/package.json b/website/package.json
index 647c81ab..f6062afb 100644
--- a/website/package.json
+++ b/website/package.json
@@ -21,7 +21,7 @@
     "@radix-ui/react-slot": "^1.1.0",
     "@radix-ui/react-toast": "^1.2.2",
     "@tanstack/react-query": "^5.62.2",
-    "@tanstack/react-router": "^1.85.4",
+    "@tanstack/react-router": "^1.87.12",
     "base-x": "^5.0.0",
     "class-variance-authority": "^0.7.1",
     "clsx": "^2.1.1",
@@ -45,8 +45,8 @@
   },
   "devDependencies": {
     "@0no-co/graphqlsp": "^1.12.16",
-    "@tanstack/router-cli": "^1.85.3",
-    "@tanstack/router-vite-plugin": "^1.85.3",
+    "@tanstack/router-cli": "1.87.7",
+    "@tanstack/router-vite-plugin": "1.87.13",
     "@types/node": "^22.10.1",
     "@types/react": "^18.3.12",
     "@types/react-dom": "^18.3.1",
@@ -56,7 +56,7 @@
     "@vitejs/plugin-react": "^4.3.4",
     "autoprefixer": "^10.4.20",
     "eslint": "^9.16.0",
-    "eslint-plugin-react-hooks": "^5.0.0",
+    "eslint-plugin-react-hooks": "^5.1.0",
     "eslint-plugin-react-refresh": "^0.4.16",
     "postcss": "^8.4.49",
     "rimraf": "^6.0.1",


Test patch:
diff --git a/packages/cli/src/command-helpers/contracts.test.ts b/packages/cli/src/command-helpers/contracts.test.ts
index f2fced55..c650a181 100644
--- a/packages/cli/src/command-helpers/contracts.test.ts
+++ b/packages/cli/src/command-helpers/contracts.test.ts
@@ -22,18 +22,19 @@ const TEST_CONTRACT_START_BLOCKS = {
   moonbeam: {
     '0x011E52E4E40CF9498c79273329E8827b21E2e581': 505_060,
   },
-  moonriver: {
-    '0x3dB01570D97631f69bbb0ba39796865456Cf89A5': 800_950,
-  },
   optimism: {
     '0xc35DADB65012eC5796536bD9864eD8773aBc74C4': 7_019_815,
   },
-  celo: {
-    '0x8084936982D089130e001b470eDf58faCA445008': 10_186_627,
-  },
   gnosis: {
     '0xdDCbf776dF3dE60163066A5ddDF2277cB445E0F3': 16_655_565,
   },
+  // not stable RPCs
+  // moonriver: {
+  //   '0x3dB01570D97631f69bbb0ba39796865456Cf89A5': 800_950,
+  // },
+  // celo: {
+  //   '0x8084936982D089130e001b470eDf58faCA445008': 10_186_627,
+  // },
 
   // Skipping these networks for now because they do not support the latest etherscan contracts API or is blockScout based
 
diff --git a/packages/cli/src/protocols/ethereum/codegen/__snapshots__/abi.test.ts.snap b/packages/cli/src/protocols/ethereum/codegen/__snapshots__/abi.test.ts.snap
new file mode 100644
index 00000000..7da206be
--- /dev/null
+++ b/packages/cli/src/protocols/ethereum/codegen/__snapshots__/abi.test.ts.snap
@@ -0,0 +1,961 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`ABI code generation > Generated types > Type generated 1`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toI32()
+            ",
+      "name": "get result",
+      "params": [],
+      "returnType": "i32",
+    },
+    Method {
+      "body": "
+            return this[1].toAddress()
+            ",
+      "name": "get target",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[2].toBytes()
+            ",
+      "name": "get data",
+      "params": [],
+      "returnType": "Bytes",
+    },
+    Method {
+      "body": "
+            return this[3].toAddress()
+            ",
+      "name": "get proposer",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[4].toAddress()
+            ",
+      "name": "get feeRecipient",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[5].toBigInt()
+            ",
+      "name": "get fee",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[6].toBigInt()
+            ",
+      "name": "get startTime",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[7].toBigInt()
+            ",
+      "name": "get yesCount",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[8].toBigInt()
+            ",
+      "name": "get noCount",
+      "params": [],
+      "returnType": "BigInt",
+    },
+  ],
+  "name": "Contract__getProposalResultValue0Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type generated 2`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toI32()
+            ",
+      "name": "get foo",
+      "params": [],
+      "returnType": "i32",
+    },
+    Method {
+      "body": "
+      return changetype<Contract__getProposalInputParam1BarStruct>(this[1].toTuple())
+      ",
+      "name": "get bar",
+      "params": [],
+      "returnType": "Contract__getProposalInputParam1BarStruct",
+    },
+  ],
+  "name": "Contract__getProposalInputParam1Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type generated 3`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toAddress()
+            ",
+      "name": "get baz",
+      "params": [],
+      "returnType": "Address",
+    },
+  ],
+  "name": "Contract__getProposalInputParam1BarStruct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type generated 4`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toBigInt()
+            ",
+      "name": "get first",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[1].toString()
+            ",
+      "name": "get second",
+      "params": [],
+      "returnType": "string",
+    },
+  ],
+  "name": "Contract__getProposalsResultValue1Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type generated 5`] = `
+Class {
+  "export": true,
+  "extends": undefined,
+  "members": [
+    ClassMember {
+      "name": "value0",
+      "type": "BigInt",
+    },
+    ClassMember {
+      "name": "value1",
+      "type": "Array<Contract__getProposalsResultValue1Struct>",
+    },
+  ],
+  "methods": [
+    Method {
+      "body": "this.value0 = value0
+this.value1 = value1",
+      "name": "constructor",
+      "params": Immutable.List [
+        Param {
+          "name": "value0",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "value1",
+          "type": "Array<Contract__getProposalsResultValue1Struct>",
+        },
+      ],
+      "returnType": null,
+    },
+    Method {
+      "body": "
+            let map = new TypedMap<string,ethereum.Value>();
+            map.set('value0', ethereum.Value.fromUnsignedBigInt(this.value0));map.set('value1', ethereum.Value.fromTupleArray(this.value1))
+            return map;
+            ",
+      "name": "toMap",
+      "params": [],
+      "returnType": NamedType {
+        "name": "TypedMap<string,ethereum.Value>",
+      },
+    },
+    Method {
+      "body": "return this.value0;",
+      "name": "getSize",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "return this.value1;",
+      "name": "getValue1",
+      "params": [],
+      "returnType": "Array<Contract__getProposalsResultValue1Struct>",
+    },
+  ],
+  "name": "Contract__getProposalsResult",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type generated 6`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.SmartContract",
+  "members": [],
+  "methods": [
+    StaticMethod {
+      "body": "
+        return new Contract('Contract', address);
+        ",
+      "name": "bind",
+      "params": Immutable.List [
+        Param {
+          "name": "address",
+          "type": "Address",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "Contract",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'read',
+      'read():(bytes32)',
+      [])
+
+        return ( result[0].toBytes())",
+      "name": "read",
+      "params": Immutable.List [],
+      "returnType": NamedType {
+        "name": "Bytes",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'read',
+      'read():(bytes32)',
+      [])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toBytes())",
+      "name": "try_read",
+      "params": Immutable.List [],
+      "returnType": "ethereum.CallResult<Bytes>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'getProposal',
+      'getProposal(uint256,(uint8,(address))):((uint8,address,bytes,address,address,uint256,uint256,uint256,uint256))',
+      [ethereum.Value.fromUnsignedBigInt(proposalId), ethereum.Value.fromTuple(param1)])
+
+        return ( changetype<Contract__getProposalResultValue0Struct>(result[0].toTuple()))",
+      "name": "getProposal",
+      "params": Immutable.List [
+        Param {
+          "name": "proposalId",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "param1",
+          "type": "Contract__getProposalInputParam1Struct",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "Contract__getProposalResultValue0Struct",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'getProposal',
+      'getProposal(uint256,(uint8,(address))):((uint8,address,bytes,address,address,uint256,uint256,uint256,uint256))',
+      [ethereum.Value.fromUnsignedBigInt(proposalId), ethereum.Value.fromTuple(param1)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( changetype<Contract__getProposalResultValue0Struct>(value[0].toTuple()))",
+      "name": "try_getProposal",
+      "params": Immutable.List [
+        Param {
+          "name": "proposalId",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "param1",
+          "type": "Contract__getProposalInputParam1Struct",
+        },
+      ],
+      "returnType": "ethereum.CallResult<Contract__getProposalResultValue0Struct>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'getProposals',
+      'getProposals():(uint256,(uint256,string)[])',
+      [])
+
+        return ( new Contract__getProposalsResult(
+                result[0].toBigInt(), result[1].toTupleArray<Contract__getProposalsResultValue1Struct>()
+              ))",
+      "name": "getProposals",
+      "params": Immutable.List [],
+      "returnType": NamedType {
+        "name": "Contract__getProposalsResult",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'getProposals',
+      'getProposals():(uint256,(uint256,string)[])',
+      [])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( new Contract__getProposalsResult(
+                value[0].toBigInt(), value[1].toTupleArray<Contract__getProposalsResultValue1Struct>()
+              ))",
+      "name": "try_getProposals",
+      "params": Immutable.List [],
+      "returnType": "ethereum.CallResult<Contract__getProposalsResult>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(string):(string)',
+      [ethereum.Value.fromString(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "string",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(string):(string)',
+      [ethereum.Value.fromString(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "string",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(uint256):(string)',
+      [ethereum.Value.fromUnsignedBigInt(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded1",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "BigInt",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(uint256):(string)',
+      [ethereum.Value.fromUnsignedBigInt(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded1",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "BigInt",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(bytes32):(string)',
+      [ethereum.Value.fromFixedBytes(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded2",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "Bytes",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(bytes32):(string)',
+      [ethereum.Value.fromFixedBytes(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded2",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "Bytes",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+  ],
+  "name": "Contract",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 1`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toI32()
+            ",
+      "name": "get result",
+      "params": [],
+      "returnType": "i32",
+    },
+    Method {
+      "body": "
+            return this[1].toAddress()
+            ",
+      "name": "get target",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[2].toBytes()
+            ",
+      "name": "get data",
+      "params": [],
+      "returnType": "Bytes",
+    },
+    Method {
+      "body": "
+            return this[3].toAddress()
+            ",
+      "name": "get proposer",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[4].toAddress()
+            ",
+      "name": "get feeRecipient",
+      "params": [],
+      "returnType": "Address",
+    },
+    Method {
+      "body": "
+            return this[5].toBigInt()
+            ",
+      "name": "get fee",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[6].toBigInt()
+            ",
+      "name": "get startTime",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[7].toBigInt()
+            ",
+      "name": "get yesCount",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[8].toBigInt()
+            ",
+      "name": "get noCount",
+      "params": [],
+      "returnType": "BigInt",
+    },
+  ],
+  "name": "Contract__getProposalResultValue0Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 2`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toI32()
+            ",
+      "name": "get foo",
+      "params": [],
+      "returnType": "i32",
+    },
+    Method {
+      "body": "
+      return changetype<Contract__getProposalInputParam1BarStruct>(this[1].toTuple())
+      ",
+      "name": "get bar",
+      "params": [],
+      "returnType": "Contract__getProposalInputParam1BarStruct",
+    },
+  ],
+  "name": "Contract__getProposalInputParam1Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 3`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toAddress()
+            ",
+      "name": "get baz",
+      "params": [],
+      "returnType": "Address",
+    },
+  ],
+  "name": "Contract__getProposalInputParam1BarStruct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 4`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.Tuple",
+  "members": [],
+  "methods": [
+    Method {
+      "body": "
+            return this[0].toBigInt()
+            ",
+      "name": "get first",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "
+            return this[1].toString()
+            ",
+      "name": "get second",
+      "params": [],
+      "returnType": "string",
+    },
+  ],
+  "name": "Contract__getProposalsResultValue1Struct",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 5`] = `
+Class {
+  "export": true,
+  "extends": undefined,
+  "members": [
+    ClassMember {
+      "name": "value0",
+      "type": "BigInt",
+    },
+    ClassMember {
+      "name": "value1",
+      "type": "Array<Contract__getProposalsResultValue1Struct>",
+    },
+  ],
+  "methods": [
+    Method {
+      "body": "this.value0 = value0
+this.value1 = value1",
+      "name": "constructor",
+      "params": Immutable.List [
+        Param {
+          "name": "value0",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "value1",
+          "type": "Array<Contract__getProposalsResultValue1Struct>",
+        },
+      ],
+      "returnType": null,
+    },
+    Method {
+      "body": "
+            let map = new TypedMap<string,ethereum.Value>();
+            map.set('value0', ethereum.Value.fromUnsignedBigInt(this.value0));map.set('value1', ethereum.Value.fromTupleArray(this.value1))
+            return map;
+            ",
+      "name": "toMap",
+      "params": [],
+      "returnType": NamedType {
+        "name": "TypedMap<string,ethereum.Value>",
+      },
+    },
+    Method {
+      "body": "return this.value0;",
+      "name": "getSize",
+      "params": [],
+      "returnType": "BigInt",
+    },
+    Method {
+      "body": "return this.value1;",
+      "name": "getValue1",
+      "params": [],
+      "returnType": "Array<Contract__getProposalsResultValue1Struct>",
+    },
+  ],
+  "name": "Contract__getProposalsResult",
+}
+`;
+
+exports[`ABI code generation > Generated types > Type test 6`] = `
+Class {
+  "export": true,
+  "extends": "ethereum.SmartContract",
+  "members": [],
+  "methods": [
+    StaticMethod {
+      "body": "
+        return new Contract('Contract', address);
+        ",
+      "name": "bind",
+      "params": Immutable.List [
+        Param {
+          "name": "address",
+          "type": "Address",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "Contract",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'read',
+      'read():(bytes32)',
+      [])
+
+        return ( result[0].toBytes())",
+      "name": "read",
+      "params": Immutable.List [],
+      "returnType": NamedType {
+        "name": "Bytes",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'read',
+      'read():(bytes32)',
+      [])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toBytes())",
+      "name": "try_read",
+      "params": Immutable.List [],
+      "returnType": "ethereum.CallResult<Bytes>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'getProposal',
+      'getProposal(uint256,(uint8,(address))):((uint8,address,bytes,address,address,uint256,uint256,uint256,uint256))',
+      [ethereum.Value.fromUnsignedBigInt(proposalId), ethereum.Value.fromTuple(param1)])
+
+        return ( changetype<Contract__getProposalResultValue0Struct>(result[0].toTuple()))",
+      "name": "getProposal",
+      "params": Immutable.List [
+        Param {
+          "name": "proposalId",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "param1",
+          "type": "Contract__getProposalInputParam1Struct",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "Contract__getProposalResultValue0Struct",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'getProposal',
+      'getProposal(uint256,(uint8,(address))):((uint8,address,bytes,address,address,uint256,uint256,uint256,uint256))',
+      [ethereum.Value.fromUnsignedBigInt(proposalId), ethereum.Value.fromTuple(param1)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( changetype<Contract__getProposalResultValue0Struct>(value[0].toTuple()))",
+      "name": "try_getProposal",
+      "params": Immutable.List [
+        Param {
+          "name": "proposalId",
+          "type": "BigInt",
+        },
+        Param {
+          "name": "param1",
+          "type": "Contract__getProposalInputParam1Struct",
+        },
+      ],
+      "returnType": "ethereum.CallResult<Contract__getProposalResultValue0Struct>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'getProposals',
+      'getProposals():(uint256,(uint256,string)[])',
+      [])
+
+        return ( new Contract__getProposalsResult(
+                result[0].toBigInt(), result[1].toTupleArray<Contract__getProposalsResultValue1Struct>()
+              ))",
+      "name": "getProposals",
+      "params": Immutable.List [],
+      "returnType": NamedType {
+        "name": "Contract__getProposalsResult",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'getProposals',
+      'getProposals():(uint256,(uint256,string)[])',
+      [])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( new Contract__getProposalsResult(
+                value[0].toBigInt(), value[1].toTupleArray<Contract__getProposalsResultValue1Struct>()
+              ))",
+      "name": "try_getProposals",
+      "params": Immutable.List [],
+      "returnType": "ethereum.CallResult<Contract__getProposalsResult>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(string):(string)',
+      [ethereum.Value.fromString(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "string",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(string):(string)',
+      [ethereum.Value.fromString(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "string",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(uint256):(string)',
+      [ethereum.Value.fromUnsignedBigInt(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded1",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "BigInt",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(uint256):(string)',
+      [ethereum.Value.fromUnsignedBigInt(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded1",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "BigInt",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+    Method {
+      "body": "
+        
+        let result = super.call(
+      'overloaded',
+      'overloaded(bytes32):(string)',
+      [ethereum.Value.fromFixedBytes(param0)])
+
+        return ( result[0].toString())",
+      "name": "overloaded2",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "Bytes",
+        },
+      ],
+      "returnType": NamedType {
+        "name": "string",
+      },
+    },
+    Method {
+      "body": "
+        
+        let result = super.tryCall(
+      'overloaded',
+      'overloaded(bytes32):(string)',
+      [ethereum.Value.fromFixedBytes(param0)])
+        if (result.reverted) {
+          return new ethereum.CallResult()
+        }
+        let value = result.value
+        return ethereum.CallResult.fromValue( value[0].toString())",
+      "name": "try_overloaded2",
+      "params": Immutable.List [
+        Param {
+          "name": "param0",
+          "type": "Bytes",
+        },
+      ],
+      "returnType": "ethereum.CallResult<string>",
+    },
+  ],
+  "name": "Contract",
+}
+`;
diff --git a/packages/cli/src/protocols/ethereum/codegen/abi.test.ts b/packages/cli/src/protocols/ethereum/codegen/abi.test.ts
index 07ed2d3b..a274559a 100644
--- a/packages/cli/src/protocols/ethereum/codegen/abi.test.ts
+++ b/packages/cli/src/protocols/ethereum/codegen/abi.test.ts
@@ -1,14 +1,12 @@
 import path from 'node:path';
 import fs from 'fs-extra';
-import immutable from 'immutable';
 import { afterAll, beforeAll, describe, expect, test } from 'vitest';
-import * as ts from '../../../codegen/typescript.js';
 import ABI from '../abi.js';
 import AbiCodeGenerator from './abi.js';
 
 let tempdir: string;
 let abi: ABI;
-let generatedTypes: any[];
+let generatedTypes: any[] = [];
 
 describe.concurrent('ABI code generation', () => {
   beforeAll(async () => {
@@ -179,153 +177,10 @@ describe.concurrent('ABI code generation', () => {
   });
 
   describe('Generated types', () => {
-    test('All expected types are generated', () => {
-      expect(generatedTypes.map(type => type.name)).toEqual([
-        'Contract__getProposalResultValue0Struct',
-        'Contract__getProposalInputParam1Struct',
-        'Contract__getProposalInputParam1BarStruct',
-        'Contract__getProposalsResultValue1Struct',
-        'Contract__getProposalsResult',
-        'Contract',
-      ]);
-    });
-  });
-
-  describe('Contract class', () => {
-    test('Exists', () => {
-      expect(generatedTypes.find(type => type.name === 'Contract')).toBeDefined();
-    });
-
-    test('Has methods', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      expect(contract.methods).toBeInstanceOf(Array);
-    });
-
-    test('Has `bind` method', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      expect(contract.methods.find((method: any) => method.name === 'bind')).toBeDefined();
-    });
-
-    test('Has methods for all callable functions', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      expect(contract.methods.map((method: any) => method.name)).toContain('getProposal');
-    });
-  });
-
-  describe('Methods for callable functions', () => {
-    test('Have correct parameters', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      expect(contract.methods.map((method: any) => [method.name, method.params])).toEqual([
-        ['bind', immutable.List([ts.param('address', 'Address')])],
-        ['read', immutable.List()],
-        ['try_read', immutable.List()],
-        [
-          'getProposal',
-          immutable.List([
-            ts.param('proposalId', 'BigInt'),
-            ts.param('param1', 'Contract__getProposalInputParam1Struct'),
-          ]),
-        ],
-        [
-          'try_getProposal',
-          immutable.List([
-            ts.param('proposalId', 'BigInt'),
-            ts.param('param1', 'Contract__getProposalInputParam1Struct'),
-          ]),
-        ],
-        ['getProposals', immutable.List()],
-        ['try_getProposals', immutable.List()],
-        ['overloaded', immutable.List([ts.param('param0', 'string')])],
-        ['try_overloaded', immutable.List([ts.param('param0', 'string')])],
-        ['overloaded1', immutable.List([ts.param('param0', 'BigInt')])],
-        ['try_overloaded1', immutable.List([ts.param('param0', 'BigInt')])],
-        ['overloaded2', immutable.List([ts.param('param0', 'Bytes')])],
-        ['try_overloaded2', immutable.List([ts.param('param0', 'Bytes')])],
-      ]);
-    });
-
-    test('Have correct return types', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      expect(contract.methods.map((method: any) => [method.name, method.returnType])).toEqual([
-        ['bind', ts.namedType('Contract')],
-        ['read', ts.namedType('Bytes')],
-        ['try_read', 'ethereum.CallResult<Bytes>'],
-        ['getProposal', ts.namedType('Contract__getProposalResultValue0Struct')],
-        ['try_getProposal', 'ethereum.CallResult<Contract__getProposalResultValue0Struct>'],
-        ['getProposals', ts.namedType('Contract__getProposalsResult')],
-        ['try_getProposals', 'ethereum.CallResult<Contract__getProposalsResult>'],
-        ['overloaded', ts.namedType('string')],
-        ['try_overloaded', 'ethereum.CallResult<string>'],
-        ['overloaded1', ts.namedType('string')],
-        ['try_overloaded1', 'ethereum.CallResult<string>'],
-        ['overloaded2', ts.namedType('string')],
-        ['try_overloaded2', 'ethereum.CallResult<string>'],
-      ]);
-    });
-  });
-
-  describe('Tuples', () => {
-    test('Tuple types exist for function parameters', () => {
-      let tupleType = generatedTypes.find(
-        type => type.name === 'Contract__getProposalInputParam1Struct',
-      );
-
-      // Verify that the tuple type has methods
-      expect(tupleType.methods).toBeDefined();
-
-      // Verify that the tuple type has getters for all tuple fields with
-      // the right return types
-      expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
-        ['get foo', 'i32'],
-        ['get bar', 'Contract__getProposalInputParam1BarStruct'],
-      ]);
-
-      // Inner tuple:
-      tupleType = generatedTypes.find(
-        type => type.name === 'Contract__getProposalInputParam1BarStruct',
-      );
-
-      // Verify that the tuple type has methods
-      expect(tupleType.methods).toBeDefined();
-
-      // Verify that the tuple type has getters for all tuple fields with
-      // the right return types
-      expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
-        ['get baz', 'Address'],
-      ]);
-    });
-
-    test('Tuple types exist for function return values', () => {
-      const tupleType = generatedTypes.find(
-        type => type.name === 'Contract__getProposalResultValue0Struct',
-      );
-
-      // Verify that the tuple type has methods
-      expect(tupleType.methods).toBeDefined();
-
-      // Verify that the tuple type has getters for all tuple fields with
-      // the right return types
-      expect(tupleType.methods.map((method: any) => [method.name, method.returnType])).toEqual([
-        ['get result', 'i32'],
-        ['get target', 'Address'],
-        ['get data', 'Bytes'],
-        ['get proposer', 'Address'],
-        ['get feeRecipient', 'Address'],
-        ['get fee', 'BigInt'],
-        ['get startTime', 'BigInt'],
-        ['get yesCount', 'BigInt'],
-        ['get noCount', 'BigInt'],
-      ]);
-    });
-
-    test('Function bodies are generated correctly for tuple arrays', () => {
-      const contract = generatedTypes.find(type => type.name === 'Contract');
-      const getter = contract.methods.find((method: any) => method.name === 'getProposals');
-
-      expect(getter.body).not.toContain('toTupleArray<undefined>');
-      expect(getter.body).toContain(
-        'result[1].toTupleArray<Contract__getProposalsResultValue1Struct>()',
-      );
+    test(`Type test`, () => {
+      for (const generatedType of generatedTypes) {
+        expect(generatedType).toMatchSnapshot();
+      }
     });
   });
 });
diff --git a/packages/cli/src/scaffold/__snapshots__/cosmos.test.ts.snap b/packages/cli/src/scaffold/__snapshots__/cosmos.test.ts.snap
new file mode 100644
index 00000000..f9e5d47a
--- /dev/null
+++ b/packages/cli/src/scaffold/__snapshots__/cosmos.test.ts.snap
@@ -0,0 +1,69 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`Cosmos subgraph scaffolding > Manifest 1`] = `
+"specVersion: 1.0.0
+indexerHints:
+  prune: auto
+schema:
+  file: ./schema.graphql
+dataSources:
+  - kind: cosmos
+    name: CosmosHub
+    network: cosmoshub-4
+    source:
+      startBlock: 0
+    mapping:
+      apiVersion: 0.0.5
+      language: wasm/assemblyscript
+      entities:
+        - ExampleEntity
+      blockHandlers:
+        - handler: handleBlock
+      file: ./src/contract.ts
+"
+`;
+
+exports[`Cosmos subgraph scaffolding > Mapping (default) 1`] = `
+"import { cosmos, BigInt } from "@graphprotocol/graph-ts"
+import { ExampleEntity } from "../generated/schema"
+
+export function handleBlock(block: cosmos.Block): void {
+  // Entities can be loaded from the store using a string ID; this ID
+  // needs to be unique across all entities of the same type
+  let entity = ExampleEntity.load(block.header.hash.toHex())
+
+  // Entities only exist after they have been saved to the store;
+  // \`null\` checks allow to create entities on demand
+  if (!entity) {
+    entity = new ExampleEntity(block.header.hash.toHex())
+
+    // Entity fields can be set using simple assignments
+    entity.count = BigInt.fromI32(0)
+  }
+
+  // BigInt and BigDecimal math are supported
+  entity.count = entity.count + BigInt.fromI32(1)
+
+  // Entity fields can be set based on receipt information
+  entity.height = block.header.height
+
+  // Entities can be written to the store with \`.save()\`
+  entity.save()
+
+  // Note: If a handler doesn't require existing field values, it is faster
+  // _not_ to load the entity from the store. Instead, create it fresh with
+  // \`new Entity(...)\`, set the fields that should be updated and save the
+  // entity back to the store. Fields that were not set or unset remain
+  // unchanged, allowing for partial updates to be applied.
+}
+"
+`;
+
+exports[`Cosmos subgraph scaffolding > Schema (default) 1`] = `
+"type ExampleEntity @entity {
+  id: ID!
+  block: Bytes!
+  count: BigInt!
+}
+"
+`;
diff --git a/packages/cli/src/scaffold/__snapshots__/ethereum.test.ts.snap b/packages/cli/src/scaffold/__snapshots__/ethereum.test.ts.snap
new file mode 100644
index 00000000..8c778bd1
--- /dev/null
+++ b/packages/cli/src/scaffold/__snapshots__/ethereum.test.ts.snap
@@ -0,0 +1,438 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`Ethereum subgraph scaffolding > Manifest 1`] = `
+"specVersion: 1.0.0
+indexerHints:
+  prune: auto
+schema:
+  file: ./schema.graphql
+dataSources:
+  - kind: ethereum
+    name: Contract
+    network: kovan
+    source:
+      address: "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d"
+      abi: Contract
+      startBlock: 12345
+    mapping:
+      kind: ethereum/events
+      apiVersion: 0.0.7
+      language: wasm/assemblyscript
+      entities:
+        - ExampleEvent
+        - ExampleEvent1
+      abis:
+        - name: Contract
+          file: ./abis/Contract.json
+      eventHandlers:
+        - event: ExampleEvent(indexed uint256,bytes[4],string,(uint256,bytes32,string,(uint96,string,bytes32)),indexed string,string)
+          handler: handleExampleEvent
+        - event: ExampleEvent(bytes32)
+          handler: handleExampleEvent1
+      file: ./src/contract.ts
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Mapping (default) 1`] = `
+"import { BigInt } from "@graphprotocol/graph-ts"
+import {
+  Contract,
+  ExampleEvent,
+  ExampleEvent1
+} from "../generated/Contract/Contract"
+import { ExampleEntity } from "../generated/schema"
+
+export function handleExampleEvent(event: ExampleEvent): void {
+  // Entities can be loaded from the store using a string ID; this ID
+  // needs to be unique across all entities of the same type
+  let entity = ExampleEntity.load(event.transaction.from)
+
+  // Entities only exist after they have been saved to the store;
+  // \`null\` checks allow to create entities on demand
+  if (!entity) {
+    entity = new ExampleEntity(event.transaction.from)
+
+    // Entity fields can be set using simple assignments
+    entity.count = BigInt.fromI32(0)
+  }
+
+  // BigInt and BigDecimal math are supported
+  entity.count = entity.count + BigInt.fromI32(1)
+
+  // Entity fields can be set based on event parameters
+  entity.a = event.params.a
+  entity.b = event.params.b
+
+  // Entities can be written to the store with \`.save()\`
+  entity.save()
+
+  // Note: If a handler doesn't require existing field values, it is faster
+  // _not_ to load the entity from the store. Instead, create it fresh with
+  // \`new Entity(...)\`, set the fields that should be updated and save the
+  // entity back to the store. Fields that were not set or unset remain
+  // unchanged, allowing for partial updates to be applied.
+
+  // It is also possible to access smart contracts from mappings. For
+  // example, the contract that has emitted the event can be connected to
+  // with:
+  //
+  // let contract = Contract.bind(event.address)
+  //
+  // The following functions can then be called on this contract to access
+  // state variables and other data:
+  //
+  // - contract.someVariable(...)
+  // - contract.getSomeValue(...)
+}
+
+export function handleExampleEvent1(event: ExampleEvent1): void {}
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Mapping (for indexing events) 1`] = `
+"import {
+  ExampleEvent as ExampleEventEvent,
+  ExampleEvent1 as ExampleEvent1Event
+} from "../generated/Contract/Contract"
+import { ExampleEvent, ExampleEvent1 } from "../generated/schema"
+
+export function handleExampleEvent(event: ExampleEventEvent): void {
+  let entity = new ExampleEvent(
+    event.transaction.hash.concatI32(event.logIndex.toI32())
+  )
+  entity.a = event.params.a
+  entity.b = event.params.b
+  entity.param2 = event.params.param2
+  entity.c_c1 = event.params.c.c1
+  entity.c_value1 = event.params.c.value1
+  entity.c_value2 = event.params.c.value2
+  entity.c_c3_c31 = event.params.c.c3.c31
+  entity.c_c3_value1 = event.params.c.c3.value1
+  entity.c_c3_value2 = event.params.c.c3.value2
+  entity.d = event.params.d
+  entity.internal_id = event.params.id
+
+  entity.blockNumber = event.block.number
+  entity.blockTimestamp = event.block.timestamp
+  entity.transactionHash = event.transaction.hash
+
+  entity.save()
+}
+
+export function handleExampleEvent1(event: ExampleEvent1Event): void {
+  let entity = new ExampleEvent1(
+    event.transaction.hash.concatI32(event.logIndex.toI32())
+  )
+  entity.a = event.params.a
+
+  entity.blockNumber = event.block.number
+  entity.blockTimestamp = event.block.timestamp
+  entity.transactionHash = event.transaction.hash
+
+  entity.save()
+}
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Schema (default) 1`] = `
+"type ExampleEntity @entity {
+  id: Bytes!
+  count: BigInt!
+  a: BigInt! # uint256
+  b: [Bytes!]! # bytes[4]
+}
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Schema (for indexing events) 1`] = `
+"type ExampleEvent @entity(immutable: true) {
+  id: Bytes!
+  a: BigInt! # uint256
+  b: [Bytes!]! # bytes[4]
+  param2: String! # string
+  c_c1: BigInt! # uint256
+  c_value1: Bytes! # bytes32
+  c_value2: String! # string
+  c_c3_c31: BigInt! # uint96
+  c_c3_value1: String! # string
+  c_c3_value2: Bytes! # bytes32
+  d: String! # string
+  internal_id: String! # string
+  blockNumber: BigInt!
+  blockTimestamp: BigInt!
+  transactionHash: Bytes!
+}
+
+type ExampleEvent1 @entity(immutable: true) {
+  id: Bytes!
+  a: Bytes! # bytes32
+  blockNumber: BigInt!
+  blockTimestamp: BigInt!
+  transactionHash: Bytes!
+}
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Test Files (default) 1`] = `
+"import {
+  assert,
+  describe,
+  test,
+  clearStore,
+  beforeAll,
+  afterAll
+} from "matchstick-as/assembly/index"
+import { BigInt, Bytes } from "@graphprotocol/graph-ts"
+import { ExampleEvent } from "../generated/schema"
+import { ExampleEvent as ExampleEventEvent } from "../generated/Contract/Contract"
+import { handleExampleEvent } from "../src/contract"
+import { createExampleEventEvent } from "./contract-utils"
+
+// Tests structure (matchstick-as >=0.5.0)
+// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
+
+describe("Describe entity assertions", () => {
+  beforeAll(() => {
+    let a = BigInt.fromI32(234)
+    let b = [Bytes.fromI32(1234567890)]
+    let param2 = "Example string value"
+    let c = "ethereum.Tuple Not implemented"
+    let d = "Example string value"
+    let id = "Example string value"
+    let newExampleEventEvent = createExampleEventEvent(a, b, param2, c, d, id)
+    handleExampleEvent(newExampleEventEvent)
+  })
+
+  afterAll(() => {
+    clearStore()
+  })
+
+  // For more test scenarios, see:
+  // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
+
+  test("ExampleEvent created and stored", () => {
+    assert.entityCount("ExampleEvent", 1)
+
+    // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "a",
+      "234"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "b",
+      "[1234567890]"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "param2",
+      "Example string value"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "c",
+      "ethereum.Tuple Not implemented"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "d",
+      "Example string value"
+    )
+
+    // More assert options:
+    // https://thegraph.com/docs/en/developer/matchstick/#asserts
+  })
+})
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Test Files (default) 2`] = `
+"import { newMockEvent } from "matchstick-as"
+import { ethereum, BigInt, Bytes } from "@graphprotocol/graph-ts"
+import { ExampleEvent, ExampleEvent1 } from "../generated/Contract/Contract"
+
+export function createExampleEventEvent(
+  a: BigInt,
+  b: Array<Bytes>,
+  param2: string,
+  c: ethereum.Tuple,
+  d: string,
+  id: string
+): ExampleEvent {
+  let exampleEventEvent = changetype<ExampleEvent>(newMockEvent())
+
+  exampleEventEvent.parameters = new Array()
+
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("a", ethereum.Value.fromUnsignedBigInt(a))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("b", ethereum.Value.fromBytesArray(b))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("param2", ethereum.Value.fromString(param2))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("c", ethereum.Value.fromTuple(c))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("d", ethereum.Value.fromString(d))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("id", ethereum.Value.fromString(id))
+  )
+
+  return exampleEventEvent
+}
+
+export function createExampleEvent1Event(a: Bytes): ExampleEvent1 {
+  let exampleEvent1Event = changetype<ExampleEvent1>(newMockEvent())
+
+  exampleEvent1Event.parameters = new Array()
+
+  exampleEvent1Event.parameters.push(
+    new ethereum.EventParam("a", ethereum.Value.fromFixedBytes(a))
+  )
+
+  return exampleEvent1Event
+}
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Test Files (for indexing events) 1`] = `
+"import {
+  assert,
+  describe,
+  test,
+  clearStore,
+  beforeAll,
+  afterAll
+} from "matchstick-as/assembly/index"
+import { BigInt, Bytes } from "@graphprotocol/graph-ts"
+import { ExampleEvent } from "../generated/schema"
+import { ExampleEvent as ExampleEventEvent } from "../generated/Contract/Contract"
+import { handleExampleEvent } from "../src/contract"
+import { createExampleEventEvent } from "./contract-utils"
+
+// Tests structure (matchstick-as >=0.5.0)
+// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
+
+describe("Describe entity assertions", () => {
+  beforeAll(() => {
+    let a = BigInt.fromI32(234)
+    let b = [Bytes.fromI32(1234567890)]
+    let param2 = "Example string value"
+    let c = "ethereum.Tuple Not implemented"
+    let d = "Example string value"
+    let id = "Example string value"
+    let newExampleEventEvent = createExampleEventEvent(a, b, param2, c, d, id)
+    handleExampleEvent(newExampleEventEvent)
+  })
+
+  afterAll(() => {
+    clearStore()
+  })
+
+  // For more test scenarios, see:
+  // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
+
+  test("ExampleEvent created and stored", () => {
+    assert.entityCount("ExampleEvent", 1)
+
+    // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "a",
+      "234"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "b",
+      "[1234567890]"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "param2",
+      "Example string value"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "c",
+      "ethereum.Tuple Not implemented"
+    )
+    assert.fieldEquals(
+      "ExampleEvent",
+      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
+      "d",
+      "Example string value"
+    )
+
+    // More assert options:
+    // https://thegraph.com/docs/en/developer/matchstick/#asserts
+  })
+})
+"
+`;
+
+exports[`Ethereum subgraph scaffolding > Test Files (for indexing events) 2`] = `
+"import { newMockEvent } from "matchstick-as"
+import { ethereum, BigInt, Bytes } from "@graphprotocol/graph-ts"
+import { ExampleEvent, ExampleEvent1 } from "../generated/Contract/Contract"
+
+export function createExampleEventEvent(
+  a: BigInt,
+  b: Array<Bytes>,
+  param2: string,
+  c: ethereum.Tuple,
+  d: string,
+  id: string
+): ExampleEvent {
+  let exampleEventEvent = changetype<ExampleEvent>(newMockEvent())
+
+  exampleEventEvent.parameters = new Array()
+
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("a", ethereum.Value.fromUnsignedBigInt(a))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("b", ethereum.Value.fromBytesArray(b))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("param2", ethereum.Value.fromString(param2))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("c", ethereum.Value.fromTuple(c))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("d", ethereum.Value.fromString(d))
+  )
+  exampleEventEvent.parameters.push(
+    new ethereum.EventParam("id", ethereum.Value.fromString(id))
+  )
+
+  return exampleEventEvent
+}
+
+export function createExampleEvent1Event(a: Bytes): ExampleEvent1 {
+  let exampleEvent1Event = changetype<ExampleEvent1>(newMockEvent())
+
+  exampleEvent1Event.parameters = new Array()
+
+  exampleEvent1Event.parameters.push(
+    new ethereum.EventParam("a", ethereum.Value.fromFixedBytes(a))
+  )
+
+  return exampleEvent1Event
+}
+"
+`;
diff --git a/packages/cli/src/scaffold/__snapshots__/near.test.ts.snap b/packages/cli/src/scaffold/__snapshots__/near.test.ts.snap
new file mode 100644
index 00000000..d5fb1f80
--- /dev/null
+++ b/packages/cli/src/scaffold/__snapshots__/near.test.ts.snap
@@ -0,0 +1,71 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`NEAR subgraph scaffolding > Manifest 1`] = `
+"specVersion: 1.0.0
+indexerHints:
+  prune: auto
+schema:
+  file: ./schema.graphql
+dataSources:
+  - kind: near
+    name: Contract
+    network: near-mainnet
+    source:
+      account: "abc.def.near"
+    mapping:
+      apiVersion: 0.0.5
+      language: wasm/assemblyscript
+      entities:
+        - ExampleEntity
+      receiptHandlers:
+        - handler: handleReceipt
+      file: ./src/contract.ts
+"
+`;
+
+exports[`NEAR subgraph scaffolding > Mapping (default) 1`] = `
+"import { near, BigInt } from "@graphprotocol/graph-ts"
+import { ExampleEntity } from "../generated/schema"
+
+export function handleReceipt(
+  receiptWithOutcome: near.ReceiptWithOutcome
+): void {
+  // Entities can be loaded from the store using a string ID; this ID
+  // needs to be unique across all entities of the same type
+  let entity = ExampleEntity.load(receiptWithOutcome.receipt.id.toHex())
+
+  // Entities only exist after they have been saved to the store;
+  // \`null\` checks allow to create entities on demand
+  if (!entity) {
+    entity = new ExampleEntity(receiptWithOutcome.receipt.id.toHex())
+
+    // Entity fields can be set using simple assignments
+    entity.count = BigInt.fromI32(0)
+  }
+
+  // BigInt and BigDecimal math are supported
+  entity.count = entity.count + BigInt.fromI32(1)
+
+  // Entity fields can be set based on receipt information
+  entity.block = receiptWithOutcome.block.header.hash
+
+  // Entities can be written to the store with \`.save()\`
+  entity.save()
+
+  // Note: If a handler doesn't require existing field values, it is faster
+  // _not_ to load the entity from the store. Instead, create it fresh with
+  // \`new Entity(...)\`, set the fields that should be updated and save the
+  // entity back to the store. Fields that were not set or unset remain
+  // unchanged, allowing for partial updates to be applied.
+}
+"
+`;
+
+exports[`NEAR subgraph scaffolding > Schema (default) 1`] = `
+"type ExampleEntity @entity {
+  id: ID!
+  block: Bytes!
+  count: BigInt!
+}
+"
+`;
diff --git a/packages/cli/src/scaffold/cosmos.test.ts b/packages/cli/src/scaffold/cosmos.test.ts
index ded47f80..d73c3c0b 100644
--- a/packages/cli/src/scaffold/cosmos.test.ts
+++ b/packages/cli/src/scaffold/cosmos.test.ts
@@ -12,75 +12,16 @@ const scaffoldOptions = {
 
 const scaffold = new Scaffold(scaffoldOptions);
 
-describe.concurrent('Cosmos subgraph scaffolding', () => {
+describe('Cosmos subgraph scaffolding', () => {
   test('Manifest', async () => {
-    expect(await scaffold.generateManifest()).toEqual(`\
-specVersion: 1.0.0
-indexerHints:
-  prune: auto
-schema:
-  file: ./schema.graphql
-dataSources:
-  - kind: cosmos
-    name: CosmosHub
-    network: cosmoshub-4
-    source:
-      startBlock: 0
-    mapping:
-      apiVersion: 0.0.5
-      language: wasm/assemblyscript
-      entities:
-        - ExampleEntity
-      blockHandlers:
-        - handler: handleBlock
-      file: ./src/contract.ts
-`);
+    expect(await scaffold.generateManifest()).toMatchSnapshot();
   });
 
   test('Schema (default)', async () => {
-    expect(await scaffold.generateSchema()).toEqual(`\
-type ExampleEntity @entity {
-  id: ID!
-  block: Bytes!
-  count: BigInt!
-}
-`);
+    expect(await scaffold.generateSchema()).toMatchSnapshot();
   });
 
   test('Mapping (default)', async () => {
-    expect(await scaffold.generateMapping()).toEqual(`\
-import { cosmos, BigInt } from "@graphprotocol/graph-ts"
-import { ExampleEntity } from "../generated/schema"
-
-export function handleBlock(block: cosmos.Block): void {
-  // Entities can be loaded from the store using a string ID; this ID
-  // needs to be unique across all entities of the same type
-  let entity = ExampleEntity.load(block.header.hash.toHex())
-
-  // Entities only exist after they have been saved to the store;
-  // \`null\` checks allow to create entities on demand
-  if (!entity) {
-    entity = new ExampleEntity(block.header.hash.toHex())
-
-    // Entity fields can be set using simple assignments
-    entity.count = BigInt.fromI32(0)
-  }
-
-  // BigInt and BigDecimal math are supported
-  entity.count = entity.count + BigInt.fromI32(1)
-
-  // Entity fields can be set based on receipt information
-  entity.height = block.header.height
-
-  // Entities can be written to the store with \`.save()\`
-  entity.save()
-
-  // Note: If a handler doesn't require existing field values, it is faster
-  // _not_ to load the entity from the store. Instead, create it fresh with
-  // \`new Entity(...)\`, set the fields that should be updated and save the
-  // entity back to the store. Fields that were not set or unset remain
-  // unchanged, allowing for partial updates to be applied.
-}
-`);
+    expect(await scaffold.generateMapping()).toMatchSnapshot();
   });
 });
diff --git a/packages/cli/src/scaffold/ethereum.test.ts b/packages/cli/src/scaffold/ethereum.test.ts
index 1f84f8e0..3acdc649 100644
--- a/packages/cli/src/scaffold/ethereum.test.ts
+++ b/packages/cli/src/scaffold/ethereum.test.ts
@@ -26,6 +26,7 @@ const TEST_EVENT = {
       ],
     },
     { name: 'd', type: 'string', indexed: true },
+    { name: 'id', type: 'string' },
   ],
 };
 
@@ -79,310 +80,34 @@ const scaffoldWithIndexEvents = new Scaffold({
   indexEvents: true,
 });
 
-describe.concurrent('Ethereum subgraph scaffolding', () => {
+describe('Ethereum subgraph scaffolding', () => {
   test('Manifest', async () => {
-    expect(await scaffold.generateManifest()).toEqual(`\
-specVersion: 1.0.0
-indexerHints:
-  prune: auto
-schema:
-  file: ./schema.graphql
-dataSources:
-  - kind: ethereum
-    name: Contract
-    network: kovan
-    source:
-      address: "0xf87e31492faf9a91b02ee0deaad50d51d56d5d4d"
-      abi: Contract
-      startBlock: 12345
-    mapping:
-      kind: ethereum/events
-      apiVersion: 0.0.7
-      language: wasm/assemblyscript
-      entities:
-        - ExampleEvent
-        - ExampleEvent1
-      abis:
-        - name: Contract
-          file: ./abis/Contract.json
-      eventHandlers:
-        - event: ExampleEvent(indexed uint256,bytes[4],string,(uint256,bytes32,string,(uint96,string,bytes32)),indexed string)
-          handler: handleExampleEvent
-        - event: ExampleEvent(bytes32)
-          handler: handleExampleEvent1
-      file: ./src/contract.ts
-`);
+    expect(await scaffold.generateManifest()).toMatchSnapshot();
   });
 
   test('Schema (default)', async () => {
-    expect(await scaffold.generateSchema()).toEqual(`\
-type ExampleEntity @entity {
-  id: Bytes!
-  count: BigInt!
-  a: BigInt! # uint256
-  b: [Bytes!]! # bytes[4]
-}
-`);
+    expect(await scaffold.generateSchema()).toMatchSnapshot();
   });
 
   test('Schema (for indexing events)', async () => {
-    expect(await scaffoldWithIndexEvents.generateSchema()).toEqual(`\
-type ExampleEvent @entity(immutable: true) {
-  id: Bytes!
-  a: BigInt! # uint256
-  b: [Bytes!]! # bytes[4]
-  param2: String! # string
-  c_c1: BigInt! # uint256
-  c_value1: Bytes! # bytes32
-  c_value2: String! # string
-  c_c3_c31: BigInt! # uint96
-  c_c3_value1: String! # string
-  c_c3_value2: Bytes! # bytes32
-  d: String! # string
-  blockNumber: BigInt!
-  blockTimestamp: BigInt!
-  transactionHash: Bytes!
-}
-
-type ExampleEvent1 @entity(immutable: true) {
-  id: Bytes!
-  a: Bytes! # bytes32
-  blockNumber: BigInt!
-  blockTimestamp: BigInt!
-  transactionHash: Bytes!
-}
-`);
+    expect(await scaffoldWithIndexEvents.generateSchema()).toMatchSnapshot();
   });
 
   test('Mapping (default)', async () => {
-    expect(await scaffold.generateMapping()).toEqual(`\
-import { BigInt } from "@graphprotocol/graph-ts"
-import {
-  Contract,
-  ExampleEvent,
-  ExampleEvent1
-} from "../generated/Contract/Contract"
-import { ExampleEntity } from "../generated/schema"
-
-export function handleExampleEvent(event: ExampleEvent): void {
-  // Entities can be loaded from the store using a string ID; this ID
-  // needs to be unique across all entities of the same type
-  let entity = ExampleEntity.load(event.transaction.from)
-
-  // Entities only exist after they have been saved to the store;
-  // \`null\` checks allow to create entities on demand
-  if (!entity) {
-    entity = new ExampleEntity(event.transaction.from)
-
-    // Entity fields can be set using simple assignments
-    entity.count = BigInt.fromI32(0)
-  }
-
-  // BigInt and BigDecimal math are supported
-  entity.count = entity.count + BigInt.fromI32(1)
-
-  // Entity fields can be set based on event parameters
-  entity.a = event.params.a
-  entity.b = event.params.b
-
-  // Entities can be written to the store with \`.save()\`
-  entity.save()
-
-  // Note: If a handler doesn't require existing field values, it is faster
-  // _not_ to load the entity from the store. Instead, create it fresh with
-  // \`new Entity(...)\`, set the fields that should be updated and save the
-  // entity back to the store. Fields that were not set or unset remain
-  // unchanged, allowing for partial updates to be applied.
-
-  // It is also possible to access smart contracts from mappings. For
-  // example, the contract that has emitted the event can be connected to
-  // with:
-  //
-  // let contract = Contract.bind(event.address)
-  //
-  // The following functions can then be called on this contract to access
-  // state variables and other data:
-  //
-  // - contract.someVariable(...)
-  // - contract.getSomeValue(...)
-}
-
-export function handleExampleEvent1(event: ExampleEvent1): void {}
-`);
+    expect(await scaffold.generateMapping()).toMatchSnapshot();
   });
 
   test('Mapping (for indexing events)', async () => {
-    expect(await scaffoldWithIndexEvents.generateMapping()).toEqual(`\
-import {
-  ExampleEvent as ExampleEventEvent,
-  ExampleEvent1 as ExampleEvent1Event
-} from "../generated/Contract/Contract"
-import { ExampleEvent, ExampleEvent1 } from "../generated/schema"
-
-export function handleExampleEvent(event: ExampleEventEvent): void {
-  let entity = new ExampleEvent(
-    event.transaction.hash.concatI32(event.logIndex.toI32())
-  )
-  entity.a = event.params.a
-  entity.b = event.params.b
-  entity.param2 = event.params.param2
-  entity.c_c1 = event.params.c.c1
-  entity.c_value1 = event.params.c.value1
-  entity.c_value2 = event.params.c.value2
-  entity.c_c3_c31 = event.params.c.c3.c31
-  entity.c_c3_value1 = event.params.c.c3.value1
-  entity.c_c3_value2 = event.params.c.c3.value2
-  entity.d = event.params.d
-
-  entity.blockNumber = event.block.number
-  entity.blockTimestamp = event.block.timestamp
-  entity.transactionHash = event.transaction.hash
-
-  entity.save()
-}
-
-export function handleExampleEvent1(event: ExampleEvent1Event): void {
-  let entity = new ExampleEvent1(
-    event.transaction.hash.concatI32(event.logIndex.toI32())
-  )
-  entity.a = event.params.a
-
-  entity.blockNumber = event.block.number
-  entity.blockTimestamp = event.block.timestamp
-  entity.transactionHash = event.transaction.hash
-
-  entity.save()
-}
-`);
+    expect(await scaffoldWithIndexEvents.generateMapping()).toMatchSnapshot();
   });
 
   test('Test Files (default)', async () => {
     const files = await scaffoldWithIndexEvents.generateTests();
     const testFile = files?.['contract.test.ts'];
     const utilsFile = files?.['contract-utils.ts'];
-    expect(testFile).toEqual(`\
-import {
-  assert,
-  describe,
-  test,
-  clearStore,
-  beforeAll,
-  afterAll
-} from "matchstick-as/assembly/index"
-import { BigInt, Bytes } from "@graphprotocol/graph-ts"
-import { ExampleEvent } from "../generated/schema"
-import { ExampleEvent as ExampleEventEvent } from "../generated/Contract/Contract"
-import { handleExampleEvent } from "../src/contract"
-import { createExampleEventEvent } from "./contract-utils"
-
-// Tests structure (matchstick-as >=0.5.0)
-// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
-
-describe("Describe entity assertions", () => {
-  beforeAll(() => {
-    let a = BigInt.fromI32(234)
-    let b = [Bytes.fromI32(1234567890)]
-    let param2 = "Example string value"
-    let c = "ethereum.Tuple Not implemented"
-    let d = "Example string value"
-    let newExampleEventEvent = createExampleEventEvent(a, b, param2, c, d)
-    handleExampleEvent(newExampleEventEvent)
-  })
-
-  afterAll(() => {
-    clearStore()
-  })
-
-  // For more test scenarios, see:
-  // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
-
-  test("ExampleEvent created and stored", () => {
-    assert.entityCount("ExampleEvent", 1)
-
-    // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "a",
-      "234"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "b",
-      "[1234567890]"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "param2",
-      "Example string value"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "c",
-      "ethereum.Tuple Not implemented"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "d",
-      "Example string value"
-    )
-
-    // More assert options:
-    // https://thegraph.com/docs/en/developer/matchstick/#asserts
-  })
-})
-`);
-    expect(utilsFile).toEqual(`\
-import { newMockEvent } from "matchstick-as"
-import { ethereum, BigInt, Bytes } from "@graphprotocol/graph-ts"
-import { ExampleEvent, ExampleEvent1 } from "../generated/Contract/Contract"
 
-export function createExampleEventEvent(
-  a: BigInt,
-  b: Array<Bytes>,
-  param2: string,
-  c: ethereum.Tuple,
-  d: string
-): ExampleEvent {
-  let exampleEventEvent = changetype<ExampleEvent>(newMockEvent())
-
-  exampleEventEvent.parameters = new Array()
-
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("a", ethereum.Value.fromUnsignedBigInt(a))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("b", ethereum.Value.fromBytesArray(b))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("param2", ethereum.Value.fromString(param2))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("c", ethereum.Value.fromTuple(c))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("d", ethereum.Value.fromString(d))
-  )
-
-  return exampleEventEvent
-}
-
-export function createExampleEvent1Event(a: Bytes): ExampleEvent1 {
-  let exampleEvent1Event = changetype<ExampleEvent1>(newMockEvent())
-
-  exampleEvent1Event.parameters = new Array()
-
-  exampleEvent1Event.parameters.push(
-    new ethereum.EventParam("a", ethereum.Value.fromFixedBytes(a))
-  )
-
-  return exampleEvent1Event
-}
-`);
+    expect(testFile).toMatchSnapshot();
+    expect(utilsFile).toMatchSnapshot();
   });
 
   test('Test Files (for indexing events)', async () => {
@@ -390,128 +115,7 @@ export function createExampleEvent1Event(a: Bytes): ExampleEvent1 {
     const testFile = files?.['contract.test.ts'];
     const utilsFile = files?.['contract-utils.ts'];
 
-    expect(testFile).toEqual(`\
-import {
-  assert,
-  describe,
-  test,
-  clearStore,
-  beforeAll,
-  afterAll
-} from "matchstick-as/assembly/index"
-import { BigInt, Bytes } from "@graphprotocol/graph-ts"
-import { ExampleEvent } from "../generated/schema"
-import { ExampleEvent as ExampleEventEvent } from "../generated/Contract/Contract"
-import { handleExampleEvent } from "../src/contract"
-import { createExampleEventEvent } from "./contract-utils"
-
-// Tests structure (matchstick-as >=0.5.0)
-// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
-
-describe("Describe entity assertions", () => {
-  beforeAll(() => {
-    let a = BigInt.fromI32(234)
-    let b = [Bytes.fromI32(1234567890)]
-    let param2 = "Example string value"
-    let c = "ethereum.Tuple Not implemented"
-    let d = "Example string value"
-    let newExampleEventEvent = createExampleEventEvent(a, b, param2, c, d)
-    handleExampleEvent(newExampleEventEvent)
-  })
-
-  afterAll(() => {
-    clearStore()
-  })
-
-  // For more test scenarios, see:
-  // https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
-
-  test("ExampleEvent created and stored", () => {
-    assert.entityCount("ExampleEvent", 1)
-
-    // 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "a",
-      "234"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "b",
-      "[1234567890]"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "param2",
-      "Example string value"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "c",
-      "ethereum.Tuple Not implemented"
-    )
-    assert.fieldEquals(
-      "ExampleEvent",
-      "0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
-      "d",
-      "Example string value"
-    )
-
-    // More assert options:
-    // https://thegraph.com/docs/en/developer/matchstick/#asserts
-  })
-})
-`);
-    expect(utilsFile).toEqual(`\
-import { newMockEvent } from "matchstick-as"
-import { ethereum, BigInt, Bytes } from "@graphprotocol/graph-ts"
-import { ExampleEvent, ExampleEvent1 } from "../generated/Contract/Contract"
-
-export function createExampleEventEvent(
-  a: BigInt,
-  b: Array<Bytes>,
-  param2: string,
-  c: ethereum.Tuple,
-  d: string
-): ExampleEvent {
-  let exampleEventEvent = changetype<ExampleEvent>(newMockEvent())
-
-  exampleEventEvent.parameters = new Array()
-
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("a", ethereum.Value.fromUnsignedBigInt(a))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("b", ethereum.Value.fromBytesArray(b))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("param2", ethereum.Value.fromString(param2))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("c", ethereum.Value.fromTuple(c))
-  )
-  exampleEventEvent.parameters.push(
-    new ethereum.EventParam("d", ethereum.Value.fromString(d))
-  )
-
-  return exampleEventEvent
-}
-
-export function createExampleEvent1Event(a: Bytes): ExampleEvent1 {
-  let exampleEvent1Event = changetype<ExampleEvent1>(newMockEvent())
-
-  exampleEvent1Event.parameters = new Array()
-
-  exampleEvent1Event.parameters.push(
-    new ethereum.EventParam("a", ethereum.Value.fromFixedBytes(a))
-  )
-
-  return exampleEvent1Event
-}
-`);
+    expect(testFile).toMatchSnapshot();
+    expect(utilsFile).toMatchSnapshot();
   });
 });
diff --git a/packages/cli/src/scaffold/near.test.ts b/packages/cli/src/scaffold/near.test.ts
index 248bc233..6cc54af6 100644
--- a/packages/cli/src/scaffold/near.test.ts
+++ b/packages/cli/src/scaffold/near.test.ts
@@ -13,77 +13,16 @@ const scaffoldOptions = {
 
 const scaffold = new Scaffold(scaffoldOptions);
 
-describe.concurrent('NEAR subgraph scaffolding', () => {
+describe('NEAR subgraph scaffolding', () => {
   test('Manifest', async () => {
-    expect(await scaffold.generateManifest()).toEqual(`\
-specVersion: 1.0.0
-indexerHints:
-  prune: auto
-schema:
-  file: ./schema.graphql
-dataSources:
-  - kind: near
-    name: Contract
-    network: near-mainnet
-    source:
-      account: "abc.def.near"
-    mapping:
-      apiVersion: 0.0.5
-      language: wasm/assemblyscript
-      entities:
-        - ExampleEntity
-      receiptHandlers:
-        - handler: handleReceipt
-      file: ./src/contract.ts
-`);
+    expect(await scaffold.generateManifest()).toMatchSnapshot();
   });
 
   test('Schema (default)', async () => {
-    expect(await scaffold.generateSchema()).toEqual(`\
-type ExampleEntity @entity {
-  id: ID!
-  block: Bytes!
-  count: BigInt!
-}
-`);
+    expect(await scaffold.generateSchema()).toMatchSnapshot();
   });
 
   test('Mapping (default)', async () => {
-    expect(await scaffold.generateMapping()).toEqual(`\
-import { near, BigInt } from "@graphprotocol/graph-ts"
-import { ExampleEntity } from "../generated/schema"
-
-export function handleReceipt(
-  receiptWithOutcome: near.ReceiptWithOutcome
-): void {
-  // Entities can be loaded from the store using a string ID; this ID
-  // needs to be unique across all entities of the same type
-  let entity = ExampleEntity.load(receiptWithOutcome.receipt.id.toHex())
-
-  // Entities only exist after they have been saved to the store;
-  // \`null\` checks allow to create entities on demand
-  if (!entity) {
-    entity = new ExampleEntity(receiptWithOutcome.receipt.id.toHex())
-
-    // Entity fields can be set using simple assignments
-    entity.count = BigInt.fromI32(0)
-  }
-
-  // BigInt and BigDecimal math are supported
-  entity.count = entity.count + BigInt.fromI32(1)
-
-  // Entity fields can be set based on receipt information
-  entity.block = receiptWithOutcome.block.header.hash
-
-  // Entities can be written to the store with \`.save()\`
-  entity.save()
-
-  // Note: If a handler doesn't require existing field values, it is faster
-  // _not_ to load the entity from the store. Instead, create it fresh with
-  // \`new Entity(...)\`, set the fields that should be updated and save the
-  // entity back to the store. Fields that were not set or unset remain
-  // unchanged, allowing for partial updates to be applied.
-}
-`);
+    expect(await scaffold.generateMapping()).toMatchSnapshot();
   });
 });
diff --git a/packages/cli/tests/cli/__snapshots__/validation.test.ts.snap b/packages/cli/tests/cli/__snapshots__/validation.test.ts.snap
index a17f746c..2fbee61b 100644
--- a/packages/cli/tests/cli/__snapshots__/validation.test.ts.snap
+++ b/packages/cli/tests/cli/__snapshots__/validation.test.ts.snap
@@ -471,7 +471,7 @@ exports[`Validation > Invalid @fulltext directive 1`] = `
     IncludeMissingEntityField:
     - @fulltext argument include must have two fields, 'entity' and 'fields'
     InvalidIncludeArgumentOther:
-    - @fulltext argument 'include > other' must be be one of: entity, fields
+    - @fulltext argument 'include > other' must be one of: entity, fields
     IncludeFieldsMustBeList:
     - @fulltext argument 'include > fields' must be a list
     Other:
diff --git a/packages/cli/tests/cli/validation/invalid-fulltext-directive.stderr b/packages/cli/tests/cli/validation/invalid-fulltext-directive.stderr
index 8fe71283..f7fa7d41 100644
--- a/packages/cli/tests/cli/validation/invalid-fulltext-directive.stderr
+++ b/packages/cli/tests/cli/validation/invalid-fulltext-directive.stderr
@@ -25,7 +25,7 @@
     IncludeMissingEntityField:
     - @fulltext argument include must have two fields, 'entity' and 'fields'
     InvalidIncludeArgumentOther:
-    - @fulltext argument 'include > other' must be be one of: entity, fields
+    - @fulltext argument 'include > other' must be one of: entity, fields
     IncludeFieldsMustBeList:
     - @fulltext argument 'include > fields' must be a list
     Other: