diff --git a/.changeset/cyan-radios-relax.md b/.changeset/cyan-radios-relax.md
new file mode 100644
index 000000000..ec408d6cd
--- /dev/null
+++ b/.changeset/cyan-radios-relax.md
@@ -0,0 +1,18 @@
+---
+'@0xsequence/api': patch
+'@0xsequence/builder': patch
+'@0xsequence/guard': patch
+'@0xsequence/identity-instrument': patch
+'@0xsequence/indexer': patch
+'@0xsequence/marketplace': patch
+'@0xsequence/metadata': patch
+'@0xsequence/relayer': patch
+'@0xsequence/userdata': patch
+'@0xsequence/abi': patch
+'@0xsequence/wallet-core': patch
+'@0xsequence/dapp-client': patch
+'@0xsequence/wallet-primitives': patch
+'@0xsequence/wallet-wdk': patch
+---
+
+Fix signer 404 error, minor fixes
diff --git a/.changeset/pre.json b/.changeset/pre.json
index a92fc72b5..73184ae44 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -4,23 +4,30 @@
"initialVersions": {
"docs": "0.1.0",
"web": "0.1.0",
- "@0xsequence/api": "3.0.0-beta.4",
- "@0xsequence/builder": "3.0.0-beta.4",
- "@0xsequence/guard": "3.0.0-beta.4",
- "@0xsequence/identity-instrument": "3.0.0-beta.4",
- "@0xsequence/indexer": "3.0.0-beta.4",
- "@0xsequence/marketplace": "3.0.0-beta.4",
- "@0xsequence/metadata": "3.0.0-beta.4",
- "@0xsequence/relayer": "3.0.0-beta.4",
- "@0xsequence/userdata": "3.0.0-beta.4",
- "@0xsequence/abi": "3.0.0-beta.4",
- "@0xsequence/wallet-core": "3.0.0-beta.4",
- "@0xsequence/dapp-client": "3.0.0-beta.4",
- "@0xsequence/wallet-primitives": "3.0.0-beta.4",
- "@0xsequence/wallet-wdk": "3.0.0-beta.4",
- "@repo/eslint-config": "0.0.1-beta.0",
- "@repo/typescript-config": "0.0.1-beta.0",
- "@repo/ui": "0.0.1-beta.0"
+ "@0xsequence/api": "3.0.0-beta.5",
+ "@0xsequence/builder": "3.0.0-beta.5",
+ "@0xsequence/guard": "3.0.0-beta.5",
+ "@0xsequence/identity-instrument": "3.0.0-beta.5",
+ "@0xsequence/indexer": "3.0.0-beta.5",
+ "@0xsequence/marketplace": "3.0.0-beta.5",
+ "@0xsequence/metadata": "3.0.0-beta.5",
+ "@0xsequence/relayer": "3.0.0-beta.5",
+ "@0xsequence/userdata": "3.0.0-beta.5",
+ "@0xsequence/abi": "3.0.0-beta.5",
+ "@0xsequence/wallet-core": "3.0.0-beta.5",
+ "@0xsequence/dapp-client": "3.0.0-beta.5",
+ "@0xsequence/wallet-primitives": "3.0.0-beta.5",
+ "@0xsequence/wallet-wdk": "3.0.0-beta.5",
+ "@repo/eslint-config": "0.0.1-beta.1",
+ "@repo/typescript-config": "0.0.1-beta.1",
+ "@repo/ui": "0.0.1-beta.1"
},
- "changesets": ["goofy-laws-serve", "open-toes-marry", "plain-feet-stare", "wild-feet-carry", "wise-heads-buy"]
+ "changesets": [
+ "cyan-radios-relax",
+ "goofy-laws-serve",
+ "open-toes-marry",
+ "plain-feet-stare",
+ "wild-feet-carry",
+ "wise-heads-buy"
+ ]
}
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 709c9a747..ad53a8e49 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -8,7 +8,7 @@ executors:
- image: cimg/base:stable
auth:
# ensure you have first added these secrets
- # visit app.circleci.com/settings/project/github/Dargon789/hardhat-project/environment-variables
+ # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables
username: $DOCKER_HUB_USER
password: $DOCKER_HUB_PASSWORD
jobs:
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index dd84ea782..81c7b58d8 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -2,7 +2,7 @@
name: Bug report
about: Create a report to help us improve
title: ''
-labels: ''
+labels: 'bug'
assignees: ''
---
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index bbcbbe7d6..36014cde5 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -2,7 +2,7 @@
name: Feature request
about: Suggest an idea for this project
title: ''
-labels: ''
+labels: 'enhancement'
assignees: ''
---
diff --git a/.github/workflows/Publish-Dists.yml b/.github/workflows/Publish-Dists.yml
new file mode 100644
index 000000000..59b761d5a
--- /dev/null
+++ b/.github/workflows/Publish-Dists.yml
@@ -0,0 +1,94 @@
+name: Publish Dists for Packages
+
+permissions:
+ contents: write
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - uses: ./.github/actions/install-dependencies
+
+ - name: Build package
+ run: pnpm run build
+
+ - name: Prepare dist branch
+ run: |
+ PACKAGES=("services/guard" "services/identity-instrument" "services/relayer" "wallet/core" "wallet/primitives" "wallet/wdk" "wallet/dapp-client")
+
+ for PACKAGE in "${PACKAGES[@]}"; do
+ BRANCH="dists/$PACKAGE"
+ PKG_DIR="packages/$PACKAGE"
+
+ echo "š¦ Publishing $PACKAGE to $BRANCH"
+
+ mkdir -p "/tmp/$PACKAGE"
+ cp -r "$PKG_DIR"/. "/tmp/$PACKAGE" || true
+
+ cd /tmp/$PACKAGE
+ git init
+ git checkout -b $BRANCH
+
+ git config user.name "github-actions"
+ git config user.email "actions@github.com"
+
+ echo "š§ Rewriting workspace: deps in package.json..."
+ node -e '
+ const fs = require("fs");
+ const path = require("path");
+ const pkgPath = path.resolve("package.json");
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
+ const repo = "github:0xsequence/sequence.js";
+
+ const versions = {
+ "@0xsequence/guard": `${repo}#dists/services/guard`,
+ "@0xsequence/identity-instrument": `${repo}#dists/services/identity-instrument`,
+ "@0xsequence/relayer": `${repo}#dists/services/relayer`,
+ "@0xsequence/wallet-core": `${repo}#dists/wallet/core`,
+ "@0xsequence/wallet-primitives": `${repo}#dists/wallet/primitives`,
+ "@0xsequence/wallet-wdk": `${repo}#dists/wallet/wdk`,
+ };
+
+ const rewrite = (deps = {}) => {
+ for (const k in deps) {
+ if (deps[k].startsWith("workspace:")) {
+ const version = versions[k];
+
+ if (!version) {
+ console.warn(`No version found for ${k}, skipping...`);
+ continue;
+ }
+
+ deps[k] = version;
+ console.log(`ā ${k} ā ${deps[k]}`);
+ }
+ }
+ };
+
+ ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].forEach((field) => {
+ if (pkg[field]) {
+ rewrite(pkg[field]);
+ }
+ });
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
+ '
+
+ git add .
+ git commit -m "Build: publish $PACKAGE dist"
+
+ git remote add origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git
+ git push -f origin HEAD:$BRANCH
+
+ cd -
+ done
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 3003e531e..74dbc3f4d 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -23,7 +23,7 @@ jobs:
tests:
name: Run all tests
runs-on: ubuntu-latest
- needs: [build]
+ needs: [install]
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/install-dependencies
@@ -31,9 +31,9 @@ jobs:
uses: foundry-rs/foundry-toolchain@v1
with:
version: nightly
+ # Fork latest mainnet state
- name: Start Anvil in background
- run: anvil --fork-url https://nodes.sequence.app/arbitrum &
- - run: pnpm build
+ run: anvil --fork-url https://reth-ethereum.ithaca.xyz/nodes.sequence.app/rpc &
- run: pnpm test
# NOTE: if you'd like to see example of how to run
diff --git a/README.md b/README.md
index 4c663ccf8..93f43b66e 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,275 @@
-## sequence.js v3 core libraries and SDK
+
+
-**NOTE: please see [v2](https://github.com/0xsequence/sequence.js/tree/v2) branch for sequence.js 2.x.x**
+
+
+
+
+
+
+
+
+
+
+
+
+ Reactive primitives for Ethereum apps (https://sequence.xyz/)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
---
-Sequence v3 core libraries and [wallet-contracts-v3](https://github.com/0xsequence/wallet-contracts-v3) SDK.
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
+
+## Community
+
+For help, discussion about best practices, or any other conversation that would benefit from being searchable:
-## Packages
+[Discuss Wagmi on GitHub](https://github.com/wevm/wagmi/discussions)
-- `@0xsequence/wallet-primitives`: stateless low-level utilities specifically for interacting directly with sequence wallet's smart contracts
-- `@0xsequence/wallet-core`: higher level utilities for creating and using sequence wallets
-- `@0xsequence/wallet-wdk`: all-in-one wallet development kit for building a sequence wallet product
+For casual chit-chat with others using the framework:
-## Development
+[Join the Wagmi Discord](https://discord.gg/SghfWBKexF)
-### Getting Started
+## Contributing
-1. Install dependencies:
- `pnpm install`
+Contributions to Wagmi are greatly appreciated! If you're interested in contributing to Wagmi, please read the [Contributing Guide](https://wagmi.sh/dev/contributing) **before submitting a pull request**.
-2. Build all packages:
- `pnpm build`
+## Sponsors
-### Development Workflow
+If you find Wagmi useful or use it for work, please consider [sponsoring Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support). Thank you š
-- Run development mode across all packages:
- `pnpm dev`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-- Run tests:
- `pnpm test`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- > **Note:** Tests require [anvil](https://github.com/foundry-rs/foundry/tree/master/anvil) and [forge](https://github.com/foundry-rs/foundry) to be installed. You can run a local anvil instance using `pnpm run test:anvil`.
+[Sponsor Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support_bottom)
-- Linting and formatting is enforced via git hooks
+
+
-## License
+
+
+
+
+
+
+
-Apache-2.0
diff --git a/extras/docs/package.json b/extras/docs/package.json
index abadc74fd..d5fedf082 100644
--- a/extras/docs/package.json
+++ b/extras/docs/package.json
@@ -12,18 +12,18 @@
"clean": "rimraf .next"
},
"dependencies": {
- "@repo/ui": "workspace:*",
- "next": "^15.5.9",
- "react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "@repo/ui": "workspace:^",
+ "next": "^16.1.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20.17.57",
- "@types/react": "^19.2.6",
+ "@repo/eslint-config": "workspace:^",
+ "@repo/typescript-config": "workspace:^",
+ "@types/node": "^25.0.2",
+ "@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
- "eslint": "^9.28.0",
- "typescript": "^5.8.3"
+ "eslint": "^9.39.2",
+ "typescript": "^5.9.3"
}
}
diff --git a/extras/web/package.json b/extras/web/package.json
index 3b57fed2b..41ef60469 100644
--- a/extras/web/package.json
+++ b/extras/web/package.json
@@ -12,18 +12,18 @@
"clean": "rimraf .next"
},
"dependencies": {
- "@repo/ui": "workspace:*",
- "next": "^15.5.9",
- "react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "@repo/ui": "workspace:^",
+ "next": "^16.1.1",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
},
"devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
- "@types/node": "^20.17.57",
- "@types/react": "^19.2.6",
+ "@repo/eslint-config": "workspace:^",
+ "@repo/typescript-config": "workspace:^",
+ "@types/node": "^25.0.2",
+ "@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
- "eslint": "^9.28.0",
- "typescript": "^5.8.3"
+ "eslint": "^9.39.2",
+ "typescript": "^5.9.3"
}
}
diff --git a/package.json b/package.json
index 483cd0936..53a8caae3 100644
--- a/package.json
+++ b/package.json
@@ -20,12 +20,12 @@
"deps:fix": "syncpack fix-mismatches"
},
"devDependencies": {
- "@changesets/cli": "^2.29.4",
- "lefthook": "^2.0.4",
- "prettier": "^3.5.3",
+ "@changesets/cli": "^2.29.8",
+ "lefthook": "^2.0.12",
+ "prettier": "^3.7.4",
"rimraf": "^6.1.2",
"syncpack": "^13.0.4",
- "turbo": "^2.6.1",
+ "turbo": "^2.6.3",
"typescript": "^5.9.3"
},
"pnpm": {
@@ -40,7 +40,9 @@
"syncpack": {
"source": [
"package.json",
- "packages/**/package.json"
+ "packages/**/package.json",
+ "extras/**/package.json",
+ "repo/**/package.json"
],
"versionGroups": [
{
diff --git a/packages/services/api/CHANGELOG.md b/packages/services/api/CHANGELOG.md
index 610642b4c..11007faa9 100644
--- a/packages/services/api/CHANGELOG.md
+++ b/packages/services/api/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/api
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/api/package.json b/packages/services/api/package.json
index 20fc284b0..6191c7940 100644
--- a/packages/services/api/package.json
+++ b/packages/services/api/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/api",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "api sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/api",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/services/builder/CHANGELOG.md b/packages/services/builder/CHANGELOG.md
index 9dda5364d..2877d5538 100644
--- a/packages/services/builder/CHANGELOG.md
+++ b/packages/services/builder/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/builder
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/builder/package.json b/packages/services/builder/package.json
index 5f20f458b..de33fd730 100644
--- a/packages/services/builder/package.json
+++ b/packages/services/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/builder",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "builder sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/builder",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/services/guard/CHANGELOG.md b/packages/services/guard/CHANGELOG.md
index 9ba2ad5f4..7adaddd55 100644
--- a/packages/services/guard/CHANGELOG.md
+++ b/packages/services/guard/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/guard
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/guard/package.json b/packages/services/guard/package.json
index 225211817..5c93bdfc1 100644
--- a/packages/services/guard/package.json
+++ b/packages/services/guard/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/guard",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "guard sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/guard",
"author": "Sequence Platforms Inc.",
@@ -25,9 +25,9 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"ox": "^0.9.17"
diff --git a/packages/services/identity-instrument/CHANGELOG.md b/packages/services/identity-instrument/CHANGELOG.md
index 3ecd8814c..866782714 100644
--- a/packages/services/identity-instrument/CHANGELOG.md
+++ b/packages/services/identity-instrument/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/identity-instrument
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/identity-instrument/package.json b/packages/services/identity-instrument/package.json
index b025b75c8..026b8c291 100644
--- a/packages/services/identity-instrument/package.json
+++ b/packages/services/identity-instrument/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/identity-instrument",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"license": "Apache-2.0",
"type": "module",
"publishConfig": {
@@ -20,9 +20,9 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"json-canonicalize": "^2.0.0",
diff --git a/packages/services/identity-instrument/src/index.ts b/packages/services/identity-instrument/src/index.ts
index f7b477b6c..12eb0f0ff 100644
--- a/packages/services/identity-instrument/src/index.ts
+++ b/packages/services/identity-instrument/src/index.ts
@@ -65,7 +65,7 @@ export class IdentityInstrument {
keyType: KeyType.Ethereum_Secp256k1,
},
digest: Hex.fromBytes(digest),
- nonce: Hex.fromNumber(Date.now()),
+ nonce: Hex.random(16),
}
const res = await this.rpc.sign({
params,
diff --git a/packages/services/indexer/CHANGELOG.md b/packages/services/indexer/CHANGELOG.md
index 3978b95ac..e320c4307 100644
--- a/packages/services/indexer/CHANGELOG.md
+++ b/packages/services/indexer/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/indexer
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/indexer/package.json b/packages/services/indexer/package.json
index 03ec99a79..cb91b590c 100644
--- a/packages/services/indexer/package.json
+++ b/packages/services/indexer/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/indexer",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "indexer sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/indexer",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/services/marketplace/CHANGELOG.md b/packages/services/marketplace/CHANGELOG.md
index 2b450ab82..6e33420f0 100644
--- a/packages/services/marketplace/CHANGELOG.md
+++ b/packages/services/marketplace/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/marketplace
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/marketplace/package.json b/packages/services/marketplace/package.json
index b454b44ae..58959af0d 100644
--- a/packages/services/marketplace/package.json
+++ b/packages/services/marketplace/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/marketplace",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "marketplace sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/marketplace",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/services/metadata/CHANGELOG.md b/packages/services/metadata/CHANGELOG.md
index f783d7ba3..4fc3e61cc 100644
--- a/packages/services/metadata/CHANGELOG.md
+++ b/packages/services/metadata/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/metadata
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/metadata/package.json b/packages/services/metadata/package.json
index b31905d3a..9218059ef 100644
--- a/packages/services/metadata/package.json
+++ b/packages/services/metadata/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/metadata",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"publishConfig": {
"access": "public"
},
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/services/relayer/CHANGELOG.md b/packages/services/relayer/CHANGELOG.md
index c4e639bfd..00efdf828 100644
--- a/packages/services/relayer/CHANGELOG.md
+++ b/packages/services/relayer/CHANGELOG.md
@@ -1,5 +1,13 @@
# @0xsequence/relayer
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+- Updated dependencies
+ - @0xsequence/wallet-primitives@3.0.0-beta.6
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/relayer/package.json b/packages/services/relayer/package.json
index 9778d1e8e..9e49fe299 100644
--- a/packages/services/relayer/package.json
+++ b/packages/services/relayer/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/relayer",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"type": "module",
"publishConfig": {
"access": "public"
@@ -27,9 +27,9 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"@0xsequence/wallet-primitives": "workspace:^",
diff --git a/packages/services/userdata/CHANGELOG.md b/packages/services/userdata/CHANGELOG.md
index 0079ca325..b28ab5220 100644
--- a/packages/services/userdata/CHANGELOG.md
+++ b/packages/services/userdata/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/userdata
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/services/userdata/package.json b/packages/services/userdata/package.json
index dedb4e953..3d2fd79e9 100644
--- a/packages/services/userdata/package.json
+++ b/packages/services/userdata/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/userdata",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "userdata sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/services/userdata",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/utils/abi/CHANGELOG.md b/packages/utils/abi/CHANGELOG.md
index 447d70ed1..92b0978a1 100644
--- a/packages/utils/abi/CHANGELOG.md
+++ b/packages/utils/abi/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/abi
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/utils/abi/package.json b/packages/utils/abi/package.json
index ac07e0f0a..fdf2e38c2 100644
--- a/packages/utils/abi/package.json
+++ b/packages/utils/abi/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/abi",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"description": "abi sub-package for Sequence",
"repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/utils/abi",
"author": "Sequence Platforms Inc.",
@@ -22,7 +22,7 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"typescript": "^5.9.3"
}
}
diff --git a/packages/wallet/core/CHANGELOG.md b/packages/wallet/core/CHANGELOG.md
index 940b7e413..0ff25b21a 100644
--- a/packages/wallet/core/CHANGELOG.md
+++ b/packages/wallet/core/CHANGELOG.md
@@ -1,5 +1,15 @@
# @0xsequence/wallet-core
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+- Updated dependencies
+ - @0xsequence/guard@3.0.0-beta.6
+ - @0xsequence/relayer@3.0.0-beta.6
+ - @0xsequence/wallet-primitives@3.0.0-beta.6
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/wallet/core/package.json b/packages/wallet/core/package.json
index 682ed0d06..b7e7b463f 100644
--- a/packages/wallet/core/package.json
+++ b/packages/wallet/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/wallet-core",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"license": "Apache-2.0",
"type": "module",
"publishConfig": {
@@ -23,12 +23,12 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
- "@vitest/coverage-v8": "^4.0.14",
+ "@types/node": "^25.0.2",
+ "@vitest/coverage-v8": "^4.0.15",
"dotenv": "^17.2.3",
"fake-indexeddb": "^6.2.5",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"@0xsequence/guard": "workspace:^",
diff --git a/packages/wallet/dapp-client/CHANGELOG.md b/packages/wallet/dapp-client/CHANGELOG.md
index 3c4d46618..e7feb8989 100644
--- a/packages/wallet/dapp-client/CHANGELOG.md
+++ b/packages/wallet/dapp-client/CHANGELOG.md
@@ -1,5 +1,16 @@
# @0xsequence/dapp-client
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+- Updated dependencies
+ - @0xsequence/guard@3.0.0-beta.6
+ - @0xsequence/relayer@3.0.0-beta.6
+ - @0xsequence/wallet-core@3.0.0-beta.6
+ - @0xsequence/wallet-primitives@3.0.0-beta.6
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/wallet/dapp-client/package.json b/packages/wallet/dapp-client/package.json
index d67d1ea7d..40a6659c5 100644
--- a/packages/wallet/dapp-client/package.json
+++ b/packages/wallet/dapp-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/dapp-client",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"license": "Apache-2.0",
"type": "module",
"publishConfig": {
@@ -21,13 +21,13 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
- "@vitest/coverage-v8": "^4.0.14",
+ "@types/node": "^25.0.2",
+ "@vitest/coverage-v8": "^4.0.15",
"dotenv": "^17.2.3",
"fake-indexeddb": "^6.2.5",
- "happy-dom": "^20.0.10",
+ "happy-dom": "^20.0.11",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"@0xsequence/guard": "workspace:^",
diff --git a/packages/wallet/primitives-cli/package.json b/packages/wallet/primitives-cli/package.json
index ee00f2a2a..9911dca32 100644
--- a/packages/wallet/primitives-cli/package.json
+++ b/packages/wallet/primitives-cli/package.json
@@ -21,12 +21,12 @@
}
},
"devDependencies": {
- "@repo/eslint-config": "workspace:*",
+ "@repo/eslint-config": "workspace:^",
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
+ "@types/node": "^25.0.2",
"@types/yargs": "^17.0.35",
"concurrently": "^9.2.1",
- "esbuild": "^0.27.0",
+ "esbuild": "^0.27.2",
"nodemon": "^3.1.11",
"typescript": "^5.9.3"
},
diff --git a/packages/wallet/primitives-cli/src/subcommands/server.ts b/packages/wallet/primitives-cli/src/subcommands/server.ts
index 29c5e1118..ab999c454 100644
--- a/packages/wallet/primitives-cli/src/subcommands/server.ts
+++ b/packages/wallet/primitives-cli/src/subcommands/server.ts
@@ -327,7 +327,8 @@ async function handleHttpRequest(req: IncomingMessage, res: ServerResponse, debu
} catch (error) {
if (!silent) console.log(`[${new Date().toISOString()}] JSON parse error:`, error)
res.statusCode = 400
- res.end(JSON.stringify(errorResponse(undefined, -32700, 'Parse error', String(error))))
+ // Return a generic parse error without exposing internal error details to the client
+ res.end(JSON.stringify(errorResponse(undefined, -32700, 'Parse error')))
return
}
diff --git a/packages/wallet/primitives/CHANGELOG.md b/packages/wallet/primitives/CHANGELOG.md
index 5e9e2c183..c98111672 100644
--- a/packages/wallet/primitives/CHANGELOG.md
+++ b/packages/wallet/primitives/CHANGELOG.md
@@ -1,5 +1,11 @@
# @0xsequence/wallet-primitives
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/wallet/primitives/package.json b/packages/wallet/primitives/package.json
index 83f97b33c..08e2b41ba 100644
--- a/packages/wallet/primitives/package.json
+++ b/packages/wallet/primitives/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/wallet-primitives",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"license": "Apache-2.0",
"type": "module",
"publishConfig": {
@@ -23,9 +23,9 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@vitest/coverage-v8": "^4.0.14",
+ "@vitest/coverage-v8": "^4.0.15",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"ox": "^0.9.17"
diff --git a/packages/wallet/wdk/CHANGELOG.md b/packages/wallet/wdk/CHANGELOG.md
index ea802f9c4..6f2094f85 100644
--- a/packages/wallet/wdk/CHANGELOG.md
+++ b/packages/wallet/wdk/CHANGELOG.md
@@ -1,5 +1,17 @@
# @0xsequence/wallet-wdk
+## 3.0.0-beta.6
+
+### Patch Changes
+
+- Fix signer 404 error, minor fixes
+- Updated dependencies
+ - @0xsequence/guard@3.0.0-beta.6
+ - @0xsequence/identity-instrument@3.0.0-beta.6
+ - @0xsequence/relayer@3.0.0-beta.6
+ - @0xsequence/wallet-core@3.0.0-beta.6
+ - @0xsequence/wallet-primitives@3.0.0-beta.6
+
## 3.0.0-beta.5
### Patch Changes
diff --git a/packages/wallet/wdk/package.json b/packages/wallet/wdk/package.json
index 87d1a45a5..069ea2491 100644
--- a/packages/wallet/wdk/package.json
+++ b/packages/wallet/wdk/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xsequence/wallet-wdk",
- "version": "3.0.0-beta.5",
+ "version": "3.0.0-beta.6",
"license": "Apache-2.0",
"type": "module",
"publishConfig": {
@@ -24,13 +24,13 @@
},
"devDependencies": {
"@repo/typescript-config": "workspace:^",
- "@types/node": "^24.10.1",
- "@vitest/coverage-v8": "^4.0.14",
+ "@types/node": "^25.0.2",
+ "@vitest/coverage-v8": "^4.0.15",
"dotenv": "^17.2.3",
"fake-indexeddb": "^6.2.5",
- "happy-dom": "^20.0.10",
+ "happy-dom": "^20.0.11",
"typescript": "^5.9.3",
- "vitest": "^4.0.14"
+ "vitest": "^4.0.15"
},
"dependencies": {
"@0xsequence/guard": "workspace:^",
diff --git a/packages/wallet/wdk/src/sequence/manager.ts b/packages/wallet/wdk/src/sequence/manager.ts
index 9fe04d13c..ba27116cf 100644
--- a/packages/wallet/wdk/src/sequence/manager.ts
+++ b/packages/wallet/wdk/src/sequence/manager.ts
@@ -37,6 +37,7 @@ export type ManagerOptions = {
extensions?: Extensions.Extensions
context?: Context.Context
+ context4337?: Context.Context
guest?: Address.Address
encryptedPksDb?: CoreSigners.Pk.Encrypted.EncryptedPksDb
@@ -58,6 +59,8 @@ export type ManagerOptions = {
guardUrl?: string
guardAddresses?: Record
+ nonWitnessableSigners?: Address.Address[]
+
// The default guard topology MUST have a placeholder address for the guard address
defaultGuardTopology?: Config.Topology
defaultRecoverySettings?: RecoverySettings
@@ -122,6 +125,8 @@ export const ManagerOptionsDefaults = {
},
bundlers: [],
+ nonWitnessableSigners: [] as Address.Address[],
+
guardUrl: 'https://guard.sequence.app',
guardAddresses: {
wallet: '0x26f3D30F41FA897309Ae804A2AFf15CEb1dA5742',
@@ -182,11 +187,41 @@ export const CreateWalletOptionsDefaults = {
}
export function applyManagerOptionsDefaults(options?: ManagerOptions) {
- return {
+ const merged = {
...ManagerOptionsDefaults,
...options,
identity: { ...ManagerOptionsDefaults.identity, ...options?.identity },
}
+
+ // Merge and normalize non-witnessable signers.
+ // We always include the sessions extension address for the active extensions set.
+ const nonWitnessable = new Set()
+ for (const address of ManagerOptionsDefaults.nonWitnessableSigners ?? []) {
+ nonWitnessable.add(address.toLowerCase())
+ }
+ for (const address of options?.nonWitnessableSigners ?? []) {
+ nonWitnessable.add(address.toLowerCase())
+ }
+ nonWitnessable.add(merged.extensions.sessions.toLowerCase())
+
+ // Include static signer leaves from the guard topology (e.g. recovery guard signer),
+ // but ignore the placeholder address that is later replaced per-role.
+ if (merged.defaultGuardTopology) {
+ const guardTopologySigners = Config.getSigners(merged.defaultGuardTopology)
+ for (const signer of guardTopologySigners.signers) {
+ if (Address.isEqual(signer, Constants.PlaceholderAddress)) {
+ continue
+ }
+ nonWitnessable.add(signer.toLowerCase())
+ }
+ for (const signer of guardTopologySigners.sapientSigners) {
+ nonWitnessable.add(signer.address.toLowerCase())
+ }
+ }
+
+ merged.nonWitnessableSigners = Array.from(nonWitnessable) as Address.Address[]
+
+ return merged
}
export type RecoverySettings = {
@@ -220,6 +255,8 @@ export type Sequence = {
readonly relayers: Relayer.Relayer[]
readonly bundlers: Bundler.Bundler[]
+ readonly nonWitnessableSigners: ReadonlySet
+
readonly defaultGuardTopology: Config.Topology
readonly defaultRecoverySettings: RecoverySettings
@@ -407,6 +444,10 @@ export class Manager {
relayers,
bundlers: ops.bundlers,
+ nonWitnessableSigners: new Set(
+ (ops.nonWitnessableSigners ?? []).map((address) => address.toLowerCase() as Address.Address),
+ ),
+
defaultGuardTopology: ops.defaultGuardTopology,
defaultRecoverySettings: ops.defaultRecoverySettings,
diff --git a/packages/wallet/wdk/src/sequence/signers.ts b/packages/wallet/wdk/src/sequence/signers.ts
index cf79c43c7..c2002d2d9 100644
--- a/packages/wallet/wdk/src/sequence/signers.ts
+++ b/packages/wallet/wdk/src/sequence/signers.ts
@@ -48,6 +48,19 @@ export class Signers {
return Kinds.Guard
}
+ // Passkeys are a sapient signer module: the address alone identifies the kind.
+ // Metadata (credential id, public key, etc.) is loaded later by the PasskeysHandler
+ // via the witness payload, so we can skip the witness probe here.
+ if (Address.isEqual(this.shared.sequence.extensions.passkeys, address)) {
+ return Kinds.LoginPasskey
+ }
+
+ // Some signers are known to never publish a witness record (e.g. module signers).
+ // Skip probing the Sessions/Witness endpoint for them.
+ if (this.shared.sequence.nonWitnessableSigners.has(address.toLowerCase() as Address.Address)) {
+ return undefined
+ }
+
// We need to use the state provider (and witness) this will tell us the kind of signer
// NOTICE: This looks expensive, but this operation should be cached by the state provider
const witness = await (imageHash
diff --git a/packages/wallet/wdk/test/authcode-pkce.test.ts b/packages/wallet/wdk/test/authcode-pkce.test.ts
index 2e62b8afd..c69e66d71 100644
--- a/packages/wallet/wdk/test/authcode-pkce.test.ts
+++ b/packages/wallet/wdk/test/authcode-pkce.test.ts
@@ -1,10 +1,10 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { Address, Hex, Bytes } from 'ox'
import * as Identity from '@0xsequence/identity-instrument'
-import { AuthCodePkceHandler } from '../src/sequence/handlers/authcode-pkce'
-import { Signatures } from '../src/sequence/signatures'
-import * as Db from '../src/dbs'
-import { IdentitySigner } from '../src/identity/signer'
+import { AuthCodePkceHandler } from '../src/sequence/handlers/authcode-pkce.js'
+import { Signatures } from '../src/sequence/signatures.js'
+import * as Db from '../src/dbs/index.js'
+import { IdentitySigner } from '../src/identity/signer.js'
describe('AuthCodePkceHandler', () => {
let handler: AuthCodePkceHandler
diff --git a/packages/wallet/wdk/test/authcode.test.ts b/packages/wallet/wdk/test/authcode.test.ts
index 121a03348..4874e475b 100644
--- a/packages/wallet/wdk/test/authcode.test.ts
+++ b/packages/wallet/wdk/test/authcode.test.ts
@@ -2,11 +2,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { Address, Hex, Bytes } from 'ox'
import { Network, Payload } from '@0xsequence/wallet-primitives'
import { IdentityInstrument, IdentityType, KeyType, AuthCodeChallenge } from '@0xsequence/identity-instrument'
-import { AuthCodeHandler } from '../src/sequence/handlers/authcode'
-import { Signatures } from '../src/sequence/signatures'
-import * as Db from '../src/dbs'
-import { IdentitySigner } from '../src/identity/signer'
-import { BaseSignatureRequest } from '../src/sequence/types/signature-request'
+import { AuthCodeHandler } from '../src/sequence/handlers/authcode.js'
+import { Signatures } from '../src/sequence/signatures.js'
+import * as Db from '../src/dbs/index.js'
+import { IdentitySigner } from '../src/identity/signer.js'
+import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js'
// Mock the global crypto API
const mockCryptoSubtle = {
@@ -254,7 +254,7 @@ describe('AuthCodeHandler', () => {
// Verify commitment was saved
expect(mockAuthCommitmentsSet).toHaveBeenCalledOnce()
- const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(commitmentCall.kind).toBe('google-pkce')
expect(commitmentCall.signer).toBe(signer)
@@ -279,7 +279,7 @@ describe('AuthCodeHandler', () => {
const result = await authCodeHandler.commitAuth('/target', false, customState)
// Verify commitment uses custom state
- const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(commitmentCall.id).toBe(customState)
expect(result).toContain(`state=${customState}`)
})
@@ -287,7 +287,7 @@ describe('AuthCodeHandler', () => {
it('Should generate random state when not provided', async () => {
const result = await authCodeHandler.commitAuth('/target', false)
- const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(commitmentCall.id).toBeDefined()
expect(typeof commitmentCall.id).toBe('string')
expect(commitmentCall.id.startsWith('0x')).toBe(true)
@@ -316,7 +316,7 @@ describe('AuthCodeHandler', () => {
it('Should create commitment without signer', async () => {
const result = await authCodeHandler.commitAuth('/target', true)
- const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(commitmentCall.signer).toBeUndefined()
expect(commitmentCall.isSignUp).toBe(true)
})
@@ -348,12 +348,12 @@ describe('AuthCodeHandler', () => {
// Verify commitVerifier was called
expect(mockCommitVerifier).toHaveBeenCalledOnce()
- const commitVerifierCall = mockCommitVerifier.mock.calls[0]
+ const commitVerifierCall = mockCommitVerifier.mock.calls[0]!
expect(commitVerifierCall[1]).toBeInstanceOf(AuthCodeChallenge)
// Verify completeAuth was called
expect(mockCompleteAuth).toHaveBeenCalledOnce()
- const completeAuthCall = mockCompleteAuth.mock.calls[0]
+ const completeAuthCall = mockCompleteAuth.mock.calls[0]!
expect(completeAuthCall[1]).toBeInstanceOf(AuthCodeChallenge)
// Verify results
@@ -490,7 +490,7 @@ describe('AuthCodeHandler', () => {
expect(window.location.href).toContain('https://accounts.google.com/o/oauth2/v2/auth')
expect(mockAuthCommitmentsSet).toHaveBeenCalledOnce()
- const commitmentCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const commitmentCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(commitmentCall.target).toBe(window.location.pathname)
expect(commitmentCall.isSignUp).toBe(false)
expect(commitmentCall.signer).toBe(testWallet)
@@ -711,14 +711,14 @@ describe('AuthCodeHandler', () => {
// Test signup flow
await authCodeHandler.commitAuth('/signup-target', true, 'signup-state')
- const signupCall = mockAuthCommitmentsSet.mock.calls[0][0]
+ const signupCall = mockAuthCommitmentsSet.mock.calls[0]![0]!
expect(signupCall.isSignUp).toBe(true)
expect(signupCall.target).toBe('/signup-target')
// Test login flow
await authCodeHandler.commitAuth('/login-target', false, 'login-state')
- const loginCall = mockAuthCommitmentsSet.mock.calls[1][0]
+ const loginCall = mockAuthCommitmentsSet.mock.calls[1]![0]!
expect(loginCall.isSignUp).toBe(false)
expect(loginCall.target).toBe('/login-target')
})
diff --git a/packages/wallet/wdk/test/constants.ts b/packages/wallet/wdk/test/constants.ts
index 14b099614..01dff3b50 100644
--- a/packages/wallet/wdk/test/constants.ts
+++ b/packages/wallet/wdk/test/constants.ts
@@ -1,9 +1,10 @@
import { config as dotenvConfig } from 'dotenv'
import { Abi, Address, Provider, RpcTransport } from 'ox'
-import { Manager, ManagerOptions, ManagerOptionsDefaults } from '../src/sequence'
-import { mockEthereum } from './setup'
-import { Signers as CoreSigners, State, Relayer } from '@0xsequence/wallet-core'
-import * as Db from '../src/dbs'
+import { Manager, ManagerOptions, ManagerOptionsDefaults } from '../src/sequence/index.js'
+import { mockEthereum } from './setup.js'
+import { Signers as CoreSigners, State, Bundler } from '@0xsequence/wallet-core'
+import { Relayer } from '@0xsequence/relayer'
+import * as Db from '../src/dbs/index.js'
import { Network } from '@0xsequence/wallet-primitives'
const envFile = process.env.CI ? '.env.test' : '.env.test.local'
@@ -81,16 +82,16 @@ export function newRemoteManager(
: `_testrun_${testIdCounter}`
let relayers: Relayer.Relayer[] = []
- let bundlers: Relayer.Bundler[] = []
+ let bundlers: Bundler.Bundler[] = []
if (remoteManagerOptions.network.relayerPk) {
const provider = Provider.from(RpcTransport.fromHttp(remoteManagerOptions.network.rpcUrl))
- relayers.push(new Relayer.Standard.PkRelayer(remoteManagerOptions.network.relayerPk as `0x${string}`, provider))
+ relayers.push(new Relayer.PkRelayer(remoteManagerOptions.network.relayerPk as `0x${string}`, provider))
}
if (remoteManagerOptions.network.bundlerUrl) {
bundlers.push(
- new Relayer.Bundlers.PimlicoBundler(
+ new Bundler.Bundlers.PimlicoBundler(
remoteManagerOptions.network.bundlerUrl,
Provider.from(RpcTransport.fromHttp(remoteManagerOptions.network.rpcUrl)),
),
diff --git a/packages/wallet/wdk/test/guard.test.ts b/packages/wallet/wdk/test/guard.test.ts
index 44e7e2cb5..8614de6c2 100644
--- a/packages/wallet/wdk/test/guard.test.ts
+++ b/packages/wallet/wdk/test/guard.test.ts
@@ -1,11 +1,11 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { Manager } from '../src/sequence'
-import { GuardHandler } from '../src/sequence/handlers/guard'
+import { Manager } from '../src/sequence/index.js'
+import { GuardHandler } from '../src/sequence/handlers/guard.js'
import { Address, Bytes, Hex, TypedData } from 'ox'
import { Config, Constants, Network, Payload } from '@0xsequence/wallet-primitives'
-import { Kinds } from '../src/sequence/types/signer'
-import { newManager } from './constants'
-import { GuardRole, Guards } from '../src/sequence/guards'
+import { Kinds } from '../src/sequence/types/signer.js'
+import { newManager } from './constants.js'
+import { GuardRole, Guards } from '../src/sequence/guards.js'
// Mock fetch globally for guard API calls
const mockFetch = vi.fn()
@@ -163,7 +163,7 @@ describe('GuardHandler', () => {
expect(result).toBe(true)
expect(mockAddSignature).toHaveBeenCalledOnce()
- const [requestId, signatureData] = mockAddSignature.mock.calls[0]
+ const [requestId, signatureData] = mockAddSignature.mock.calls[0]!
expect(requestId).toBe('test-request-id')
expect(signatureData.address).toBe(guards.getByRole('wallet').address)
expect(signatureData.signature).toBeDefined()
@@ -247,7 +247,7 @@ describe('GuardHandler', () => {
expect(mockCallback).toHaveBeenCalledOnce()
expect(mockAddSignature).toHaveBeenCalledOnce()
- const [requestId, signatureData] = mockAddSignature.mock.calls[0]
+ const [requestId, signatureData] = mockAddSignature.mock.calls[0]!
expect(requestId).toBe('test-request-id')
expect(signatureData.address).toBe(guards.getByRole('wallet').address)
expect(signatureData.signature).toBeDefined()
@@ -300,7 +300,7 @@ describe('GuardHandler', () => {
signatures: [],
})
- expect(mockFetch.mock.calls[0][0]).toContain(customGuardUrl)
+ expect(mockFetch.mock.calls[0]![0]).toContain(customGuardUrl)
await customManager.stop()
})
diff --git a/packages/wallet/wdk/test/identity-auth-dbs.test.ts b/packages/wallet/wdk/test/identity-auth-dbs.test.ts
index 43f6e0b5b..eccc8b885 100644
--- a/packages/wallet/wdk/test/identity-auth-dbs.test.ts
+++ b/packages/wallet/wdk/test/identity-auth-dbs.test.ts
@@ -1,9 +1,7 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { Manager } from '../src/sequence'
-import { Address, Hex, Bytes } from 'ox'
-import { IdentityInstrument } from '@0xsequence/identity-instrument'
-import * as Db from '../src/dbs'
-import { LOCAL_RPC_URL } from './constants'
+import { Manager } from '../src/sequence/index.js'
+import * as Db from '../src/dbs/index.js'
+import { LOCAL_RPC_URL } from './constants.js'
import { State } from '@0xsequence/wallet-core'
import { Network } from '@0xsequence/wallet-primitives'
diff --git a/packages/wallet/wdk/test/identity-signer.test.ts b/packages/wallet/wdk/test/identity-signer.test.ts
index 5eb9c42b4..9d62f5719 100644
--- a/packages/wallet/wdk/test/identity-signer.test.ts
+++ b/packages/wallet/wdk/test/identity-signer.test.ts
@@ -1,10 +1,10 @@
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { Address, Hex, Bytes } from 'ox'
+import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'
+import { Address, Bytes, Hex } from 'ox'
import { Network, Payload } from '@0xsequence/wallet-primitives'
import { IdentityInstrument, KeyType } from '@0xsequence/identity-instrument'
import { State } from '@0xsequence/wallet-core'
-import { IdentitySigner, toIdentityAuthKey } from '../src/identity/signer'
-import { AuthKey } from '../src/dbs/auth-keys'
+import { IdentitySigner, toIdentityAuthKey } from '../src/identity/signer.js'
+import { AuthKey } from '../src/dbs/auth-keys.js'
// Mock the global crypto API
const mockCryptoSubtle = {
@@ -31,7 +31,7 @@ describe('Identity Signer', () => {
let testAuthKey: AuthKey
let testWallet: Address.Address
let mockStateWriter: State.Writer
- let mockSignFn: ReturnType
+ let mockSignFn: Mock
beforeEach(() => {
vi.clearAllMocks()
@@ -179,7 +179,7 @@ describe('Identity Signer', () => {
// Verify that identityInstrument.sign was called with correct parameters
expect(mockSignFn).toHaveBeenCalledOnce()
- const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]
+ const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]!
expect(authKeyArg.address).toBe(testAuthKey.address)
expect(authKeyArg.signer).toBe(testAuthKey.identitySigner)
expect(digestArg).toBeDefined()
@@ -196,7 +196,7 @@ describe('Identity Signer', () => {
expect(mockSignFn).toHaveBeenCalledOnce()
// The digest should be different for different chainIds
- const [, digestArg] = mockSignFn.mock.calls[0]
+ const [, digestArg] = mockSignFn.mock.calls[0]!
expect(digestArg).toBeDefined()
})
@@ -255,7 +255,7 @@ describe('Identity Signer', () => {
}
expect(mockSignFn).toHaveBeenCalledOnce()
- const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]
+ const [authKeyArg, digestArg] = mockSignFn.mock.calls[0]!
expect(authKeyArg.address).toBe(testAuthKey.address)
expect(digestArg).toBe(digest)
})
@@ -295,7 +295,7 @@ describe('Identity Signer', () => {
it('Should handle malformed signature from identity instrument', async () => {
const digest = Hex.toBytes('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef')
- mockSignFn.mockResolvedValueOnce('invalid-signature')
+ mockSignFn.mockResolvedValueOnce('invalid-signature' as any)
await expect(identitySigner.signDigest(digest)).rejects.toThrow() // Should throw when Signature.fromHex fails
})
@@ -317,7 +317,7 @@ describe('Identity Signer', () => {
// Verify witness was saved
expect(mockSaveWitnesses).toHaveBeenCalledOnce()
- const [wallet, chainId, payload, witness] = mockSaveWitnesses.mock.calls[0]
+ const [wallet, chainId, payload, witness] = mockSaveWitnesses.mock.calls[0]!
expect(wallet).toBe(testWallet)
expect(chainId).toBe(0) // Witness signatures use chainId 0
@@ -338,7 +338,7 @@ describe('Identity Signer', () => {
await identitySigner.witness(mockStateWriter, testWallet)
// Extract the payload that was signed
- const [, , payload] = mockSaveWitnesses.mock.calls[0]
+ const [, , payload] = mockSaveWitnesses.mock.calls[0]!
// Parse the message content to verify consent structure
const messageHex = payload.message
@@ -367,7 +367,7 @@ describe('Identity Signer', () => {
await identitySigner.witness(mockStateWriter, testWallet, extraData)
// Extract and verify extra data was included
- const [, , payload] = mockSaveWitnesses.mock.calls[0]
+ const [, , payload] = mockSaveWitnesses.mock.calls[0]!
const messageString = Hex.toString(payload.message)
const consentData = JSON.parse(messageString)
@@ -435,7 +435,7 @@ describe('Identity Signer', () => {
expect(mockSaveWitnesses).toHaveBeenCalledOnce()
// Verify witness payload includes extra context
- const [, , witnessPayload] = mockSaveWitnesses.mock.calls[0]
+ const [, , witnessPayload] = mockSaveWitnesses.mock.calls[0]!
const witnessMessage = JSON.parse(Hex.toString(witnessPayload.message))
expect(witnessMessage.signatureId).toBe('sig-123')
expect(witnessMessage.purpose).toBe('authentication')
@@ -469,8 +469,8 @@ describe('Identity Signer', () => {
expect(mockSignFn).toHaveBeenCalledTimes(2)
// Verify different payloads produce different hashes
- const [, messageDigest] = mockSignFn.mock.calls[0]
- const [, transactionDigest] = mockSignFn.mock.calls[1]
+ const [, messageDigest] = mockSignFn.mock.calls[0]!
+ const [, transactionDigest] = mockSignFn.mock.calls[1]!
expect(messageDigest).not.toEqual(transactionDigest)
})
})
@@ -500,7 +500,7 @@ describe('Identity Signer', () => {
it('Should handle malformed hex signatures', async () => {
const digest = Hex.toBytes('0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef')
- mockSignFn.mockResolvedValueOnce('not-a-hex-string')
+ mockSignFn.mockResolvedValueOnce('not-a-hex-string' as any)
await expect(identitySigner.signDigest(digest)).rejects.toThrow()
})
diff --git a/packages/wallet/wdk/test/messages.test.ts b/packages/wallet/wdk/test/messages.test.ts
index 9420ca000..32d68ffe5 100644
--- a/packages/wallet/wdk/test/messages.test.ts
+++ b/packages/wallet/wdk/test/messages.test.ts
@@ -1,7 +1,7 @@
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
-import { Manager, SignerActionable } from '../src/sequence'
+import { Manager, SignerActionable } from '../src/sequence/index.js'
import { Mnemonic } from 'ox'
-import { newManager } from './constants'
+import { newManager } from './constants.js'
import { Network } from '@0xsequence/wallet-primitives'
describe('Messages', () => {
@@ -41,12 +41,13 @@ describe('Messages', () => {
// Verify message appears in list
const messages = await manager.messages.list()
expect(messages.length).toBe(1)
- expect(messages[0].wallet).toBe(wallet)
- expect(messages[0].message).toBe(testMessage)
- expect(messages[0].status).toBe('requested')
- expect(messages[0].signatureId).toBe(signatureId)
- expect(messages[0].source).toBe('unknown')
- expect(messages[0].id).toBeDefined()
+ const message = messages[0]!
+ expect(message.wallet).toBe(wallet)
+ expect(message.message).toBe(testMessage)
+ expect(message.status).toBe('requested')
+ expect(message.signatureId).toBe(signatureId)
+ expect(message.source).toBe('unknown')
+ expect(message.id).toBeDefined()
})
it('Should create message request with custom source', async () => {
@@ -63,8 +64,11 @@ describe('Messages', () => {
const messages = await manager.messages.list()
expect(messages.length).toBe(1)
- expect(messages[0].source).toBe(customSource)
- expect(messages[0].message).toBe(testMessage)
+
+ const message = messages[0]!
+
+ expect(message.source).toBe(customSource)
+ expect(message.message).toBe(testMessage)
})
it('Should get message by ID', async () => {
@@ -79,7 +83,7 @@ describe('Messages', () => {
const messages = await manager.messages.list()
expect(messages.length).toBe(1)
- const messageId = messages[0].id
+ const messageId = messages[0]!.id
// Get by message ID
const retrievedMessage = await manager.messages.get(messageId)
@@ -269,7 +273,7 @@ describe('Messages', () => {
const signatureId = await manager.messages.request(wallet!, testMessage)
const messages = await manager.messages.list()
- const messageId = messages[0].id
+ const messageId = messages[0]!.id
let updateCallCount = 0
let lastMessage: any
@@ -315,7 +319,7 @@ describe('Messages', () => {
await manager.messages.request(wallet!, testMessage)
const messages = await manager.messages.list()
- const messageId = messages[0].id
+ const messageId = messages[0]!.id
let callCount = 0
let receivedMessage: any
diff --git a/packages/wallet/wdk/test/otp.test.ts b/packages/wallet/wdk/test/otp.test.ts
index 1ad450227..f3ae45209 100644
--- a/packages/wallet/wdk/test/otp.test.ts
+++ b/packages/wallet/wdk/test/otp.test.ts
@@ -1,13 +1,13 @@
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
+import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'
import { Address, Hex } from 'ox'
import { Network, Payload } from '@0xsequence/wallet-primitives'
import { IdentityInstrument, IdentityType, KeyType, OtpChallenge } from '@0xsequence/identity-instrument'
-import { OtpHandler } from '../src/sequence/handlers/otp'
-import { Signatures } from '../src/sequence/signatures'
-import * as Db from '../src/dbs'
-import { IdentitySigner } from '../src/identity/signer'
-import { BaseSignatureRequest } from '../src/sequence/types/signature-request'
-import { Kinds } from '../src/sequence/types/signer'
+import { OtpHandler, PromptOtpHandler } from '../src/sequence/handlers/otp.js'
+import { Signatures } from '../src/sequence/signatures.js'
+import * as Db from '../src/dbs/index.js'
+import { IdentitySigner } from '../src/identity/signer.js'
+import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js'
+import { Kinds } from '../src/sequence/types/signer.js'
// Mock the global crypto API
const mockCryptoSubtle = {
@@ -69,7 +69,7 @@ describe('OtpHandler', () => {
let otpHandler: OtpHandler
let testWallet: Address.Address
let testRequest: BaseSignatureRequest
- let mockPromptOtp: ReturnType
+ let mockPromptOtp: Mock
beforeEach(() => {
vi.clearAllMocks()
diff --git a/packages/wallet/wdk/test/passkeys.test.ts b/packages/wallet/wdk/test/passkeys.test.ts
index 857258c23..199265822 100644
--- a/packages/wallet/wdk/test/passkeys.test.ts
+++ b/packages/wallet/wdk/test/passkeys.test.ts
@@ -3,10 +3,10 @@ import { Address, Hex } from 'ox'
import { Network, Payload } from '@0xsequence/wallet-primitives'
import { Signers, State } from '@0xsequence/wallet-core'
import { Extensions } from '@0xsequence/wallet-primitives'
-import { PasskeysHandler } from '../src/sequence/handlers/passkeys'
-import { Signatures } from '../src/sequence/signatures'
-import { BaseSignatureRequest } from '../src/sequence/types/signature-request'
-import { Kinds } from '../src/sequence/types/signer'
+import { PasskeysHandler } from '../src/sequence/handlers/passkeys.js'
+import { Signatures } from '../src/sequence/signatures.js'
+import { BaseSignatureRequest } from '../src/sequence/types/signature-request.js'
+import { Kinds } from '../src/sequence/types/signer.js'
// Mock dependencies with proper vi.fn() types
const mockAddSignature = vi.fn()
diff --git a/packages/wallet/wdk/test/recovery.test.ts b/packages/wallet/wdk/test/recovery.test.ts
index 9401260ab..3ca6da075 100644
--- a/packages/wallet/wdk/test/recovery.test.ts
+++ b/packages/wallet/wdk/test/recovery.test.ts
@@ -1,8 +1,8 @@
import { describe, expect, it } from 'vitest'
-import { Manager, QueuedRecoveryPayload, SignerReady, TransactionDefined } from '../src/sequence'
+import { QueuedRecoveryPayload, SignerReady, TransactionDefined } from '../src/sequence/index.js'
import { Bytes, Hex, Mnemonic, Provider, RpcTransport } from 'ox'
import { Network, Payload } from '@0xsequence/wallet-primitives'
-import { LOCAL_RPC_URL, newManager } from './constants'
+import { LOCAL_RPC_URL, newManager } from './constants.js'
describe('Recovery', () => {
it('Should execute a recovery', async () => {
@@ -159,7 +159,7 @@ describe('Recovery', () => {
expect(tx.status).toBe('defined')
expect((tx as TransactionDefined).relayerOptions.length).toBe(1)
- const localRelayer = (tx as TransactionDefined).relayerOptions[0]
+ const localRelayer = (tx as TransactionDefined).relayerOptions[0]!
expect(localRelayer).toBeDefined()
expect(localRelayer.relayerId).toBe('local')
@@ -332,7 +332,7 @@ describe('Recovery', () => {
expect(Array.isArray(fetchedPayloads)).toBeTruthy()
expect(fetchedPayloads.length).toBe(1)
- const fetchedPayload = fetchedPayloads[0]
+ const fetchedPayload = fetchedPayloads[0]!
expect(fetchedPayload).toBeDefined()
expect(fetchedPayload.wallet).toBe(wallet)
expect(fetchedPayload.chainId).toBe(Network.ChainId.ARBITRUM)
@@ -390,8 +390,8 @@ describe('Recovery', () => {
expect(updatedPayloads.length).toBe(fetchedPayloads2.length)
if (updatedPayloads.length > 0 && fetchedPayloads.length > 0) {
- const updated = updatedPayloads[0]
- const fetched = fetchedPayloads[0]
+ const updated = updatedPayloads[0]!
+ const fetched = fetchedPayloads[0]!
expect(updated.id).toBe(fetched.id)
expect(updated.wallet).toBe(fetched.wallet)
diff --git a/packages/wallet/wdk/test/sessions.test.ts b/packages/wallet/wdk/test/sessions.test.ts
index 4e3c9a2ca..98a762d3e 100644
--- a/packages/wallet/wdk/test/sessions.test.ts
+++ b/packages/wallet/wdk/test/sessions.test.ts
@@ -4,7 +4,7 @@ import { Signers as CoreSigners, Wallet as CoreWallet, Envelope, State } from '.
import { ExplicitSession } from '../../core/src/utils/session/types.js'
import { Context, Extensions, Network, Payload, Permission } from '../../primitives/src/index.js'
import { Sequence } from '../src/index.js'
-import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants'
+import { EMITTER_ABI, EMITTER_ADDRESS, LOCAL_RPC_URL } from './constants.js'
const ALL_EXTENSIONS: {
name: string
@@ -402,7 +402,7 @@ for (const extension of ALL_EXTENSIONS) {
// Now we modify the permissions target contract to zero address
// This should cause any session call to the EMITTER_ADDRESS contract to fail
- explicitSession.permissions[0].target = '0x0000000000000000000000000000000000000000'
+ explicitSession.permissions[0]!.target = '0x0000000000000000000000000000000000000000'
await setupExplicitSession(explicitSession, true)
diff --git a/packages/wallet/wdk/test/setup.ts b/packages/wallet/wdk/test/setup.ts
index 70482040c..4aa336a55 100644
--- a/packages/wallet/wdk/test/setup.ts
+++ b/packages/wallet/wdk/test/setup.ts
@@ -14,7 +14,7 @@ import {
} from 'fake-indexeddb'
import { Provider, RpcTransport } from 'ox'
import { vi } from 'vitest'
-import { LOCAL_RPC_URL } from './constants'
+import { LOCAL_RPC_URL } from './constants.js'
// Add IndexedDB support to the test environment using fake-indexeddb
global.indexedDB = indexedDB
diff --git a/packages/wallet/wdk/test/signers-kindof.test.ts b/packages/wallet/wdk/test/signers-kindof.test.ts
new file mode 100644
index 000000000..4e5f83aad
--- /dev/null
+++ b/packages/wallet/wdk/test/signers-kindof.test.ts
@@ -0,0 +1,40 @@
+import { describe, expect, it, vi } from 'vitest'
+
+import { Kinds } from '../src/sequence/index.js'
+import { newManager } from './constants.js'
+
+describe('Signers.kindOf', () => {
+ it('does not probe Sessions/Witness for non-witnessable signers', async () => {
+ const getWitnessFor = vi.fn().mockResolvedValue(undefined)
+ const getWitnessForSapient = vi.fn().mockResolvedValue(undefined)
+
+ const manager = newManager({
+ stateProvider: {
+ getWitnessFor,
+ getWitnessForSapient,
+ } as any,
+ })
+
+ const signers = (manager as any).shared.modules.signers
+ const extensions = (manager as any).shared.sequence.extensions
+
+ const wallet = '0x1111111111111111111111111111111111111111'
+ const imageHash = ('0x' + '00'.repeat(32)) as `0x${string}`
+
+ // Sessions extension signer (sapient leaf) never publishes a witness.
+ await signers.kindOf(wallet, extensions.sessions, imageHash)
+
+ // Passkeys module is a known sapient signer kind.
+ expect(await signers.kindOf(wallet, extensions.passkeys, imageHash)).toBe(Kinds.LoginPasskey)
+
+ // Sequence dev multisig (default guard topology leaf) never publishes a witness.
+ await signers.kindOf(wallet, '0x007a47e6BF40C1e0ed5c01aE42fDC75879140bc4')
+
+ expect(getWitnessFor).not.toHaveBeenCalled()
+ expect(getWitnessForSapient).not.toHaveBeenCalled()
+
+ // Unknown signers still rely on a witness probe.
+ await signers.kindOf(wallet, '0x2222222222222222222222222222222222222222')
+ expect(getWitnessFor).toHaveBeenCalledTimes(1)
+ })
+})
diff --git a/packages/wallet/wdk/test/transactions.test.ts b/packages/wallet/wdk/test/transactions.test.ts
index 91bffa56a..910511e7a 100644
--- a/packages/wallet/wdk/test/transactions.test.ts
+++ b/packages/wallet/wdk/test/transactions.test.ts
@@ -1,7 +1,13 @@
import { afterEach, describe, expect, it, vi } from 'vitest'
-import { Manager, SignerActionable, Transaction, TransactionDefined, TransactionRelayed } from '../src/sequence'
+import {
+ Manager,
+ SignerActionable,
+ Transaction,
+ TransactionDefined,
+ TransactionRelayed,
+} from '../src/sequence/index.js'
import { Address, Hex, Mnemonic, Provider, RpcTransport } from 'ox'
-import { LOCAL_RPC_URL, newManager } from './constants'
+import { LOCAL_RPC_URL, newManager } from './constants.js'
import { Payload, Network } from '@0xsequence/wallet-primitives'
describe('Transactions', () => {
@@ -48,9 +54,9 @@ describe('Transactions', () => {
}
expect(tx.relayerOptions.length).toBe(1)
- expect(tx.relayerOptions[0].id).toBeDefined()
+ expect(tx.relayerOptions[0]!.id).toBeDefined()
- const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id)
expect(sigId).toBeDefined()
tx = await manager.transactions.get(txId!)
@@ -161,9 +167,9 @@ describe('Transactions', () => {
}
expect(tx.relayerOptions.length).toBe(1)
- expect(tx.relayerOptions[0].id).toBeDefined()
+ expect(tx.relayerOptions[0]!.id).toBeDefined()
- const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId!, tx.relayerOptions[0]!.id)
expect(sigId).toBeDefined()
tx = await manager.transactions.get(txId!)
@@ -230,11 +236,12 @@ describe('Transactions', () => {
expect(calledTimes).toBe(1)
expect(transactions.length).toBe(1)
- expect(transactions[0].status).toBe('requested')
- expect(transactions[0].wallet).toBe(wallet!)
- expect(transactions[0].requests.length).toBe(1)
- expect(transactions[0].requests[0].to).toEqual(to)
- expect(transactions[0].requests[0].value).toEqual(9n)
+ const tx = transactions[0]!
+ expect(tx.status).toBe('requested')
+ expect(tx.wallet).toBe(wallet!)
+ expect(tx.requests.length).toBe(1)
+ expect(tx.requests[0]!.to).toEqual(to)
+ expect(tx.requests[0]!.value).toEqual(9n)
})
it('Should call onTransactionUpdate when a transaction is defined, relayer selected and relayed', async () => {
@@ -273,12 +280,12 @@ describe('Transactions', () => {
expect(tx!.status).toBe('defined')
expect(tx!.wallet).toBe(wallet!)
expect(tx!.requests.length).toBe(1)
- expect(tx!.requests[0].to).toEqual(to)
- expect(tx!.requests[0].value).toBeUndefined()
- expect(tx!.requests[0].gasLimit).toBeUndefined()
- expect(tx!.requests[0].data).toBeUndefined()
+ expect(tx!.requests[0]!.to).toEqual(to)
+ expect(tx!.requests[0]!.value).toBeUndefined()
+ expect(tx!.requests[0]!.gasLimit).toBeUndefined()
+ expect(tx!.requests[0]!.data).toBeUndefined()
- const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id)
expect(sigId).toBeDefined()
while (calledTimes < 2) {
@@ -374,7 +381,7 @@ describe('Transactions', () => {
expect(tx).toBeDefined()
expect(tx!.status).toBe('defined')
- const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id)
expect(sigId).toBeDefined()
await manager.transactions.delete(txId!)
@@ -433,12 +440,12 @@ describe('Transactions', () => {
// The first call should be to the random address
// and the second one should be a call to self
- const call1 = (tx.envelope.payload as Payload.Calls).calls[0]
- const call2 = (tx.envelope.payload as Payload.Calls).calls[1]
+ const call1 = (tx.envelope.payload as Payload.Calls).calls[0]!
+ const call2 = (tx.envelope.payload as Payload.Calls).calls[1]!
expect(call1.to).toEqual(randomAddress)
expect(call2.to).toEqual(wallet)
- const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId!, (tx as TransactionDefined).relayerOptions[0]!.id)
expect(sigId).toBeDefined()
tx = await manager.transactions.get(txId!)
@@ -540,9 +547,10 @@ describe('Transactions', () => {
// Should now have one transaction
expect(transactionsList.length).toBe(1)
- expect(transactionsList[0].id).toBe(txId)
- expect(transactionsList[0].status).toBe('requested')
- expect(transactionsList[0].wallet).toBe(wallet)
+ const tx = transactionsList[0]!
+ expect(tx.id).toBe(txId)
+ expect(tx.status).toBe('requested')
+ expect(tx.wallet).toBe(wallet)
unsubscribe()
})
@@ -577,7 +585,7 @@ describe('Transactions', () => {
expect(callCount).toBe(1)
expect(receivedTransactions.length).toBe(1)
- expect(receivedTransactions[0].id).toBe(txId)
+ expect(receivedTransactions[0]!.id).toBe(txId)
unsubscribe()
})
@@ -697,8 +705,8 @@ describe('Transactions', () => {
const tx = await manager.transactions.get(txId)
expect(tx.status).toBe('defined')
- expect(tx.envelope.payload.calls[0].gasLimit).toBe(50000n)
- expect(tx.envelope.payload.calls[1].gasLimit).toBe(75000n)
+ expect(tx.envelope.payload.calls[0]!.gasLimit).toBe(50000n)
+ expect(tx.envelope.payload.calls[1]!.gasLimit).toBe(75000n)
})
it('Should throw error when defining transaction not in requested state', async () => {
@@ -780,8 +788,8 @@ describe('Transactions', () => {
expect(tx.status).toBe('requested')
expect(tx.source).toBe('test-dapp')
expect(tx.envelope.payload.space).toBe(customSpace)
- expect(tx.requests[0].data).toBe('0x1234')
- expect(tx.requests[0].gasLimit).toBe(21000n)
+ expect(tx.requests[0]!.data).toBe('0x1234')
+ expect(tx.requests[0]!.gasLimit).toBe(21000n)
})
it('Should throw error for unknown network', async () => {
@@ -820,12 +828,12 @@ describe('Transactions', () => {
const tx = await manager.transactions.get(txId)
expect(tx.status).toBe('requested')
- expect(tx.envelope.payload.calls[0].value).toBe(0n)
- expect(tx.envelope.payload.calls[0].data).toBe('0x')
- expect(tx.envelope.payload.calls[0].gasLimit).toBe(0n)
- expect(tx.envelope.payload.calls[0].delegateCall).toBe(false)
- expect(tx.envelope.payload.calls[0].onlyFallback).toBe(false)
- expect(tx.envelope.payload.calls[0].behaviorOnError).toBe('revert')
+ expect(tx.envelope.payload.calls[0]!.value).toBe(0n)
+ expect(tx.envelope.payload.calls[0]!.data).toBe('0x')
+ expect(tx.envelope.payload.calls[0]!.gasLimit).toBe(0n)
+ expect(tx.envelope.payload.calls[0]!.delegateCall).toBe(false)
+ expect(tx.envelope.payload.calls[0]!.onlyFallback).toBe(false)
+ expect(tx.envelope.payload.calls[0]!.behaviorOnError).toBe('revert')
})
it('Should handle relay with signature ID instead of transaction ID', async () => {
@@ -856,7 +864,7 @@ describe('Transactions', () => {
throw new Error('Transaction not defined')
}
- const sigId = await manager.transactions.selectRelayer(txId, tx.relayerOptions[0].id)
+ const sigId = await manager.transactions.selectRelayer(txId, tx.relayerOptions[0]!.id)
// Sign the transaction
const sigRequest = await manager.signatures.get(sigId)
diff --git a/packages/wallet/wdk/test/wallets.test.ts b/packages/wallet/wdk/test/wallets.test.ts
index ec3265b50..99e71d73d 100644
--- a/packages/wallet/wdk/test/wallets.test.ts
+++ b/packages/wallet/wdk/test/wallets.test.ts
@@ -1,7 +1,7 @@
import { afterEach, describe, expect, it } from 'vitest'
-import { Manager, SignerActionable, SignerReady } from '../src/sequence'
+import { Manager, SignerActionable, SignerReady } from '../src/sequence/index.js'
import { Mnemonic, Address } from 'ox'
-import { newManager } from './constants'
+import { newManager } from './constants.js'
import { Config, Constants, Network } from '@0xsequence/wallet-primitives'
describe('Wallets', () => {
@@ -65,7 +65,7 @@ describe('Wallets', () => {
const walletsAfterFirst = await manager.wallets.list()
expect(walletsAfterFirst.length).toBe(1)
- expect(walletsAfterFirst[0].address).toBe(wallet1)
+ expect(walletsAfterFirst[0]!.address).toBe(wallet1)
})
// === WALLET SELECTOR REGISTRATION ===
@@ -283,14 +283,14 @@ describe('Wallets', () => {
expect(config.devices).toBeDefined()
expect(config.devices.length).toBe(1)
- expect(config.devices[0].kind).toBe('local-device')
- expect(config.devices[0].address).toBeDefined()
+ expect(config.devices[0]!.kind).toBe('local-device')
+ expect(config.devices[0]!.address).toBeDefined()
expect(config.login).toBeDefined()
expect(config.login.length).toBe(1)
- expect(config.login[0].kind).toBe('login-mnemonic')
+ expect(config.login[0]!.kind).toBe('login-mnemonic')
- expect(config.guard).not.toBeDefined() // No guard for noGuard: true
+ expect(config.walletGuard).not.toBeDefined() // No guard for noGuard: true
expect(config.raw).toBeDefined()
expect(config.raw.loginTopology).toBeDefined()
@@ -319,7 +319,9 @@ describe('Wallets', () => {
Config.findSignerLeaf(config.raw.guardTopology!, Constants.PlaceholderAddress as Address.Address),
).toBeUndefined()
- const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress))
+ const sessionsModule = config.raw.modules.find((m: any) =>
+ Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress),
+ )
expect(sessionsModule?.guardLeaf).toBeDefined()
expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined()
expect(
@@ -360,7 +362,9 @@ describe('Wallets', () => {
).toBeUndefined()
const sessionsModuleAddress = (manager as any).shared.sequence.extensions.sessions
- const sessionsModule = config.raw.modules.find((m) => Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress))
+ const sessionsModule = config.raw.modules.find((m: any) =>
+ Address.isEqual(m.sapientLeaf.address, sessionsModuleAddress),
+ )
expect(sessionsModule?.guardLeaf).toBeDefined()
expect(Config.findSignerLeaf(sessionsModule!.guardLeaf!, sessionsGuardAddress)).toBeDefined()
})
@@ -406,7 +410,7 @@ describe('Wallets', () => {
const mnemonic = Mnemonic.random(Mnemonic.english)
await manager.wallets.signUp({ mnemonic, kind: 'mnemonic', noGuard: true })
- await manager.wallets.logout(await manager.wallets.list().then((w) => w[0].address), { skipRemoveDevice: true })
+ await manager.wallets.logout(await manager.wallets.list().then((w) => w[0]!.address), { skipRemoveDevice: true })
const invalidSelector = async () => 'invalid-result' as any
manager.wallets.registerWalletSelector(invalidSelector)
@@ -426,7 +430,7 @@ describe('Wallets', () => {
const wallets = await manager.wallets.list()
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
+ expect(wallets[0]!.address).toBe(wallet!)
const requestId = await manager.wallets.logout(wallet!)
expect(requestId).toBeDefined()
@@ -466,16 +470,16 @@ describe('Wallets', () => {
const wallets = await manager.wallets.list()
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
- expect(wallets[0].status).toBe('ready')
+ expect(wallets[0]!.address).toBe(wallet!)
+ expect(wallets[0]!.status).toBe('ready')
const requestId = await manager.wallets.logout(wallet!)
expect(requestId).toBeDefined()
const wallets2 = await manager.wallets.list()
expect(wallets2.length).toBe(1)
- expect(wallets2[0].address).toBe(wallet!)
- expect(wallets2[0].status).toBe('logging-out')
+ expect(wallets2[0]!.address).toBe(wallet!)
+ expect(wallets2[0]!.status).toBe('logging-out')
const request = await manager.signatures.get(requestId)
expect(request).toBeDefined()
@@ -511,8 +515,8 @@ describe('Wallets', () => {
const wallets = await manager.wallets.list()
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
- expect(wallets[0].status).toBe('logging-in')
+ expect(wallets[0]!.address).toBe(wallet!)
+ expect(wallets[0]!.status).toBe('logging-in')
let signRequests = 0
const unregistedUI = manager.registerMnemonicUI(async (respond) => {
@@ -539,8 +543,8 @@ describe('Wallets', () => {
expect((await manager.signatures.get(requestId1!))?.status).toBe('completed')
const wallets2 = await manager.wallets.list()
expect(wallets2.length).toBe(1)
- expect(wallets2[0].address).toBe(wallet!)
- expect(wallets2[0].status).toBe('ready')
+ expect(wallets2[0]!.address).toBe(wallet!)
+ expect(wallets2[0]!.status).toBe('ready')
// The wallet should have 2 device keys and 2 recovery keys
const config = await manager.wallets.getConfiguration(wallet!)
@@ -560,7 +564,7 @@ describe('Wallets', () => {
const wallets = await manager.wallets.list()
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
+ expect(wallets[0]!.address).toBe(wallet!)
const requestId = await manager.wallets.logout(wallet!)
expect(requestId).toBeDefined()
@@ -609,7 +613,7 @@ describe('Wallets', () => {
expect((await manager.signatures.get(requestId2!))?.status).toBe('completed')
const wallets3 = await manager.wallets.list()
expect(wallets3.length).toBe(1)
- expect(wallets3[0].address).toBe(wallet!)
+ expect(wallets3[0]!.address).toBe(wallet!)
// The wallet should have a single device key and a single recovery key
const config = await manager.wallets.getConfiguration(wallet!)
@@ -618,10 +622,10 @@ describe('Wallets', () => {
expect(recovery?.length).toBe(1)
// The kind of the device key should be 'local-device'
- expect(config.devices[0].kind).toBe('local-device')
+ expect(config.devices[0]!.kind).toBe('local-device')
// The kind of the recovery key should be 'local-recovery'
- expect(recovery?.[0].kind).toBe('local-device')
+ expect(recovery?.[0]!.kind).toBe('local-device')
})
it('Should fail to logout from a non-existent wallet', async () => {
@@ -672,8 +676,8 @@ describe('Wallets', () => {
const wallets = await manager.wallets.list()
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
- expect(wallets[0].status).toBe('logging-in')
+ expect(wallets[0]!.address).toBe(wallet!)
+ expect(wallets[0]!.status).toBe('logging-in')
const request = await manager.signatures.get(requestId!)
expect(request).toBeDefined()
@@ -695,8 +699,8 @@ describe('Wallets', () => {
expect((await manager.signatures.get(requestId!))?.status).toBe('completed')
const wallets2 = await manager.wallets.list()
expect(wallets2.length).toBe(1)
- expect(wallets2[0].address).toBe(wallet!)
- expect(wallets2[0].status).toBe('ready')
+ expect(wallets2[0]!.address).toBe(wallet!)
+ expect(wallets2[0]!.status).toBe('ready')
})
it('Should trigger an update when a wallet is logged in', async () => {
@@ -711,8 +715,8 @@ describe('Wallets', () => {
unregisterCallback = manager.wallets.onWalletsUpdate((wallets) => {
callbackCalls++
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
- expect(wallets[0].status).toBe('ready')
+ expect(wallets[0]!.address).toBe(wallet!)
+ expect(wallets[0]!.status).toBe('ready')
resolve()
})
})
@@ -773,8 +777,8 @@ describe('Wallets', () => {
unregisterCallback = manager.wallets.onWalletsUpdate((wallets) => {
callbackCalls++
expect(wallets.length).toBe(1)
- expect(wallets[0].address).toBe(wallet!)
- expect(wallets[0].status).toBe('logging-out')
+ expect(wallets[0]!.address).toBe(wallet!)
+ expect(wallets[0]!.status).toBe('logging-out')
resolve()
})
})
@@ -796,9 +800,9 @@ describe('Wallets', () => {
const devices = await manager.wallets.listDevices(wallet!)
expect(devices.length).toBe(1)
- expect(devices[0].address).not.toBe(wallet)
- expect(devices[0].isLocal).toBe(true)
expect(devices[0]).toBeDefined()
+ expect(devices[0]!.address).not.toBe(wallet)
+ expect(devices[0]!.isLocal).toBe(true)
})
it('Should list all active devices for a wallet, including a new remote device', async () => {
@@ -816,8 +820,8 @@ describe('Wallets', () => {
// Verify initial state from Device 1's perspective
const devices1 = await managerDevice1.wallets.listDevices(wallet!)
expect(devices1.length).toBe(1)
- expect(devices1[0].isLocal).toBe(true)
- const device1Address = devices1[0].address
+ expect(devices1[0]!.isLocal).toBe(true)
+ const device1Address = devices1[0]!.address
// Wallet logs in on device 2
const managerDevice2 = newManager(undefined, undefined, 'device-2')
@@ -934,8 +938,8 @@ describe('Wallets', () => {
const finalDevices = await managerDevice1.wallets.listDevices(wallet!)
console.log('Final devices', finalDevices)
expect(finalDevices.length).toBe(1)
- expect(finalDevices[0].isLocal).toBe(true)
- expect(finalDevices[0].address).not.toBe(device2Address)
+ expect(finalDevices[0]!.isLocal).toBe(true)
+ expect(finalDevices[0]!.address).not.toBe(device2Address)
await managerDevice1.stop()
await managerDevice2.stop()
@@ -952,7 +956,7 @@ describe('Wallets', () => {
const devices = await manager.wallets.listDevices(wallet!)
expect(devices.length).toBe(1)
- const localDeviceAddress = devices[0].address
+ const localDeviceAddress = devices[0]!.address
const remoteLogoutPromise = manager.wallets.remoteLogout(wallet!, localDeviceAddress)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index af179055b..f6fc79c1b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,14 +12,14 @@ importers:
.:
devDependencies:
'@changesets/cli':
- specifier: ^2.29.4
- version: 2.29.7(@types/node@24.10.4)
+ specifier: ^2.29.8
+ version: 2.29.8(@types/node@25.0.2)
lefthook:
- specifier: ^2.0.4
- version: 2.0.11
+ specifier: ^2.0.12
+ version: 2.0.12
prettier:
- specifier: ^3.5.3
- version: 3.6.2
+ specifier: ^3.7.4
+ version: 3.7.4
rimraf:
specifier: ^6.1.2
version: 6.1.2
@@ -27,7 +27,7 @@ importers:
specifier: ^13.0.4
version: 13.0.4(typescript@5.9.3)
turbo:
- specifier: ^2.6.1
+ specifier: ^2.6.3
version: 2.6.3
typescript:
specifier: ^5.9.3
@@ -36,75 +36,75 @@ importers:
extras/docs:
dependencies:
'@repo/ui':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/ui
next:
- specifier: ^15.5.9
- version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ specifier: ^16.1.1
+ version: 16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react:
- specifier: ^19.1.0
- version: 19.2.0
+ specifier: ^19.2.3
+ version: 19.2.3
react-dom:
- specifier: ^19.1.0
- version: 19.2.0(react@19.2.0)
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
devDependencies:
'@repo/eslint-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/eslint-config
'@repo/typescript-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/typescript-config
'@types/node':
- specifier: ^20.17.57
- version: 20.19.21
+ specifier: ^25.0.2
+ version: 25.0.2
'@types/react':
- specifier: ^19.2.6
- version: 19.2.6
+ specifier: ^19.2.7
+ version: 19.2.7
'@types/react-dom':
specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.6)
+ version: 19.2.3(@types/react@19.2.7)
eslint:
- specifier: ^9.28.0
- version: 9.37.0
+ specifier: ^9.39.2
+ version: 9.39.2
typescript:
- specifier: ^5.8.3
+ specifier: ^5.9.3
version: 5.9.3
extras/web:
dependencies:
'@repo/ui':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/ui
next:
- specifier: ^15.5.9
- version: 15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
+ specifier: ^16.1.1
+ version: 16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react:
- specifier: ^19.1.0
- version: 19.2.0
+ specifier: ^19.2.3
+ version: 19.2.3
react-dom:
- specifier: ^19.1.0
- version: 19.2.0(react@19.2.0)
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
devDependencies:
'@repo/eslint-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/eslint-config
'@repo/typescript-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../repo/typescript-config
'@types/node':
- specifier: ^20.17.57
- version: 20.19.21
+ specifier: ^25.0.2
+ version: 25.0.2
'@types/react':
- specifier: ^19.2.6
- version: 19.2.6
+ specifier: ^19.2.7
+ version: 19.2.7
'@types/react-dom':
specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.6)
+ version: 19.2.3(@types/react@19.2.7)
eslint:
- specifier: ^9.28.0
- version: 9.37.0
+ specifier: ^9.39.2
+ version: 9.39.2
typescript:
- specifier: ^5.8.3
+ specifier: ^5.9.3
version: 5.9.3
packages/services/api:
@@ -113,8 +113,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -125,8 +125,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -135,20 +135,20 @@ importers:
dependencies:
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/services/identity-instrument:
dependencies:
@@ -160,20 +160,20 @@ importers:
version: 4.0.0
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/services/indexer:
devDependencies:
@@ -181,8 +181,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -193,8 +193,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -205,8 +205,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -221,23 +221,23 @@ importers:
version: 0.0.7(typescript@5.9.3)
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
viem:
specifier: ^2.40.3
- version: 2.42.0(typescript@5.9.3)
+ version: 2.42.1(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/services/userdata:
devDependencies:
@@ -245,8 +245,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -257,8 +257,8 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -279,20 +279,20 @@ importers:
version: 0.0.7(typescript@5.9.3)
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
viem:
specifier: ^2.40.3
- version: 2.42.0(typescript@5.9.3)
+ version: 2.42.1(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
'@vitest/coverage-v8':
- specifier: ^4.0.14
- version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))
+ specifier: ^4.0.15
+ version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))
dotenv:
specifier: ^17.2.3
version: 17.2.3
@@ -303,8 +303,8 @@ importers:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/wallet/dapp-client:
dependencies:
@@ -322,17 +322,17 @@ importers:
version: link:../primitives
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
'@vitest/coverage-v8':
- specifier: ^4.0.14
- version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))
+ specifier: ^4.0.15
+ version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))
dotenv:
specifier: ^17.2.3
version: 17.2.3
@@ -340,33 +340,33 @@ importers:
specifier: ^6.2.5
version: 6.2.5
happy-dom:
- specifier: ^20.0.10
+ specifier: ^20.0.11
version: 20.0.11
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/wallet/primitives:
dependencies:
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
devDependencies:
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@vitest/coverage-v8':
- specifier: ^4.0.14
- version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))
+ specifier: ^4.0.15
+ version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
packages/wallet/primitives-cli:
dependencies:
@@ -375,20 +375,20 @@ importers:
version: link:../primitives
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
yargs:
specifier: ^18.0.0
version: 18.0.0
devDependencies:
'@repo/eslint-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../../../repo/eslint-config
'@repo/typescript-config':
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
'@types/yargs':
specifier: ^17.0.35
version: 17.0.35
@@ -396,8 +396,8 @@ importers:
specifier: ^9.2.1
version: 9.2.1
esbuild:
- specifier: ^0.27.0
- version: 0.27.1
+ specifier: ^0.27.2
+ version: 0.27.2
nodemon:
specifier: ^3.1.11
version: 3.1.11
@@ -433,7 +433,7 @@ importers:
version: 4.0.0
ox:
specifier: ^0.9.17
- version: 0.9.17(typescript@5.9.3)
+ version: 0.9.17(typescript@5.9.3)(zod@4.2.0)
uuid:
specifier: ^13.0.0
version: 13.0.0
@@ -442,11 +442,11 @@ importers:
specifier: workspace:^
version: link:../../../repo/typescript-config
'@types/node':
- specifier: ^24.10.1
- version: 24.10.4
+ specifier: ^25.0.2
+ version: 25.0.2
'@vitest/coverage-v8':
- specifier: ^4.0.14
- version: 4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))
+ specifier: ^4.0.15
+ version: 4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))
dotenv:
specifier: ^17.2.3
version: 17.2.3
@@ -454,82 +454,82 @@ importers:
specifier: ^6.2.5
version: 6.2.5
happy-dom:
- specifier: ^20.0.10
+ specifier: ^20.0.11
version: 20.0.11
typescript:
specifier: ^5.9.3
version: 5.9.3
vitest:
- specifier: ^4.0.14
- version: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ specifier: ^4.0.15
+ version: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
repo/eslint-config:
devDependencies:
'@eslint/js':
- specifier: ^9.28.0
- version: 9.37.0
+ specifier: ^9.39.2
+ version: 9.39.2
'@next/eslint-plugin-next':
- specifier: ^15.3.3
- version: 15.5.5
+ specifier: ^15.5.9
+ version: 15.5.9
eslint:
- specifier: ^9.28.0
- version: 9.37.0
+ specifier: ^9.39.2
+ version: 9.39.2
eslint-config-prettier:
- specifier: ^9.1.0
- version: 9.1.2(eslint@9.37.0)
+ specifier: ^10.1.8
+ version: 10.1.8(eslint@9.39.2)
eslint-plugin-only-warn:
specifier: ^1.1.0
version: 1.1.0
eslint-plugin-react:
specifier: ^7.37.5
- version: 7.37.5(eslint@9.37.0)
+ version: 7.37.5(eslint@9.39.2)
eslint-plugin-react-hooks:
- specifier: ^5.2.0
- version: 5.2.0(eslint@9.37.0)
+ specifier: ^7.0.1
+ version: 7.0.1(eslint@9.39.2)
eslint-plugin-turbo:
- specifier: ^2.5.4
- version: 2.5.8(eslint@9.37.0)(turbo@2.6.3)
+ specifier: ^2.6.3
+ version: 2.6.3(eslint@9.39.2)(turbo@2.7.2)
globals:
- specifier: ^15.15.0
- version: 15.15.0
+ specifier: ^16.5.0
+ version: 16.5.0
typescript:
- specifier: ^5.8.3
- version: 5.8.3
+ specifier: ^5.9.3
+ version: 5.9.3
typescript-eslint:
- specifier: ^8.33.1
- version: 8.46.1(eslint@9.37.0)(typescript@5.8.3)
+ specifier: ^8.49.0
+ version: 8.50.0(eslint@9.39.2)(typescript@5.9.3)
repo/typescript-config: {}
repo/ui:
dependencies:
react:
- specifier: ^19.1.0
- version: 19.2.0
+ specifier: ^19.2.3
+ version: 19.2.3
react-dom:
- specifier: ^19.1.0
- version: 19.2.0(react@19.2.0)
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
devDependencies:
'@repo/eslint-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../eslint-config
'@repo/typescript-config':
- specifier: workspace:*
+ specifier: workspace:^
version: link:../typescript-config
'@turbo/gen':
specifier: ^1.13.4
- version: 1.13.4(@types/node@20.19.21)(typescript@5.9.3)
+ version: 1.13.4(@types/node@25.0.2)(typescript@5.9.3)
'@types/node':
- specifier: ^20.17.57
- version: 20.19.21
+ specifier: ^25.0.2
+ version: 25.0.2
'@types/react':
- specifier: ^19.2.6
- version: 19.2.6
+ specifier: ^19.2.7
+ version: 19.2.7
'@types/react-dom':
specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.6)
+ version: 19.2.3(@types/react@19.2.7)
typescript:
- specifier: ^5.8.3
+ specifier: ^5.9.3
version: 5.9.3
packages:
@@ -544,6 +544,36 @@ packages:
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.28.5':
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.28.5':
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.27.2':
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.28.0':
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.27.1':
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.28.3':
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-string-parser@7.27.1':
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
engines: {node: '>=6.9.0'}
@@ -552,6 +582,14 @@ packages:
resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-option@7.27.1':
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.28.4':
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
+ engines: {node: '>=6.9.0'}
+
'@babel/parser@7.28.5':
resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
engines: {node: '>=6.0.0'}
@@ -565,6 +603,14 @@ packages:
resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.28.5':
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.28.5':
resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
engines: {node: '>=6.9.0'}
@@ -573,8 +619,8 @@ packages:
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
- '@changesets/apply-release-plan@7.0.13':
- resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==}
+ '@changesets/apply-release-plan@7.0.14':
+ resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==}
'@changesets/assemble-release-plan@6.0.9':
resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==}
@@ -582,12 +628,12 @@ packages:
'@changesets/changelog-git@0.2.1':
resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==}
- '@changesets/cli@2.29.7':
- resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==}
+ '@changesets/cli@2.29.8':
+ resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==}
hasBin: true
- '@changesets/config@3.1.1':
- resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==}
+ '@changesets/config@3.1.2':
+ resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==}
'@changesets/errors@0.2.0':
resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
@@ -595,8 +641,8 @@ packages:
'@changesets/get-dependents-graph@2.1.3':
resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==}
- '@changesets/get-release-plan@4.0.13':
- resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==}
+ '@changesets/get-release-plan@4.0.14':
+ resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==}
'@changesets/get-version-range-type@0.4.0':
resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
@@ -607,14 +653,14 @@ packages:
'@changesets/logger@0.1.1':
resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==}
- '@changesets/parse@0.4.1':
- resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==}
+ '@changesets/parse@0.4.2':
+ resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==}
'@changesets/pre@2.0.2':
resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==}
- '@changesets/read@0.6.5':
- resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==}
+ '@changesets/read@0.6.6':
+ resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==}
'@changesets/should-skip-package@0.1.2':
resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==}
@@ -635,314 +681,158 @@ packages:
'@emnapi/runtime@1.7.1':
resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
- '@esbuild/aix-ppc64@0.25.12':
- resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==}
+ '@esbuild/aix-ppc64@0.27.2':
+ resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/aix-ppc64@0.27.1':
- resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
-
- '@esbuild/android-arm64@0.25.12':
- resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm64@0.27.1':
- resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==}
+ '@esbuild/android-arm64@0.27.2':
+ resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.25.12':
- resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-arm@0.27.1':
- resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==}
+ '@esbuild/android-arm@0.27.2':
+ resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.25.12':
- resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/android-x64@0.27.1':
- resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==}
+ '@esbuild/android-x64@0.27.2':
+ resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.25.12':
- resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-arm64@0.27.1':
- resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==}
+ '@esbuild/darwin-arm64@0.27.2':
+ resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.12':
- resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.27.1':
- resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==}
+ '@esbuild/darwin-x64@0.27.2':
+ resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.25.12':
- resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-arm64@0.27.1':
- resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==}
+ '@esbuild/freebsd-arm64@0.27.2':
+ resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.12':
- resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.27.1':
- resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==}
+ '@esbuild/freebsd-x64@0.27.2':
+ resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.25.12':
- resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm64@0.27.1':
- resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==}
+ '@esbuild/linux-arm64@0.27.2':
+ resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.25.12':
- resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-arm@0.27.1':
- resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==}
+ '@esbuild/linux-arm@0.27.2':
+ resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.25.12':
- resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-ia32@0.27.1':
- resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==}
+ '@esbuild/linux-ia32@0.27.2':
+ resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.25.12':
- resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-loong64@0.27.1':
- resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==}
+ '@esbuild/linux-loong64@0.27.2':
+ resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.12':
- resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
+ '@esbuild/linux-mips64el@0.27.2':
+ resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-mips64el@0.27.1':
- resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.25.12':
- resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.27.1':
- resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==}
+ '@esbuild/linux-ppc64@0.27.2':
+ resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.12':
- resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.27.1':
- resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==}
+ '@esbuild/linux-riscv64@0.27.2':
+ resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.25.12':
- resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-s390x@0.27.1':
- resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==}
+ '@esbuild/linux-s390x@0.27.2':
+ resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.25.12':
- resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/linux-x64@0.27.1':
- resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==}
+ '@esbuild/linux-x64@0.27.2':
+ resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.12':
- resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
- '@esbuild/netbsd-arm64@0.27.1':
- resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==}
+ '@esbuild/netbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.12':
- resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.27.1':
- resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==}
+ '@esbuild/netbsd-x64@0.27.2':
+ resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.25.12':
- resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openbsd]
-
- '@esbuild/openbsd-arm64@0.27.1':
- resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==}
+ '@esbuild/openbsd-arm64@0.27.2':
+ resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.12':
- resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openbsd-x64@0.27.1':
- resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==}
+ '@esbuild/openbsd-x64@0.27.2':
+ resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.12':
- resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
-
- '@esbuild/openharmony-arm64@0.27.1':
- resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==}
+ '@esbuild/openharmony-arm64@0.27.2':
+ resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.25.12':
- resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
-
- '@esbuild/sunos-x64@0.27.1':
- resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==}
+ '@esbuild/sunos-x64@0.27.2':
+ resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.25.12':
- resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
-
- '@esbuild/win32-arm64@0.27.1':
- resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==}
+ '@esbuild/win32-arm64@0.27.2':
+ resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.25.12':
- resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
-
- '@esbuild/win32-ia32@0.27.1':
- resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==}
+ '@esbuild/win32-ia32@0.27.2':
+ resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.25.12':
- resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
-
- '@esbuild/win32-x64@0.27.1':
- resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==}
+ '@esbuild/win32-x64@0.27.2':
+ resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -953,36 +843,36 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.12.1':
- resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- '@eslint/config-array@0.21.0':
- resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==}
+ '@eslint/config-array@0.21.1':
+ resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/config-helpers@0.4.0':
- resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==}
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/core@0.16.0':
- resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/eslintrc@3.3.1':
- resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
+ '@eslint/eslintrc@3.3.3':
+ resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.37.0':
- resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==}
+ '@eslint/js@9.39.2':
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/object-schema@2.1.6':
- resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+ '@eslint/object-schema@2.1.7':
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/plugin-kit@0.4.0':
- resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@humanfs/core@0.19.1':
@@ -1138,8 +1028,8 @@ packages:
cpu: [x64]
os: [win32]
- '@inquirer/external-editor@1.0.2':
- resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -1155,6 +1045,12 @@ packages:
resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
engines: {node: 20 || >=22}
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -1174,56 +1070,56 @@ packages:
'@manypkg/get-packages@1.1.3':
resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
- '@next/env@15.5.9':
- resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==}
+ '@next/env@16.1.1':
+ resolution: {integrity: sha512-3oxyM97Sr2PqiVyMyrZUtrtM3jqqFxOQJVuKclDsgj/L728iZt/GyslkN4NwarledZATCenbk4Offjk1hQmaAA==}
- '@next/eslint-plugin-next@15.5.5':
- resolution: {integrity: sha512-FMzm412l9oFB8zdRD+K6HQ1VzlS+sNNsdg0MfvTg0i8lfCyTgP/RFxiu/pGJqZ/IQnzn9xSiLkjOVI7Iv4nbdQ==}
+ '@next/eslint-plugin-next@15.5.9':
+ resolution: {integrity: sha512-kUzXx0iFiXw27cQAViE1yKWnz/nF8JzRmwgMRTMh8qMY90crNsdXJRh2e+R0vBpFR3kk1yvAR7wev7+fCCb79Q==}
- '@next/swc-darwin-arm64@15.5.7':
- resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==}
+ '@next/swc-darwin-arm64@16.1.1':
+ resolution: {integrity: sha512-JS3m42ifsVSJjSTzh27nW+Igfha3NdBOFScr9C80hHGrWx55pTrVL23RJbqir7k7/15SKlrLHhh/MQzqBBYrQA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.5.7':
- resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==}
+ '@next/swc-darwin-x64@16.1.1':
+ resolution: {integrity: sha512-hbyKtrDGUkgkyQi1m1IyD3q4I/3m9ngr+V93z4oKHrPcmxwNL5iMWORvLSGAf2YujL+6HxgVvZuCYZfLfb4bGw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.5.7':
- resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==}
+ '@next/swc-linux-arm64-gnu@16.1.1':
+ resolution: {integrity: sha512-/fvHet+EYckFvRLQ0jPHJCUI5/B56+2DpI1xDSvi80r/3Ez+Eaa2Yq4tJcRTaB1kqj/HrYKn8Yplm9bNoMJpwQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.5.7':
- resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==}
+ '@next/swc-linux-arm64-musl@16.1.1':
+ resolution: {integrity: sha512-MFHrgL4TXNQbBPzkKKur4Fb5ICEJa87HM7fczFs2+HWblM7mMLdco3dvyTI+QmLBU9xgns/EeeINSZD6Ar+oLg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.5.7':
- resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==}
+ '@next/swc-linux-x64-gnu@16.1.1':
+ resolution: {integrity: sha512-20bYDfgOQAPUkkKBnyP9PTuHiJGM7HzNBbuqmD0jiFVZ0aOldz+VnJhbxzjcSabYsnNjMPsE0cyzEudpYxsrUQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.5.7':
- resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==}
+ '@next/swc-linux-x64-musl@16.1.1':
+ resolution: {integrity: sha512-9pRbK3M4asAHQRkwaXwu601oPZHghuSC8IXNENgbBSyImHv/zY4K5udBusgdHkvJ/Tcr96jJwQYOll0qU8+fPA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.5.7':
- resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==}
+ '@next/swc-win32-arm64-msvc@16.1.1':
+ resolution: {integrity: sha512-bdfQkggaLgnmYrFkSQfsHfOhk/mCYmjnrbRCGgkMcoOBZ4n+TRRSLmT/CU5SATzlBJ9TpioUyBW/vWFXTqQRiA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.5.7':
- resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==}
+ '@next/swc-win32-x64-msvc@16.1.1':
+ resolution: {integrity: sha512-Ncwbw2WJ57Al5OX0k4chM68DKhEPlrXBaSXDCi2kPi5f4d8b3ejr3RRJGfKBLrn2YJL5ezNS7w2TZLHSti8CMw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -1256,113 +1152,113 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@rollup/rollup-android-arm-eabi@4.53.3':
- resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==}
+ '@rollup/rollup-android-arm-eabi@4.53.4':
+ resolution: {integrity: sha512-PWU3Y92H4DD0bOqorEPp1Y0tbzwAurFmIYpjcObv5axGVOtcTlB0b2UKMd2echo08MgN7jO8WQZSSysvfisFSQ==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.53.3':
- resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==}
+ '@rollup/rollup-android-arm64@4.53.4':
+ resolution: {integrity: sha512-Gw0/DuVm3rGsqhMGYkSOXXIx20cC3kTlivZeuaGt4gEgILivykNyBWxeUV5Cf2tDA2nPLah26vq3emlRrWVbng==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.53.3':
- resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==}
+ '@rollup/rollup-darwin-arm64@4.53.4':
+ resolution: {integrity: sha512-+w06QvXsgzKwdVg5qRLZpTHh1bigHZIqoIUPtiqh05ZiJVUQ6ymOxaPkXTvRPRLH88575ZCRSRM3PwIoNma01Q==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.53.3':
- resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==}
+ '@rollup/rollup-darwin-x64@4.53.4':
+ resolution: {integrity: sha512-EB4Na9G2GsrRNRNFPuxfwvDRDUwQEzJPpiK1vo2zMVhEeufZ1k7J1bKnT0JYDfnPC7RNZ2H5YNQhW6/p2QKATw==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.53.3':
- resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==}
+ '@rollup/rollup-freebsd-arm64@4.53.4':
+ resolution: {integrity: sha512-bldA8XEqPcs6OYdknoTMaGhjytnwQ0NClSPpWpmufOuGPN5dDmvIa32FygC2gneKK4A1oSx86V1l55hyUWUYFQ==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.53.3':
- resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==}
+ '@rollup/rollup-freebsd-x64@4.53.4':
+ resolution: {integrity: sha512-3T8GPjH6mixCd0YPn0bXtcuSXi1Lj+15Ujw2CEb7dd24j9thcKscCf88IV7n76WaAdorOzAgSSbuVRg4C8V8Qw==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
- resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.4':
+ resolution: {integrity: sha512-UPMMNeC4LXW7ZSHxeP3Edv09aLsFUMaD1TSVW6n1CWMECnUIJMFFB7+XC2lZTdPtvB36tYC0cJWc86mzSsaviw==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.53.3':
- resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==}
+ '@rollup/rollup-linux-arm-musleabihf@4.53.4':
+ resolution: {integrity: sha512-H8uwlV0otHs5Q7WAMSoyvjV9DJPiy5nJ/xnHolY0QptLPjaSsuX7tw+SPIfiYH6cnVx3fe4EWFafo6gH6ekZKA==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.53.3':
- resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==}
+ '@rollup/rollup-linux-arm64-gnu@4.53.4':
+ resolution: {integrity: sha512-BLRwSRwICXz0TXkbIbqJ1ibK+/dSBpTJqDClF61GWIrxTXZWQE78ROeIhgl5MjVs4B4gSLPCFeD4xML9vbzvCQ==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.53.3':
- resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==}
+ '@rollup/rollup-linux-arm64-musl@4.53.4':
+ resolution: {integrity: sha512-6bySEjOTbmVcPJAywjpGLckK793A0TJWSbIa0sVwtVGfe/Nz6gOWHOwkshUIAp9j7wg2WKcA4Snu7Y1nUZyQew==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-loong64-gnu@4.53.3':
- resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==}
+ '@rollup/rollup-linux-loong64-gnu@4.53.4':
+ resolution: {integrity: sha512-U0ow3bXYJZ5MIbchVusxEycBw7bO6C2u5UvD31i5IMTrnt2p4Fh4ZbHSdc/31TScIJQYHwxbj05BpevB3201ug==}
cpu: [loong64]
os: [linux]
- '@rollup/rollup-linux-ppc64-gnu@4.53.3':
- resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==}
+ '@rollup/rollup-linux-ppc64-gnu@4.53.4':
+ resolution: {integrity: sha512-iujDk07ZNwGLVn0YIWM80SFN039bHZHCdCCuX9nyx3Jsa2d9V/0Y32F+YadzwbvDxhSeVo9zefkoPnXEImnM5w==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.53.3':
- resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==}
+ '@rollup/rollup-linux-riscv64-gnu@4.53.4':
+ resolution: {integrity: sha512-MUtAktiOUSu+AXBpx1fkuG/Bi5rhlorGs3lw5QeJ2X3ziEGAq7vFNdWVde6XGaVqi0LGSvugwjoxSNJfHFTC0g==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-riscv64-musl@4.53.3':
- resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==}
+ '@rollup/rollup-linux-riscv64-musl@4.53.4':
+ resolution: {integrity: sha512-btm35eAbDfPtcFEgaXCI5l3c2WXyzwiE8pArhd66SDtoLWmgK5/M7CUxmUglkwtniPzwvWioBKKl6IXLbPf2sQ==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.53.3':
- resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==}
+ '@rollup/rollup-linux-s390x-gnu@4.53.4':
+ resolution: {integrity: sha512-uJlhKE9ccUTCUlK+HUz/80cVtx2RayadC5ldDrrDUFaJK0SNb8/cCmC9RhBhIWuZ71Nqj4Uoa9+xljKWRogdhA==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.53.3':
- resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==}
+ '@rollup/rollup-linux-x64-gnu@4.53.4':
+ resolution: {integrity: sha512-jjEMkzvASQBbzzlzf4os7nzSBd/cvPrpqXCUOqoeCh1dQ4BP3RZCJk8XBeik4MUln3m+8LeTJcY54C/u8wb3DQ==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.53.3':
- resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==}
+ '@rollup/rollup-linux-x64-musl@4.53.4':
+ resolution: {integrity: sha512-lu90KG06NNH19shC5rBPkrh6mrTpq5kviFylPBXQVpdEu0yzb0mDgyxLr6XdcGdBIQTH/UAhDJnL+APZTBu1aQ==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-openharmony-arm64@4.53.3':
- resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==}
+ '@rollup/rollup-openharmony-arm64@4.53.4':
+ resolution: {integrity: sha512-dFDcmLwsUzhAm/dn0+dMOQZoONVYBtgik0VuY/d5IJUUb787L3Ko/ibvTvddqhb3RaB7vFEozYevHN4ox22R/w==}
cpu: [arm64]
os: [openharmony]
- '@rollup/rollup-win32-arm64-msvc@4.53.3':
- resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==}
+ '@rollup/rollup-win32-arm64-msvc@4.53.4':
+ resolution: {integrity: sha512-WvUpUAWmUxZKtRnQWpRKnLW2DEO8HB/l8z6oFFMNuHndMzFTJEXzaYJ5ZAmzNw0L21QQJZsUQFt2oPf3ykAD/w==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.53.3':
- resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==}
+ '@rollup/rollup-win32-ia32-msvc@4.53.4':
+ resolution: {integrity: sha512-JGbeF2/FDU0x2OLySw/jgvkwWUo05BSiJK0dtuI4LyuXbz3wKiC1xHhLB1Tqm5VU6ZZDmAorj45r/IgWNWku5g==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-gnu@4.53.3':
- resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==}
+ '@rollup/rollup-win32-x64-gnu@4.53.4':
+ resolution: {integrity: sha512-zuuC7AyxLWLubP+mlUwEyR8M1ixW1ERNPHJfXm8x7eQNP4Pzkd7hS3qBuKBR70VRiQ04Kw8FNfRMF5TNxuZq2g==}
cpu: [x64]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.53.3':
- resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==}
+ '@rollup/rollup-win32-x64-msvc@4.53.4':
+ resolution: {integrity: sha512-Sbx45u/Lbb5RyptSbX7/3deP+/lzEmZ0BTSHxwxN/IMOZDZf8S0AGo0hJD5n/LQssxb5Z3B4og4P2X6Dd8acCA==}
cpu: [x64]
os: [win32]
@@ -1388,8 +1284,8 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
- '@tsconfig/node10@1.0.11':
- resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
+ '@tsconfig/node10@1.0.12':
+ resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==}
'@tsconfig/node12@1.0.11':
resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
@@ -1433,22 +1329,19 @@ packages:
'@types/node@12.20.55':
resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
- '@types/node@20.19.21':
- resolution: {integrity: sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA==}
-
'@types/node@20.19.27':
resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==}
- '@types/node@24.10.4':
- resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
+ '@types/node@25.0.2':
+ resolution: {integrity: sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
'@types/react': ^19.2.0
- '@types/react@19.2.6':
- resolution: {integrity: sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w==}
+ '@types/react@19.2.7':
+ resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
'@types/through@0.0.33':
resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
@@ -1465,63 +1358,63 @@ packages:
'@types/yargs@17.0.35':
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
- '@typescript-eslint/eslint-plugin@8.46.1':
- resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==}
+ '@typescript-eslint/eslint-plugin@8.50.0':
+ resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.46.1
+ '@typescript-eslint/parser': ^8.50.0
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.46.1':
- resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==}
+ '@typescript-eslint/parser@8.50.0':
+ resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.46.1':
- resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==}
+ '@typescript-eslint/project-service@8.50.0':
+ resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.46.1':
- resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==}
+ '@typescript-eslint/scope-manager@8.50.0':
+ resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.46.1':
- resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==}
+ '@typescript-eslint/tsconfig-utils@8.50.0':
+ resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.46.1':
- resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==}
+ '@typescript-eslint/type-utils@8.50.0':
+ resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.46.1':
- resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==}
+ '@typescript-eslint/types@8.50.0':
+ resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.46.1':
- resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==}
+ '@typescript-eslint/typescript-estree@8.50.0':
+ resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.46.1':
- resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==}
+ '@typescript-eslint/utils@8.50.0':
+ resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.46.1':
- resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==}
+ '@typescript-eslint/visitor-keys@8.50.0':
+ resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@vitest/coverage-v8@4.0.15':
@@ -1682,8 +1575,8 @@ packages:
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
- asn1js@3.0.6:
- resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==}
+ asn1js@3.0.7:
+ resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==}
engines: {node: '>=12.0.0'}
assertion-error@2.0.1:
@@ -1711,6 +1604,10 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.9.11:
+ resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==}
+ hasBin: true
+
basic-ftp@5.0.5:
resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==}
engines: {node: '>=10.0.0'}
@@ -1736,6 +1633,11 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
+ browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
@@ -1762,8 +1664,8 @@ packages:
camel-case@3.0.0:
resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==}
- caniuse-lite@1.0.30001760:
- resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
+ caniuse-lite@1.0.30001761:
+ resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==}
cbor2@1.12.0:
resolution: {integrity: sha512-3Cco8XQhi27DogSp9Ri6LYNZLi/TBY/JVnDe+mj06NkBjW/ZYOtekaEU4wZ4xcRMNrFkDv8KNtOAqHyDfz3lYg==}
@@ -1799,8 +1701,8 @@ packages:
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
- chardet@2.1.0:
- resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==}
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
@@ -1877,8 +1779,11 @@ packages:
constant-case@2.0.0:
resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==}
- core-js-pure@3.46.0:
- resolution: {integrity: sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==}
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ core-js-pure@3.47.0:
+ resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==}
cosmiconfig@9.0.0:
resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
@@ -1988,6 +1893,9 @@ packages:
effect@3.19.12:
resolution: {integrity: sha512-7F9RGTrCTC3D7nh9Zw+3VlJWwZgo5k33KA+476BAaD0rKIXKZsY/jQ+ipyhR/Avo239Fi6GqAVFs1mqM1IJ7yg==}
+ electron-to-chromium@1.5.267:
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==}
+
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -2005,8 +1913,8 @@ packages:
error-ex@1.3.4:
resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
- es-abstract@1.24.0:
- resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==}
+ es-abstract@1.24.1:
+ resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==}
engines: {node: '>= 0.4'}
es-define-property@1.0.1:
@@ -2017,8 +1925,8 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-iterator-helpers@1.2.1:
- resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+ es-iterator-helpers@1.2.2:
+ resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==}
engines: {node: '>= 0.4'}
es-module-lexer@1.7.0:
@@ -2040,13 +1948,8 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild@0.25.12:
- resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==}
- engines: {node: '>=18'}
- hasBin: true
-
- esbuild@0.27.1:
- resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==}
+ esbuild@0.27.2:
+ resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
engines: {node: '>=18'}
hasBin: true
@@ -2067,8 +1970,8 @@ packages:
engines: {node: '>=6.0'}
hasBin: true
- eslint-config-prettier@9.1.2:
- resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==}
+ eslint-config-prettier@10.1.8:
+ resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
@@ -2077,9 +1980,9 @@ packages:
resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==}
engines: {node: '>=6'}
- eslint-plugin-react-hooks@5.2.0:
- resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
- engines: {node: '>=10'}
+ eslint-plugin-react-hooks@7.0.1:
+ resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==}
+ engines: {node: '>=18'}
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
@@ -2089,8 +1992,8 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
- eslint-plugin-turbo@2.5.8:
- resolution: {integrity: sha512-bVjx4vTH0oTKIyQ7EGFAXnuhZMrKIfu17qlex/dps7eScPnGQLJ3r1/nFq80l8xA+8oYjsSirSQ2tXOKbz3kEw==}
+ eslint-plugin-turbo@2.6.3:
+ resolution: {integrity: sha512-91WZ+suhT/pk+qNS0/rqT43xLUlUblsa3a8jKmAStGhkJCmR2uX0oWo/e0Edb+It8MdnteXuYpCkvsK4Vw8FtA==}
peerDependencies:
eslint: '>6.6.0'
turbo: '>2.0.0'
@@ -2107,8 +2010,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.37.0:
- resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==}
+ eslint@9.39.2:
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -2265,6 +2168,10 @@ packages:
resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==}
engines: {node: '>= 0.4'}
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -2313,8 +2220,8 @@ packages:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
- globals@15.15.0:
- resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+ globals@16.5.0:
+ resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==}
engines: {node: '>=18'}
globalthis@1.0.4:
@@ -2344,9 +2251,6 @@ packages:
resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==}
engines: {node: '>=10'}
- graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
-
handlebars@4.7.8:
resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
engines: {node: '>=0.4.7'}
@@ -2390,6 +2294,12 @@ packages:
header-case@1.0.1:
resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==}
+ hermes-estree@0.25.1:
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
+
+ hermes-parser@0.25.1:
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
+
hosted-git-info@8.1.0:
resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -2405,8 +2315,8 @@ packages:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
- human-id@4.1.2:
- resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==}
+ human-id@4.1.3:
+ resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==}
hasBin: true
human-signals@2.1.0:
@@ -2417,8 +2327,8 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
- iconv-lite@0.7.0:
- resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
+ iconv-lite@0.7.1:
+ resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==}
engines: {node: '>=0.10.0'}
idb@8.0.3:
@@ -2472,8 +2382,8 @@ packages:
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
- ip-address@10.0.1:
- resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
+ ip-address@10.1.0:
+ resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==}
engines: {node: '>= 12'}
is-array-buffer@3.0.5:
@@ -2674,18 +2584,19 @@ packages:
js-tokens@9.0.1:
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
- js-yaml@3.14.1:
- resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
- hasBin: true
-
- js-yaml@4.1.0:
- resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
hasBin: true
js-yaml@4.1.1:
resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
hasBin: true
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
@@ -2701,6 +2612,11 @@ packages:
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
@@ -2725,58 +2641,58 @@ packages:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
engines: {node: '>=6'}
- lefthook-darwin-arm64@2.0.11:
- resolution: {integrity: sha512-RfpdcJJQXstdgDiIBDRffncayKiXx+0LyMUCunIxDEO2JMXPpYK2hIdpUU0rkitzptAADchG7u1OXJ31rrtIAA==}
+ lefthook-darwin-arm64@2.0.12:
+ resolution: {integrity: sha512-tuBz1sNLien+nKKb8BDopKjS6EnbXU8rQzhMVBY+bnVfsTiYDfbBr4wo/IzA5TcwoTL/b5somCJhljEw6DvSyg==}
cpu: [arm64]
os: [darwin]
- lefthook-darwin-x64@2.0.11:
- resolution: {integrity: sha512-D013UNKQa4FKgpxDMqdaU109U2/Pidtrt9CobQoq8te4eGUglcwxMzuYVTgaYnenz0FgKxSfVaCZsZgwqeMWqA==}
+ lefthook-darwin-x64@2.0.12:
+ resolution: {integrity: sha512-FnuUMPPRMJyTEPXg6PotSrFJ8qf8FDLhhD1zLh74D+9Cye5j9n3lcrCQEjXubPT8du/GZLxMBjjffRbcZ8eYDA==}
cpu: [x64]
os: [darwin]
- lefthook-freebsd-arm64@2.0.11:
- resolution: {integrity: sha512-mgfNqG1tiJkCuGNwPG0LEfnAHGJA+Qzl6KidOtX/Zhxmj/sM+6hxiP4LOeEAhCnaZF5kuPtQgbFzShFHc2BK6A==}
+ lefthook-freebsd-arm64@2.0.12:
+ resolution: {integrity: sha512-DXElB0qR5e6a8cXkFNYakhwCieypbfh6Y4QG39pzMnLsG03g/nhe093o6owfiUZ4mUFyDM6+0xmy0steOooF2g==}
cpu: [arm64]
os: [freebsd]
- lefthook-freebsd-x64@2.0.11:
- resolution: {integrity: sha512-rnHOlQbJfLGCibr7yHM44kPNgf/tFpEbj/cWVHRhjRdbgYSCAjJk0uKd/EVo3v/vjfId2na0AhWbLvO/aY3wQQ==}
+ lefthook-freebsd-x64@2.0.12:
+ resolution: {integrity: sha512-iJN1ZxFeaDi4Fi3b9jcW9wgyNl19LOv2NaVOaAi/tG6mlIn196cmSdXkOA3+943ZbqbdfV9I+bBcIKwneXDA3Q==}
cpu: [x64]
os: [freebsd]
- lefthook-linux-arm64@2.0.11:
- resolution: {integrity: sha512-1XjDo2/4fM0TbJBwxZh8w+WMOFueg9oYHkryM8vc3vp8wTajdWBazg1K37JIS3FUco3tcOs+eWHQg0ekVjpWoA==}
+ lefthook-linux-arm64@2.0.12:
+ resolution: {integrity: sha512-byvmO4Iri6P0COwM8c3lGgeCV3Q0hh1XJpRfrcZDr4Wslq9O63t6J3T6i87oOtY+UjC9pXLl6xGk6hlUcHZ3BQ==}
cpu: [arm64]
os: [linux]
- lefthook-linux-x64@2.0.11:
- resolution: {integrity: sha512-OKOcfEvozXhO7+y2xgUzvc2kkqfhluql/sjQSzd8Ka+iK3hM4KCfbfgYx9q61Pjr34a0+i03cuH5DF2dlq/rrg==}
+ lefthook-linux-x64@2.0.12:
+ resolution: {integrity: sha512-KBaiinmf336rA+/dmYs7H7TTeAOByB0CyLA7k8IecTCuaiuKr6ez7ktSjht19poa5G+V0mts4GgEGcx6HViR0w==}
cpu: [x64]
os: [linux]
- lefthook-openbsd-arm64@2.0.11:
- resolution: {integrity: sha512-n1KEx196M3SKaWVNTQXGgxzBsiYAsdAy6Of6I6TAZwPhG7yoRrKGkQrhOlPgMzYl36udG1Lk4D+mfY9T0oOUYQ==}
+ lefthook-openbsd-arm64@2.0.12:
+ resolution: {integrity: sha512-1QBMXX1UW5rtgC4TB52OKWB7Rz/kCBRB+bKKLT/gDD79aPzLgJANTitQQzgFNIWoa7aM9UvzvIAJzOo6FcFIbg==}
cpu: [arm64]
os: [openbsd]
- lefthook-openbsd-x64@2.0.11:
- resolution: {integrity: sha512-WAEtKpYUVvuJMVLA38IBoaPnTNSiaEzvUYxjTBlYTLHJwn7HC2GG6P1cnvoua8rfxb9/Bfi7C3D3IPa9VmB33Q==}
+ lefthook-openbsd-x64@2.0.12:
+ resolution: {integrity: sha512-zPcvUzs65GexRA37UHmaZqWuEGSU/zpBaPIY98MybXzzcJfCIf+O0oUQe2riMllwYGvNW0B1y3NOYRziDNe/vA==}
cpu: [x64]
os: [openbsd]
- lefthook-windows-arm64@2.0.11:
- resolution: {integrity: sha512-HBqW1qfAnmmbpet7gSWatB6H5YIFdGxCqzolMCLwY/0o8oPFiMwdNE5RGp5JMmhZdz/h3XlbaUlIhnxoW8dk5g==}
+ lefthook-windows-arm64@2.0.12:
+ resolution: {integrity: sha512-kgwxguS2GssoHM4SMTp+ArD/Gjg9q5MinD6iI5vSFpuJygD13ZWiXQQfESMHq9y/v1XkD0BdHTJej49dx8P+Vw==}
cpu: [arm64]
os: [win32]
- lefthook-windows-x64@2.0.11:
- resolution: {integrity: sha512-e5TYmV5cBZfRrhPVFCqjauegLI5CjdAd8exyAbMzGHkiwp3ZK145Su/pntgEP3d+ayS9mpgYPJmXYOSL7WHlyg==}
+ lefthook-windows-x64@2.0.12:
+ resolution: {integrity: sha512-Tf/VtSOtF3rBTc9dzRWROa+HuhqaiIV+Xp+1gzlx5+uCueLM0m87Rz6yd4IN5mL7TrDaNkiRXI3FvjCp0dUE4Q==}
cpu: [x64]
os: [win32]
- lefthook@2.0.11:
- resolution: {integrity: sha512-/91k4dt9MRNkzeSr1iMjNi/z8dNuh+XvNfXrWA6PV+M1ZxiNY6uN6bGnr13n+j7N89f4h7YWBhCqhzhK33M5cA==}
+ lefthook@2.0.12:
+ resolution: {integrity: sha512-I2FdA9cdnq1icwlNz4RADs7exuqe47q1N9+p2LmcP/WfchWh16mvTB82OAD7w7zK9GxblS9GpF7pASaOSl4c7A==}
hasBin: true
levn@0.4.1:
@@ -2836,6 +2752,9 @@ packages:
resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==}
engines: {node: 20 || >=22}
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
lru-cache@7.18.3:
resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
@@ -2931,9 +2850,9 @@ packages:
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
engines: {node: '>= 0.4.0'}
- next@15.5.9:
- resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==}
- engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
+ next@16.1.1:
+ resolution: {integrity: sha512-QI+T7xrxt1pF6SQ/JYFz95ro/mg/1Znk5vBebsWwbpejj1T0A23hO7GYEaVac9QUOT2BIMiuzm0L99ooq7k0/w==}
+ engines: {node: '>=20.9.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
@@ -2959,6 +2878,9 @@ packages:
resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==}
engines: {node: '>=8.9.4'}
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
nodemon@3.1.11:
resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==}
engines: {node: '>=10'}
@@ -3161,9 +3083,9 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
- pkijs@3.3.0:
- resolution: {integrity: sha512-SVUpr7uqRNuR6w417k0aM8YrHWWhvMh4P0paIA+wWdOxPOLd7PCDZgt3/nooAyrrO1cjwPP2I1hd3h2P6hUQZQ==}
- engines: {node: '>=12.0.0'}
+ pkijs@3.3.3:
+ resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==}
+ engines: {node: '>=16.0.0'}
possible-typed-array-names@1.1.0:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
@@ -3186,8 +3108,8 @@ packages:
engines: {node: '>=10.13.0'}
hasBin: true
- prettier@3.6.2:
- resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
+ prettier@3.7.4:
+ resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==}
engines: {node: '>=14'}
hasBin: true
@@ -3222,9 +3144,9 @@ packages:
pvtsutils@1.3.6:
resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==}
- pvutils@1.1.3:
- resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==}
- engines: {node: '>=6.0.0'}
+ pvutils@1.1.5:
+ resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==}
+ engines: {node: '>=16.0.0'}
quansync@0.2.11:
resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==}
@@ -3236,16 +3158,16 @@ packages:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
- react-dom@19.2.0:
- resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==}
+ react-dom@19.2.3:
+ resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
peerDependencies:
- react: ^19.2.0
+ react: ^19.2.3
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- react@19.2.0:
- resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==}
+ react@19.2.3:
+ resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
engines: {node: '>=0.10.0'}
read-yaml-file@1.1.0:
@@ -3291,8 +3213,8 @@ packages:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
- resolve@1.22.10:
- resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
engines: {node: '>= 0.4'}
hasBin: true
@@ -3322,8 +3244,8 @@ packages:
engines: {node: 20 || >=22}
hasBin: true
- rollup@4.53.3:
- resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==}
+ rollup@4.53.4:
+ resolution: {integrity: sha512-YpXaaArg0MvrnJpvduEDYIp7uGOqKXbH9NsHGQ6SxKCOsNAjZF018MmxefFUulVP2KLtiGw1UvZbr+/ekjvlDg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -3666,35 +3588,69 @@ packages:
cpu: [x64]
os: [darwin]
+ turbo-darwin-64@2.7.2:
+ resolution: {integrity: sha512-dxY3X6ezcT5vm3coK6VGixbrhplbQMwgNsCsvZamS/+/6JiebqW9DKt4NwpgYXhDY2HdH00I7FWs3wkVuan4rA==}
+ cpu: [x64]
+ os: [darwin]
+
turbo-darwin-arm64@2.6.3:
resolution: {integrity: sha512-MwVt7rBKiOK7zdYerenfCRTypefw4kZCue35IJga9CH1+S50+KTiCkT6LBqo0hHeoH2iKuI0ldTF2a0aB72z3w==}
cpu: [arm64]
os: [darwin]
+ turbo-darwin-arm64@2.7.2:
+ resolution: {integrity: sha512-1bXmuwPLqNFt3mzrtYcVx1sdJ8UYb124Bf48nIgcpMCGZy3kDhgxNv1503kmuK/37OGOZbsWSQFU4I08feIuSg==}
+ cpu: [arm64]
+ os: [darwin]
+
turbo-linux-64@2.6.3:
resolution: {integrity: sha512-cqpcw+dXxbnPtNnzeeSyWprjmuFVpHJqKcs7Jym5oXlu/ZcovEASUIUZVN3OGEM6Y/OTyyw0z09tOHNt5yBAVg==}
cpu: [x64]
os: [linux]
+ turbo-linux-64@2.7.2:
+ resolution: {integrity: sha512-kP+TiiMaiPugbRlv57VGLfcjFNsFbo8H64wMBCPV2270Or2TpDCBULMzZrvEsvWFjT3pBFvToYbdp8/Kw0jAQg==}
+ cpu: [x64]
+ os: [linux]
+
turbo-linux-arm64@2.6.3:
resolution: {integrity: sha512-MterpZQmjXyr4uM7zOgFSFL3oRdNKeflY7nsjxJb2TklsYqiu3Z9pQ4zRVFFH8n0mLGna7MbQMZuKoWqqHb45w==}
cpu: [arm64]
os: [linux]
+ turbo-linux-arm64@2.7.2:
+ resolution: {integrity: sha512-VDJwQ0+8zjAfbyY6boNaWfP6RIez4ypKHxwkuB6SrWbOSk+vxTyW5/hEjytTwK8w/TsbKVcMDyvpora8tEsRFw==}
+ cpu: [arm64]
+ os: [linux]
+
turbo-windows-64@2.6.3:
resolution: {integrity: sha512-biDU70v9dLwnBdLf+daoDlNJVvqOOP8YEjqNipBHzgclbQlXbsi6Gqqelp5er81Qo3BiRgmTNx79oaZQTPb07Q==}
cpu: [x64]
os: [win32]
+ turbo-windows-64@2.7.2:
+ resolution: {integrity: sha512-rPjqQXVnI6A6oxgzNEE8DNb6Vdj2Wwyhfv3oDc+YM3U9P7CAcBIlKv/868mKl4vsBtz4ouWpTQNXG8vljgJO+w==}
+ cpu: [x64]
+ os: [win32]
+
turbo-windows-arm64@2.6.3:
resolution: {integrity: sha512-dDHVKpSeukah3VsI/xMEKeTnV9V9cjlpFSUs4bmsUiLu3Yv2ENlgVEZv65wxbeE0bh0jjpmElDT+P1KaCxArQQ==}
cpu: [arm64]
os: [win32]
+ turbo-windows-arm64@2.7.2:
+ resolution: {integrity: sha512-tcnHvBhO515OheIFWdxA+qUvZzNqqcHbLVFc1+n+TJ1rrp8prYicQtbtmsiKgMvr/54jb9jOabU62URAobnB7g==}
+ cpu: [arm64]
+ os: [win32]
+
turbo@2.6.3:
resolution: {integrity: sha512-bf6YKUv11l5Xfcmg76PyWoy/e2vbkkxFNBGJSnfdSXQC33ZiUfutYh6IXidc5MhsnrFkWfdNNLyaRk+kHMLlwA==}
hasBin: true
+ turbo@2.7.2:
+ resolution: {integrity: sha512-5JIA5aYBAJSAhrhbyag1ZuMSgUZnHtI+Sq3H8D3an4fL8PeF+L1yYvbEJg47akP1PFfATMf5ehkqFnxfkmuwZQ==}
+ hasBin: true
+
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -3719,18 +3675,13 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
- typescript-eslint@8.46.1:
- resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==}
+ typescript-eslint@8.50.0:
+ resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- typescript@5.8.3:
- resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==}
- engines: {node: '>=14.17'}
- hasBin: true
-
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
@@ -3766,6 +3717,12 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'}
+ update-browserslist-db@1.2.2:
+ resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
update-check@1.5.4:
resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==}
@@ -3796,16 +3753,16 @@ packages:
resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==}
engines: {node: ^18.17.0 || >=20.5.0}
- viem@2.42.0:
- resolution: {integrity: sha512-H0WC6czWi7ITBoHkHJVGyjLOecqh/9XJzl4V9XVIwGs/JC3UAJ44rPvkzuYbhDknLWcnREMY/MnXJY7fc7mpGA==}
+ viem@2.42.1:
+ resolution: {integrity: sha512-NzT/f54jT+b0Um6pYzN/uAGMLg+3twhricAzXS+XH8pVIREzPEh7P25rlhPQnLYiPWzQd9mrFcvnm73Sc8bx+A==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
typescript:
optional: true
- vite@7.2.7:
- resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==}
+ vite@7.3.0:
+ resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -3949,6 +3906,9 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@@ -3973,12 +3933,21 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ zod-validation-error@4.0.2:
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.25.0 || ^4.0.0
+
+ zod@4.2.0:
+ resolution: {integrity: sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw==}
+
snapshots:
'@0xsequence/tee-verifier@0.1.2':
dependencies:
cbor2: 1.12.0
- pkijs: 3.3.0
+ pkijs: 3.3.3
'@adraffy/ens-normalize@1.11.1': {}
@@ -3988,20 +3957,101 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
+ '@babel/compat-data@7.28.5': {}
+
+ '@babel/core@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3(supports-color@5.5.0)
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.28.0': {}
+
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-string-parser@7.27.1': {}
'@babel/helper-validator-identifier@7.28.5': {}
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.28.4':
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+
'@babel/parser@7.28.5':
dependencies:
'@babel/types': 7.28.5
'@babel/runtime-corejs3@7.28.4':
dependencies:
- core-js-pure: 3.46.0
+ core-js-pure: 3.47.0
'@babel/runtime@7.28.4': {}
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
+ '@babel/traverse@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/types@7.28.5':
dependencies:
'@babel/helper-string-parser': 7.27.1
@@ -4009,9 +4059,9 @@ snapshots:
'@bcoe/v8-coverage@1.0.2': {}
- '@changesets/apply-release-plan@7.0.13':
+ '@changesets/apply-release-plan@7.0.14':
dependencies:
- '@changesets/config': 3.1.1
+ '@changesets/config': 3.1.2
'@changesets/get-version-range-type': 0.4.0
'@changesets/git': 3.0.4
'@changesets/should-skip-package': 0.1.2
@@ -4038,23 +4088,23 @@ snapshots:
dependencies:
'@changesets/types': 6.1.0
- '@changesets/cli@2.29.7(@types/node@24.10.4)':
+ '@changesets/cli@2.29.8(@types/node@25.0.2)':
dependencies:
- '@changesets/apply-release-plan': 7.0.13
+ '@changesets/apply-release-plan': 7.0.14
'@changesets/assemble-release-plan': 6.0.9
'@changesets/changelog-git': 0.2.1
- '@changesets/config': 3.1.1
+ '@changesets/config': 3.1.2
'@changesets/errors': 0.2.0
'@changesets/get-dependents-graph': 2.1.3
- '@changesets/get-release-plan': 4.0.13
+ '@changesets/get-release-plan': 4.0.14
'@changesets/git': 3.0.4
'@changesets/logger': 0.1.1
'@changesets/pre': 2.0.2
- '@changesets/read': 0.6.5
+ '@changesets/read': 0.6.6
'@changesets/should-skip-package': 0.1.2
'@changesets/types': 6.1.0
'@changesets/write': 0.4.0
- '@inquirer/external-editor': 1.0.2(@types/node@24.10.4)
+ '@inquirer/external-editor': 1.0.3(@types/node@25.0.2)
'@manypkg/get-packages': 1.1.3
ansi-colors: 4.1.3
ci-info: 3.9.0
@@ -4071,7 +4121,7 @@ snapshots:
transitivePeerDependencies:
- '@types/node'
- '@changesets/config@3.1.1':
+ '@changesets/config@3.1.2':
dependencies:
'@changesets/errors': 0.2.0
'@changesets/get-dependents-graph': 2.1.3
@@ -4092,12 +4142,12 @@ snapshots:
picocolors: 1.1.1
semver: 7.7.3
- '@changesets/get-release-plan@4.0.13':
+ '@changesets/get-release-plan@4.0.14':
dependencies:
'@changesets/assemble-release-plan': 6.0.9
- '@changesets/config': 3.1.1
+ '@changesets/config': 3.1.2
'@changesets/pre': 2.0.2
- '@changesets/read': 0.6.5
+ '@changesets/read': 0.6.6
'@changesets/types': 6.1.0
'@manypkg/get-packages': 1.1.3
@@ -4115,10 +4165,10 @@ snapshots:
dependencies:
picocolors: 1.1.1
- '@changesets/parse@0.4.1':
+ '@changesets/parse@0.4.2':
dependencies:
'@changesets/types': 6.1.0
- js-yaml: 3.14.1
+ js-yaml: 4.1.1
'@changesets/pre@2.0.2':
dependencies:
@@ -4127,11 +4177,11 @@ snapshots:
'@manypkg/get-packages': 1.1.3
fs-extra: 7.0.1
- '@changesets/read@0.6.5':
+ '@changesets/read@0.6.6':
dependencies:
'@changesets/git': 3.0.4
'@changesets/logger': 0.1.1
- '@changesets/parse': 0.4.1
+ '@changesets/parse': 0.4.2
'@changesets/types': 6.1.0
fs-extra: 7.0.1
p-filter: 2.1.0
@@ -4150,7 +4200,7 @@ snapshots:
dependencies:
'@changesets/types': 6.1.0
fs-extra: 7.0.1
- human-id: 4.1.2
+ human-id: 4.1.3
prettier: 2.8.8
'@cspotcode/source-map-support@0.8.1':
@@ -4162,186 +4212,108 @@ snapshots:
tslib: 2.8.1
optional: true
- '@esbuild/aix-ppc64@0.25.12':
- optional: true
-
- '@esbuild/aix-ppc64@0.27.1':
- optional: true
-
- '@esbuild/android-arm64@0.25.12':
- optional: true
-
- '@esbuild/android-arm64@0.27.1':
- optional: true
-
- '@esbuild/android-arm@0.25.12':
- optional: true
-
- '@esbuild/android-arm@0.27.1':
- optional: true
-
- '@esbuild/android-x64@0.25.12':
- optional: true
-
- '@esbuild/android-x64@0.27.1':
- optional: true
-
- '@esbuild/darwin-arm64@0.25.12':
- optional: true
-
- '@esbuild/darwin-arm64@0.27.1':
- optional: true
-
- '@esbuild/darwin-x64@0.25.12':
- optional: true
-
- '@esbuild/darwin-x64@0.27.1':
- optional: true
-
- '@esbuild/freebsd-arm64@0.25.12':
- optional: true
-
- '@esbuild/freebsd-arm64@0.27.1':
- optional: true
-
- '@esbuild/freebsd-x64@0.25.12':
- optional: true
-
- '@esbuild/freebsd-x64@0.27.1':
- optional: true
-
- '@esbuild/linux-arm64@0.25.12':
- optional: true
-
- '@esbuild/linux-arm64@0.27.1':
- optional: true
-
- '@esbuild/linux-arm@0.25.12':
- optional: true
-
- '@esbuild/linux-arm@0.27.1':
- optional: true
-
- '@esbuild/linux-ia32@0.25.12':
- optional: true
-
- '@esbuild/linux-ia32@0.27.1':
- optional: true
-
- '@esbuild/linux-loong64@0.25.12':
- optional: true
-
- '@esbuild/linux-loong64@0.27.1':
- optional: true
-
- '@esbuild/linux-mips64el@0.25.12':
- optional: true
-
- '@esbuild/linux-mips64el@0.27.1':
+ '@esbuild/aix-ppc64@0.27.2':
optional: true
- '@esbuild/linux-ppc64@0.25.12':
+ '@esbuild/android-arm64@0.27.2':
optional: true
- '@esbuild/linux-ppc64@0.27.1':
+ '@esbuild/android-arm@0.27.2':
optional: true
- '@esbuild/linux-riscv64@0.25.12':
+ '@esbuild/android-x64@0.27.2':
optional: true
- '@esbuild/linux-riscv64@0.27.1':
+ '@esbuild/darwin-arm64@0.27.2':
optional: true
- '@esbuild/linux-s390x@0.25.12':
+ '@esbuild/darwin-x64@0.27.2':
optional: true
- '@esbuild/linux-s390x@0.27.1':
+ '@esbuild/freebsd-arm64@0.27.2':
optional: true
- '@esbuild/linux-x64@0.25.12':
+ '@esbuild/freebsd-x64@0.27.2':
optional: true
- '@esbuild/linux-x64@0.27.1':
+ '@esbuild/linux-arm64@0.27.2':
optional: true
- '@esbuild/netbsd-arm64@0.25.12':
+ '@esbuild/linux-arm@0.27.2':
optional: true
- '@esbuild/netbsd-arm64@0.27.1':
+ '@esbuild/linux-ia32@0.27.2':
optional: true
- '@esbuild/netbsd-x64@0.25.12':
+ '@esbuild/linux-loong64@0.27.2':
optional: true
- '@esbuild/netbsd-x64@0.27.1':
+ '@esbuild/linux-mips64el@0.27.2':
optional: true
- '@esbuild/openbsd-arm64@0.25.12':
+ '@esbuild/linux-ppc64@0.27.2':
optional: true
- '@esbuild/openbsd-arm64@0.27.1':
+ '@esbuild/linux-riscv64@0.27.2':
optional: true
- '@esbuild/openbsd-x64@0.25.12':
+ '@esbuild/linux-s390x@0.27.2':
optional: true
- '@esbuild/openbsd-x64@0.27.1':
+ '@esbuild/linux-x64@0.27.2':
optional: true
- '@esbuild/openharmony-arm64@0.25.12':
+ '@esbuild/netbsd-arm64@0.27.2':
optional: true
- '@esbuild/openharmony-arm64@0.27.1':
+ '@esbuild/netbsd-x64@0.27.2':
optional: true
- '@esbuild/sunos-x64@0.25.12':
+ '@esbuild/openbsd-arm64@0.27.2':
optional: true
- '@esbuild/sunos-x64@0.27.1':
+ '@esbuild/openbsd-x64@0.27.2':
optional: true
- '@esbuild/win32-arm64@0.25.12':
+ '@esbuild/openharmony-arm64@0.27.2':
optional: true
- '@esbuild/win32-arm64@0.27.1':
+ '@esbuild/sunos-x64@0.27.2':
optional: true
- '@esbuild/win32-ia32@0.25.12':
+ '@esbuild/win32-arm64@0.27.2':
optional: true
- '@esbuild/win32-ia32@0.27.1':
+ '@esbuild/win32-ia32@0.27.2':
optional: true
- '@esbuild/win32-x64@0.25.12':
+ '@esbuild/win32-x64@0.27.2':
optional: true
- '@esbuild/win32-x64@0.27.1':
- optional: true
-
- '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)':
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)':
dependencies:
- eslint: 9.37.0
+ eslint: 9.39.2
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.12.1': {}
+ '@eslint-community/regexpp@4.12.2': {}
- '@eslint/config-array@0.21.0':
+ '@eslint/config-array@0.21.1':
dependencies:
- '@eslint/object-schema': 2.1.6
+ '@eslint/object-schema': 2.1.7
debug: 4.4.3(supports-color@5.5.0)
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
- '@eslint/config-helpers@0.4.0':
+ '@eslint/config-helpers@0.4.2':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
- '@eslint/core@0.16.0':
+ '@eslint/core@0.17.0':
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/eslintrc@3.3.1':
+ '@eslint/eslintrc@3.3.3':
dependencies:
ajv: 6.12.6
debug: 4.4.3(supports-color@5.5.0)
@@ -4349,19 +4321,19 @@ snapshots:
globals: 14.0.0
ignore: 5.3.2
import-fresh: 3.3.1
- js-yaml: 4.1.0
+ js-yaml: 4.1.1
minimatch: 3.1.2
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.37.0': {}
+ '@eslint/js@9.39.2': {}
- '@eslint/object-schema@2.1.6': {}
+ '@eslint/object-schema@2.1.7': {}
- '@eslint/plugin-kit@0.4.0':
+ '@eslint/plugin-kit@0.4.1':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
levn: 0.4.1
'@humanfs/core@0.19.1': {}
@@ -4472,19 +4444,12 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
- '@inquirer/external-editor@1.0.2(@types/node@20.19.21)':
+ '@inquirer/external-editor@1.0.3(@types/node@25.0.2)':
dependencies:
- chardet: 2.1.0
- iconv-lite: 0.7.0
+ chardet: 2.1.1
+ iconv-lite: 0.7.1
optionalDependencies:
- '@types/node': 20.19.21
-
- '@inquirer/external-editor@1.0.2(@types/node@24.10.4)':
- dependencies:
- chardet: 2.1.0
- iconv-lite: 0.7.0
- optionalDependencies:
- '@types/node': 24.10.4
+ '@types/node': 25.0.2
'@isaacs/balanced-match@4.0.1': {}
@@ -4492,6 +4457,16 @@ snapshots:
dependencies:
'@isaacs/balanced-match': 4.0.1
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/sourcemap-codec@1.5.5': {}
@@ -4522,34 +4497,34 @@ snapshots:
globby: 11.1.0
read-yaml-file: 1.1.0
- '@next/env@15.5.9': {}
+ '@next/env@16.1.1': {}
- '@next/eslint-plugin-next@15.5.5':
+ '@next/eslint-plugin-next@15.5.9':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@15.5.7':
+ '@next/swc-darwin-arm64@16.1.1':
optional: true
- '@next/swc-darwin-x64@15.5.7':
+ '@next/swc-darwin-x64@16.1.1':
optional: true
- '@next/swc-linux-arm64-gnu@15.5.7':
+ '@next/swc-linux-arm64-gnu@16.1.1':
optional: true
- '@next/swc-linux-arm64-musl@15.5.7':
+ '@next/swc-linux-arm64-musl@16.1.1':
optional: true
- '@next/swc-linux-x64-gnu@15.5.7':
+ '@next/swc-linux-x64-gnu@16.1.1':
optional: true
- '@next/swc-linux-x64-musl@15.5.7':
+ '@next/swc-linux-x64-musl@16.1.1':
optional: true
- '@next/swc-win32-arm64-msvc@15.5.7':
+ '@next/swc-win32-arm64-msvc@16.1.1':
optional: true
- '@next/swc-win32-x64-msvc@15.5.7':
+ '@next/swc-win32-x64-msvc@16.1.1':
optional: true
'@noble/ciphers@1.3.0': {}
@@ -4574,70 +4549,70 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
- '@rollup/rollup-android-arm-eabi@4.53.3':
+ '@rollup/rollup-android-arm-eabi@4.53.4':
optional: true
- '@rollup/rollup-android-arm64@4.53.3':
+ '@rollup/rollup-android-arm64@4.53.4':
optional: true
- '@rollup/rollup-darwin-arm64@4.53.3':
+ '@rollup/rollup-darwin-arm64@4.53.4':
optional: true
- '@rollup/rollup-darwin-x64@4.53.3':
+ '@rollup/rollup-darwin-x64@4.53.4':
optional: true
- '@rollup/rollup-freebsd-arm64@4.53.3':
+ '@rollup/rollup-freebsd-arm64@4.53.4':
optional: true
- '@rollup/rollup-freebsd-x64@4.53.3':
+ '@rollup/rollup-freebsd-x64@4.53.4':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.53.3':
+ '@rollup/rollup-linux-arm-gnueabihf@4.53.4':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.53.3':
+ '@rollup/rollup-linux-arm-musleabihf@4.53.4':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.53.3':
+ '@rollup/rollup-linux-arm64-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.53.3':
+ '@rollup/rollup-linux-arm64-musl@4.53.4':
optional: true
- '@rollup/rollup-linux-loong64-gnu@4.53.3':
+ '@rollup/rollup-linux-loong64-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.53.3':
+ '@rollup/rollup-linux-ppc64-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.53.3':
+ '@rollup/rollup-linux-riscv64-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.53.3':
+ '@rollup/rollup-linux-riscv64-musl@4.53.4':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.53.3':
+ '@rollup/rollup-linux-s390x-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.53.3':
+ '@rollup/rollup-linux-x64-gnu@4.53.4':
optional: true
- '@rollup/rollup-linux-x64-musl@4.53.3':
+ '@rollup/rollup-linux-x64-musl@4.53.4':
optional: true
- '@rollup/rollup-openharmony-arm64@4.53.3':
+ '@rollup/rollup-openharmony-arm64@4.53.4':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.53.3':
+ '@rollup/rollup-win32-arm64-msvc@4.53.4':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.53.3':
+ '@rollup/rollup-win32-ia32-msvc@4.53.4':
optional: true
- '@rollup/rollup-win32-x64-gnu@4.53.3':
+ '@rollup/rollup-win32-x64-gnu@4.53.4':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.53.3':
+ '@rollup/rollup-win32-x64-msvc@4.53.4':
optional: true
'@scure/base@1.2.6': {}
@@ -4663,7 +4638,7 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {}
- '@tsconfig/node10@1.0.11': {}
+ '@tsconfig/node10@1.0.12': {}
'@tsconfig/node12@1.0.11': {}
@@ -4671,17 +4646,17 @@ snapshots:
'@tsconfig/node16@1.0.4': {}
- '@turbo/gen@1.13.4(@types/node@20.19.21)(typescript@5.9.3)':
+ '@turbo/gen@1.13.4(@types/node@25.0.2)(typescript@5.9.3)':
dependencies:
- '@turbo/workspaces': 1.13.4(@types/node@20.19.21)
+ '@turbo/workspaces': 1.13.4(@types/node@25.0.2)
chalk: 2.4.2
commander: 10.0.1
fs-extra: 10.1.0
- inquirer: 8.2.7(@types/node@20.19.21)
+ inquirer: 8.2.7(@types/node@25.0.2)
minimatch: 9.0.5
node-plop: 0.26.3
proxy-agent: 6.5.0
- ts-node: 10.9.2(@types/node@20.19.21)(typescript@5.9.3)
+ ts-node: 10.9.2(@types/node@25.0.2)(typescript@5.9.3)
update-check: 1.5.4
validate-npm-package-name: 5.0.1
transitivePeerDependencies:
@@ -4691,7 +4666,7 @@ snapshots:
- supports-color
- typescript
- '@turbo/workspaces@1.13.4(@types/node@20.19.21)':
+ '@turbo/workspaces@1.13.4(@types/node@25.0.2)':
dependencies:
chalk: 2.4.2
commander: 10.0.1
@@ -4699,8 +4674,8 @@ snapshots:
fast-glob: 3.3.3
fs-extra: 10.1.0
gradient-string: 2.0.2
- inquirer: 8.2.7(@types/node@20.19.21)
- js-yaml: 4.1.0
+ inquirer: 8.2.7(@types/node@25.0.2)
+ js-yaml: 4.1.1
ora: 4.1.1
rimraf: 3.0.2
semver: 7.7.3
@@ -4720,7 +4695,7 @@ snapshots:
'@types/glob@7.2.0':
dependencies:
'@types/minimatch': 6.0.0
- '@types/node': 20.19.21
+ '@types/node': 25.0.2
'@types/inquirer@6.5.0':
dependencies:
@@ -4735,29 +4710,25 @@ snapshots:
'@types/node@12.20.55': {}
- '@types/node@20.19.21':
- dependencies:
- undici-types: 6.21.0
-
'@types/node@20.19.27':
dependencies:
undici-types: 6.21.0
- '@types/node@24.10.4':
+ '@types/node@25.0.2':
dependencies:
undici-types: 7.16.0
- '@types/react-dom@19.2.3(@types/react@19.2.6)':
+ '@types/react-dom@19.2.3(@types/react@19.2.7)':
dependencies:
- '@types/react': 19.2.6
+ '@types/react': 19.2.7
- '@types/react@19.2.6':
+ '@types/react@19.2.7':
dependencies:
csstype: 3.2.3
'@types/through@0.0.33':
dependencies:
- '@types/node': 20.19.21
+ '@types/node': 25.0.2
'@types/tinycolor2@1.4.6': {}
@@ -4769,100 +4740,98 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3)':
+ '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)':
dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
- '@typescript-eslint/scope-manager': 8.46.1
- '@typescript-eslint/type-utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
- '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
- '@typescript-eslint/visitor-keys': 8.46.1
- eslint: 9.37.0
- graphemer: 1.4.0
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.0
+ eslint: 9.39.2
ignore: 7.0.5
natural-compare: 1.4.0
- ts-api-utils: 2.1.0(typescript@5.8.3)
- typescript: 5.8.3
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3)':
+ '@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.46.1
- '@typescript-eslint/types': 8.46.1
- '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/visitor-keys': 8.46.1
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@5.5.0)
- eslint: 9.37.0
- typescript: 5.8.3
+ eslint: 9.39.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.46.1(typescript@5.8.3)':
+ '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/types': 8.46.1
+ '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.0
debug: 4.4.3(supports-color@5.5.0)
- typescript: 5.8.3
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.46.1':
+ '@typescript-eslint/scope-manager@8.50.0':
dependencies:
- '@typescript-eslint/types': 8.46.1
- '@typescript-eslint/visitor-keys': 8.46.1
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/visitor-keys': 8.50.0
- '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.8.3)':
+ '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)':
dependencies:
- typescript: 5.8.3
+ typescript: 5.9.3
- '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)':
+ '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.46.1
- '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
debug: 4.4.3(supports-color@5.5.0)
- eslint: 9.37.0
- ts-api-utils: 2.1.0(typescript@5.8.3)
- typescript: 5.8.3
+ eslint: 9.39.2
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.46.1': {}
+ '@typescript-eslint/types@8.50.0': {}
- '@typescript-eslint/typescript-estree@8.46.1(typescript@5.8.3)':
+ '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/types': 8.46.1
- '@typescript-eslint/visitor-keys': 8.46.1
+ '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/visitor-keys': 8.50.0
debug: 4.4.3(supports-color@5.5.0)
- fast-glob: 3.3.3
- is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.3
- ts-api-utils: 2.1.0(typescript@5.8.3)
- typescript: 5.8.3
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.8.3)':
+ '@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0)
- '@typescript-eslint/scope-manager': 8.46.1
- '@typescript-eslint/types': 8.46.1
- '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3)
- eslint: 9.37.0
- typescript: 5.8.3
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ eslint: 9.39.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.46.1':
+ '@typescript-eslint/visitor-keys@8.50.0':
dependencies:
- '@typescript-eslint/types': 8.46.1
+ '@typescript-eslint/types': 8.50.0
eslint-visitor-keys: 4.2.1
- '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11))':
+ '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11))':
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.0.15
@@ -4875,7 +4844,7 @@ snapshots:
obug: 2.1.1
std-env: 3.10.0
tinyrainbow: 3.0.3
- vitest: 4.0.15(@types/node@24.10.4)(happy-dom@20.0.11)
+ vitest: 4.0.15(@types/node@25.0.2)(happy-dom@20.0.11)
transitivePeerDependencies:
- supports-color
@@ -4888,13 +4857,13 @@ snapshots:
chai: 6.2.1
tinyrainbow: 3.0.3
- '@vitest/mocker@4.0.15(vite@7.2.7(@types/node@24.10.4))':
+ '@vitest/mocker@4.0.15(vite@7.3.0(@types/node@25.0.2))':
dependencies:
'@vitest/spy': 4.0.15
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 7.2.7(@types/node@24.10.4)
+ vite: 7.3.0(@types/node@25.0.2)
'@vitest/pretty-format@4.0.15':
dependencies:
@@ -4918,13 +4887,15 @@ snapshots:
'@vitest/pretty-format': 4.0.15
tinyrainbow: 3.0.3
- abitype@1.1.0(typescript@5.9.3):
+ abitype@1.1.0(typescript@5.9.3)(zod@4.2.0):
optionalDependencies:
typescript: 5.9.3
+ zod: 4.2.0
- abitype@1.2.2(typescript@5.9.3):
+ abitype@1.2.2(typescript@5.9.3)(zod@4.2.0):
optionalDependencies:
typescript: 5.9.3
+ zod: 4.2.0
acorn-jsx@5.3.2(acorn@8.15.0):
dependencies:
@@ -4993,7 +4964,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
is-string: 1.1.1
@@ -5005,7 +4976,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
es-shim-unscopables: 1.1.0
@@ -5014,21 +4985,21 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-shim-unscopables: 1.1.0
array.prototype.flatmap@1.3.3:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-shim-unscopables: 1.1.0
array.prototype.tosorted@1.1.4:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-shim-unscopables: 1.1.0
@@ -5037,15 +5008,15 @@ snapshots:
array-buffer-byte-length: 1.0.2
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
- asn1js@3.0.6:
+ asn1js@3.0.7:
dependencies:
pvtsutils: 1.3.6
- pvutils: 1.1.3
+ pvutils: 1.1.5
tslib: 2.8.1
assertion-error@2.0.1: {}
@@ -5070,6 +5041,8 @@ snapshots:
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.9.11: {}
+
basic-ftp@5.0.5: {}
better-path-resolve@1.0.0:
@@ -5097,6 +5070,14 @@ snapshots:
dependencies:
fill-range: 7.1.1
+ browserslist@4.28.1:
+ dependencies:
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ electron-to-chromium: 1.5.267
+ node-releases: 2.0.27
+ update-browserslist-db: 1.2.2(browserslist@4.28.1)
+
buffer@5.7.1:
dependencies:
base64-js: 1.5.1
@@ -5128,7 +5109,7 @@ snapshots:
no-case: 2.3.2
upper-case: 1.1.3
- caniuse-lite@1.0.30001760: {}
+ caniuse-lite@1.0.30001761: {}
cbor2@1.12.0: {}
@@ -5179,7 +5160,7 @@ snapshots:
chardet@0.7.0: {}
- chardet@2.1.0: {}
+ chardet@2.1.1: {}
chokidar@3.6.0:
dependencies:
@@ -5257,7 +5238,9 @@ snapshots:
snake-case: 2.1.0
upper-case: 1.1.3
- core-js-pure@3.46.0: {}
+ convert-source-map@2.0.0: {}
+
+ core-js-pure@3.47.0: {}
cosmiconfig@9.0.0(typescript@5.9.3):
dependencies:
@@ -5375,6 +5358,8 @@ snapshots:
'@standard-schema/spec': 1.0.0
fast-check: 3.23.2
+ electron-to-chromium@1.5.267: {}
+
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
@@ -5390,7 +5375,7 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
- es-abstract@1.24.0:
+ es-abstract@1.24.1:
dependencies:
array-buffer-byte-length: 1.0.2
arraybuffer.prototype.slice: 1.0.4
@@ -5451,12 +5436,12 @@ snapshots:
es-errors@1.3.0: {}
- es-iterator-helpers@1.2.1:
+ es-iterator-helpers@1.2.2:
dependencies:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-set-tostringtag: 2.1.0
function-bind: 1.1.2
@@ -5493,63 +5478,34 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild@0.25.12:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.12
- '@esbuild/android-arm': 0.25.12
- '@esbuild/android-arm64': 0.25.12
- '@esbuild/android-x64': 0.25.12
- '@esbuild/darwin-arm64': 0.25.12
- '@esbuild/darwin-x64': 0.25.12
- '@esbuild/freebsd-arm64': 0.25.12
- '@esbuild/freebsd-x64': 0.25.12
- '@esbuild/linux-arm': 0.25.12
- '@esbuild/linux-arm64': 0.25.12
- '@esbuild/linux-ia32': 0.25.12
- '@esbuild/linux-loong64': 0.25.12
- '@esbuild/linux-mips64el': 0.25.12
- '@esbuild/linux-ppc64': 0.25.12
- '@esbuild/linux-riscv64': 0.25.12
- '@esbuild/linux-s390x': 0.25.12
- '@esbuild/linux-x64': 0.25.12
- '@esbuild/netbsd-arm64': 0.25.12
- '@esbuild/netbsd-x64': 0.25.12
- '@esbuild/openbsd-arm64': 0.25.12
- '@esbuild/openbsd-x64': 0.25.12
- '@esbuild/openharmony-arm64': 0.25.12
- '@esbuild/sunos-x64': 0.25.12
- '@esbuild/win32-arm64': 0.25.12
- '@esbuild/win32-ia32': 0.25.12
- '@esbuild/win32-x64': 0.25.12
-
- esbuild@0.27.1:
+ esbuild@0.27.2:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.1
- '@esbuild/android-arm': 0.27.1
- '@esbuild/android-arm64': 0.27.1
- '@esbuild/android-x64': 0.27.1
- '@esbuild/darwin-arm64': 0.27.1
- '@esbuild/darwin-x64': 0.27.1
- '@esbuild/freebsd-arm64': 0.27.1
- '@esbuild/freebsd-x64': 0.27.1
- '@esbuild/linux-arm': 0.27.1
- '@esbuild/linux-arm64': 0.27.1
- '@esbuild/linux-ia32': 0.27.1
- '@esbuild/linux-loong64': 0.27.1
- '@esbuild/linux-mips64el': 0.27.1
- '@esbuild/linux-ppc64': 0.27.1
- '@esbuild/linux-riscv64': 0.27.1
- '@esbuild/linux-s390x': 0.27.1
- '@esbuild/linux-x64': 0.27.1
- '@esbuild/netbsd-arm64': 0.27.1
- '@esbuild/netbsd-x64': 0.27.1
- '@esbuild/openbsd-arm64': 0.27.1
- '@esbuild/openbsd-x64': 0.27.1
- '@esbuild/openharmony-arm64': 0.27.1
- '@esbuild/sunos-x64': 0.27.1
- '@esbuild/win32-arm64': 0.27.1
- '@esbuild/win32-ia32': 0.27.1
- '@esbuild/win32-x64': 0.27.1
+ '@esbuild/aix-ppc64': 0.27.2
+ '@esbuild/android-arm': 0.27.2
+ '@esbuild/android-arm64': 0.27.2
+ '@esbuild/android-x64': 0.27.2
+ '@esbuild/darwin-arm64': 0.27.2
+ '@esbuild/darwin-x64': 0.27.2
+ '@esbuild/freebsd-arm64': 0.27.2
+ '@esbuild/freebsd-x64': 0.27.2
+ '@esbuild/linux-arm': 0.27.2
+ '@esbuild/linux-arm64': 0.27.2
+ '@esbuild/linux-ia32': 0.27.2
+ '@esbuild/linux-loong64': 0.27.2
+ '@esbuild/linux-mips64el': 0.27.2
+ '@esbuild/linux-ppc64': 0.27.2
+ '@esbuild/linux-riscv64': 0.27.2
+ '@esbuild/linux-s390x': 0.27.2
+ '@esbuild/linux-x64': 0.27.2
+ '@esbuild/netbsd-arm64': 0.27.2
+ '@esbuild/netbsd-x64': 0.27.2
+ '@esbuild/openbsd-arm64': 0.27.2
+ '@esbuild/openbsd-x64': 0.27.2
+ '@esbuild/openharmony-arm64': 0.27.2
+ '@esbuild/sunos-x64': 0.27.2
+ '@esbuild/win32-arm64': 0.27.2
+ '@esbuild/win32-ia32': 0.27.2
+ '@esbuild/win32-x64': 0.27.2
escalade@3.2.0: {}
@@ -5565,25 +5521,32 @@ snapshots:
optionalDependencies:
source-map: 0.6.1
- eslint-config-prettier@9.1.2(eslint@9.37.0):
+ eslint-config-prettier@10.1.8(eslint@9.39.2):
dependencies:
- eslint: 9.37.0
+ eslint: 9.39.2
eslint-plugin-only-warn@1.1.0: {}
- eslint-plugin-react-hooks@5.2.0(eslint@9.37.0):
+ eslint-plugin-react-hooks@7.0.1(eslint@9.39.2):
dependencies:
- eslint: 9.37.0
+ '@babel/core': 7.28.5
+ '@babel/parser': 7.28.5
+ eslint: 9.39.2
+ hermes-parser: 0.25.1
+ zod: 4.2.0
+ zod-validation-error: 4.0.2(zod@4.2.0)
+ transitivePeerDependencies:
+ - supports-color
- eslint-plugin-react@7.37.5(eslint@9.37.0):
+ eslint-plugin-react@7.37.5(eslint@9.39.2):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
array.prototype.flatmap: 1.3.3
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
- es-iterator-helpers: 1.2.1
- eslint: 9.37.0
+ es-iterator-helpers: 1.2.2
+ eslint: 9.39.2
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
@@ -5597,11 +5560,11 @@ snapshots:
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
- eslint-plugin-turbo@2.5.8(eslint@9.37.0)(turbo@2.6.3):
+ eslint-plugin-turbo@2.6.3(eslint@9.39.2)(turbo@2.7.2):
dependencies:
dotenv: 16.0.3
- eslint: 9.37.0
- turbo: 2.6.3
+ eslint: 9.39.2
+ turbo: 2.7.2
eslint-scope@8.4.0:
dependencies:
@@ -5612,21 +5575,20 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint@9.37.0:
+ eslint@9.39.2:
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0)
- '@eslint-community/regexpp': 4.12.1
- '@eslint/config-array': 0.21.0
- '@eslint/config-helpers': 0.4.0
- '@eslint/core': 0.16.0
- '@eslint/eslintrc': 3.3.1
- '@eslint/js': 9.37.0
- '@eslint/plugin-kit': 0.4.0
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.1
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.3
+ '@eslint/js': 9.39.2
+ '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
'@types/estree': 1.0.8
- '@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
@@ -5807,6 +5769,8 @@ snapshots:
generator-function@2.0.1: {}
+ gensync@1.0.0-beta.2: {}
+
get-caller-file@2.0.5: {}
get-east-asian-width@1.4.0: {}
@@ -5870,7 +5834,7 @@ snapshots:
globals@14.0.0: {}
- globals@15.15.0: {}
+ globals@16.5.0: {}
globalthis@1.0.4:
dependencies:
@@ -5915,8 +5879,6 @@ snapshots:
chalk: 4.1.2
tinygradient: 1.1.5
- graphemer@1.4.0: {}
-
handlebars@4.7.8:
dependencies:
minimist: 1.2.8
@@ -5961,6 +5923,12 @@ snapshots:
no-case: 2.3.2
upper-case: 1.1.3
+ hermes-estree@0.25.1: {}
+
+ hermes-parser@0.25.1:
+ dependencies:
+ hermes-estree: 0.25.1
+
hosted-git-info@8.1.0:
dependencies:
lru-cache: 10.4.3
@@ -5981,7 +5949,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- human-id@4.1.2: {}
+ human-id@4.1.3: {}
human-signals@2.1.0: {}
@@ -5989,7 +5957,7 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
- iconv-lite@0.7.0:
+ iconv-lite@0.7.1:
dependencies:
safer-buffer: 2.1.2
@@ -6037,9 +6005,9 @@ snapshots:
strip-ansi: 6.0.1
through: 2.3.8
- inquirer@8.2.7(@types/node@20.19.21):
+ inquirer@8.2.7(@types/node@25.0.2):
dependencies:
- '@inquirer/external-editor': 1.0.2(@types/node@20.19.21)
+ '@inquirer/external-editor': 1.0.3(@types/node@25.0.2)
ansi-escapes: 4.3.2
chalk: 4.1.2
cli-cursor: 3.1.0
@@ -6063,7 +6031,7 @@ snapshots:
hasown: 2.0.2
side-channel: 1.1.0
- ip-address@10.0.1: {}
+ ip-address@10.1.0: {}
is-array-buffer@3.0.5:
dependencies:
@@ -6255,19 +6223,17 @@ snapshots:
js-tokens@9.0.1: {}
- js-yaml@3.14.1:
+ js-yaml@3.14.2:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
- js-yaml@4.1.0:
- dependencies:
- argparse: 2.0.1
-
js-yaml@4.1.1:
dependencies:
argparse: 2.0.1
+ jsesc@3.1.0: {}
+
json-buffer@3.0.1: {}
json-canonicalize@2.0.0: {}
@@ -6278,6 +6244,8 @@ snapshots:
json-stable-stringify-without-jsonify@1.0.1: {}
+ json5@2.2.3: {}
+
jsonc-parser@3.3.1: {}
jsonfile@4.0.0:
@@ -6305,48 +6273,48 @@ snapshots:
kleur@3.0.3: {}
- lefthook-darwin-arm64@2.0.11:
+ lefthook-darwin-arm64@2.0.12:
optional: true
- lefthook-darwin-x64@2.0.11:
+ lefthook-darwin-x64@2.0.12:
optional: true
- lefthook-freebsd-arm64@2.0.11:
+ lefthook-freebsd-arm64@2.0.12:
optional: true
- lefthook-freebsd-x64@2.0.11:
+ lefthook-freebsd-x64@2.0.12:
optional: true
- lefthook-linux-arm64@2.0.11:
+ lefthook-linux-arm64@2.0.12:
optional: true
- lefthook-linux-x64@2.0.11:
+ lefthook-linux-x64@2.0.12:
optional: true
- lefthook-openbsd-arm64@2.0.11:
+ lefthook-openbsd-arm64@2.0.12:
optional: true
- lefthook-openbsd-x64@2.0.11:
+ lefthook-openbsd-x64@2.0.12:
optional: true
- lefthook-windows-arm64@2.0.11:
+ lefthook-windows-arm64@2.0.12:
optional: true
- lefthook-windows-x64@2.0.11:
+ lefthook-windows-x64@2.0.12:
optional: true
- lefthook@2.0.11:
+ lefthook@2.0.12:
optionalDependencies:
- lefthook-darwin-arm64: 2.0.11
- lefthook-darwin-x64: 2.0.11
- lefthook-freebsd-arm64: 2.0.11
- lefthook-freebsd-x64: 2.0.11
- lefthook-linux-arm64: 2.0.11
- lefthook-linux-x64: 2.0.11
- lefthook-openbsd-arm64: 2.0.11
- lefthook-openbsd-x64: 2.0.11
- lefthook-windows-arm64: 2.0.11
- lefthook-windows-x64: 2.0.11
+ lefthook-darwin-arm64: 2.0.12
+ lefthook-darwin-x64: 2.0.12
+ lefthook-freebsd-arm64: 2.0.12
+ lefthook-freebsd-x64: 2.0.12
+ lefthook-linux-arm64: 2.0.12
+ lefthook-linux-x64: 2.0.12
+ lefthook-openbsd-arm64: 2.0.12
+ lefthook-openbsd-x64: 2.0.12
+ lefthook-windows-arm64: 2.0.12
+ lefthook-windows-x64: 2.0.12
levn@0.4.1:
dependencies:
@@ -6399,6 +6367,10 @@ snapshots:
lru-cache@11.2.4: {}
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
lru-cache@7.18.3: {}
magic-string@0.30.21:
@@ -6470,24 +6442,25 @@ snapshots:
netmask@2.0.2: {}
- next@15.5.9(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
+ next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies:
- '@next/env': 15.5.9
+ '@next/env': 16.1.1
'@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001760
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
postcss: 8.4.31
- react: 19.2.0
- react-dom: 19.2.0(react@19.2.0)
- styled-jsx: 5.1.6(react@19.2.0)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ styled-jsx: 5.1.6(react@19.2.3)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.5.7
- '@next/swc-darwin-x64': 15.5.7
- '@next/swc-linux-arm64-gnu': 15.5.7
- '@next/swc-linux-arm64-musl': 15.5.7
- '@next/swc-linux-x64-gnu': 15.5.7
- '@next/swc-linux-x64-musl': 15.5.7
- '@next/swc-win32-arm64-msvc': 15.5.7
- '@next/swc-win32-x64-msvc': 15.5.7
+ '@next/swc-darwin-arm64': 16.1.1
+ '@next/swc-darwin-x64': 16.1.1
+ '@next/swc-linux-arm64-gnu': 16.1.1
+ '@next/swc-linux-arm64-musl': 16.1.1
+ '@next/swc-linux-x64-gnu': 16.1.1
+ '@next/swc-linux-x64-musl': 16.1.1
+ '@next/swc-win32-arm64-msvc': 16.1.1
+ '@next/swc-win32-x64-msvc': 16.1.1
sharp: 0.34.5
transitivePeerDependencies:
- '@babel/core'
@@ -6509,7 +6482,9 @@ snapshots:
isbinaryfile: 4.0.10
lodash.get: 4.4.2
mkdirp: 0.5.6
- resolve: 1.22.10
+ resolve: 1.22.11
+
+ node-releases@2.0.27: {}
nodemon@3.1.11:
dependencies:
@@ -6563,7 +6538,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
object.values@1.2.1:
@@ -6641,7 +6616,7 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
- ox@0.9.17(typescript@5.9.3):
+ ox@0.9.17(typescript@5.9.3)(zod@4.2.0):
dependencies:
'@adraffy/ens-normalize': 1.11.1
'@noble/ciphers': 1.3.0
@@ -6649,7 +6624,7 @@ snapshots:
'@noble/hashes': 1.8.0
'@scure/bip32': 1.7.0
'@scure/bip39': 1.6.0
- abitype: 1.2.2(typescript@5.9.3)
+ abitype: 1.2.2(typescript@5.9.3)(zod@4.2.0)
eventemitter3: 5.0.1
optionalDependencies:
typescript: 5.9.3
@@ -6759,13 +6734,13 @@ snapshots:
pify@4.0.1: {}
- pkijs@3.3.0:
+ pkijs@3.3.3:
dependencies:
'@noble/hashes': 1.4.0
- asn1js: 3.0.6
+ asn1js: 3.0.7
bytestreamjs: 2.0.1
pvtsutils: 1.3.6
- pvutils: 1.1.3
+ pvutils: 1.1.5
tslib: 2.8.1
possible-typed-array-names@1.1.0: {}
@@ -6786,7 +6761,7 @@ snapshots:
prettier@2.8.8: {}
- prettier@3.6.2: {}
+ prettier@3.7.4: {}
proc-log@5.0.0: {}
@@ -6826,7 +6801,7 @@ snapshots:
dependencies:
tslib: 2.8.1
- pvutils@1.1.3: {}
+ pvutils@1.1.5: {}
quansync@0.2.11: {}
@@ -6839,19 +6814,19 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
- react-dom@19.2.0(react@19.2.0):
+ react-dom@19.2.3(react@19.2.3):
dependencies:
- react: 19.2.0
+ react: 19.2.3
scheduler: 0.27.0
react-is@16.13.1: {}
- react@19.2.0: {}
+ react@19.2.3: {}
read-yaml-file@1.1.0:
dependencies:
graceful-fs: 4.2.11
- js-yaml: 3.14.1
+ js-yaml: 3.14.2
pify: 4.0.1
strip-bom: 3.0.0
@@ -6874,7 +6849,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@@ -6905,7 +6880,7 @@ snapshots:
resolve-from@5.0.0: {}
- resolve@1.22.10:
+ resolve@1.22.11:
dependencies:
is-core-module: 2.16.1
path-parse: 1.0.7
@@ -6938,32 +6913,32 @@ snapshots:
glob: 13.0.0
package-json-from-dist: 1.0.1
- rollup@4.53.3:
+ rollup@4.53.4:
dependencies:
'@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.53.3
- '@rollup/rollup-android-arm64': 4.53.3
- '@rollup/rollup-darwin-arm64': 4.53.3
- '@rollup/rollup-darwin-x64': 4.53.3
- '@rollup/rollup-freebsd-arm64': 4.53.3
- '@rollup/rollup-freebsd-x64': 4.53.3
- '@rollup/rollup-linux-arm-gnueabihf': 4.53.3
- '@rollup/rollup-linux-arm-musleabihf': 4.53.3
- '@rollup/rollup-linux-arm64-gnu': 4.53.3
- '@rollup/rollup-linux-arm64-musl': 4.53.3
- '@rollup/rollup-linux-loong64-gnu': 4.53.3
- '@rollup/rollup-linux-ppc64-gnu': 4.53.3
- '@rollup/rollup-linux-riscv64-gnu': 4.53.3
- '@rollup/rollup-linux-riscv64-musl': 4.53.3
- '@rollup/rollup-linux-s390x-gnu': 4.53.3
- '@rollup/rollup-linux-x64-gnu': 4.53.3
- '@rollup/rollup-linux-x64-musl': 4.53.3
- '@rollup/rollup-openharmony-arm64': 4.53.3
- '@rollup/rollup-win32-arm64-msvc': 4.53.3
- '@rollup/rollup-win32-ia32-msvc': 4.53.3
- '@rollup/rollup-win32-x64-gnu': 4.53.3
- '@rollup/rollup-win32-x64-msvc': 4.53.3
+ '@rollup/rollup-android-arm-eabi': 4.53.4
+ '@rollup/rollup-android-arm64': 4.53.4
+ '@rollup/rollup-darwin-arm64': 4.53.4
+ '@rollup/rollup-darwin-x64': 4.53.4
+ '@rollup/rollup-freebsd-arm64': 4.53.4
+ '@rollup/rollup-freebsd-x64': 4.53.4
+ '@rollup/rollup-linux-arm-gnueabihf': 4.53.4
+ '@rollup/rollup-linux-arm-musleabihf': 4.53.4
+ '@rollup/rollup-linux-arm64-gnu': 4.53.4
+ '@rollup/rollup-linux-arm64-musl': 4.53.4
+ '@rollup/rollup-linux-loong64-gnu': 4.53.4
+ '@rollup/rollup-linux-ppc64-gnu': 4.53.4
+ '@rollup/rollup-linux-riscv64-gnu': 4.53.4
+ '@rollup/rollup-linux-riscv64-musl': 4.53.4
+ '@rollup/rollup-linux-s390x-gnu': 4.53.4
+ '@rollup/rollup-linux-x64-gnu': 4.53.4
+ '@rollup/rollup-linux-x64-musl': 4.53.4
+ '@rollup/rollup-openharmony-arm64': 4.53.4
+ '@rollup/rollup-win32-arm64-msvc': 4.53.4
+ '@rollup/rollup-win32-ia32-msvc': 4.53.4
+ '@rollup/rollup-win32-x64-gnu': 4.53.4
+ '@rollup/rollup-win32-x64-msvc': 4.53.4
fsevents: 2.3.3
run-async@2.4.1: {}
@@ -7136,7 +7111,7 @@ snapshots:
socks@2.8.7:
dependencies:
- ip-address: 10.0.1
+ ip-address: 10.1.0
smart-buffer: 4.2.0
source-map-js@1.2.1: {}
@@ -7178,7 +7153,7 @@ snapshots:
call-bind: 1.0.8
call-bound: 1.0.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
get-intrinsic: 1.3.0
@@ -7192,7 +7167,7 @@ snapshots:
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
string.prototype.trim@1.2.10:
dependencies:
@@ -7200,7 +7175,7 @@ snapshots:
call-bound: 1.0.4
define-data-property: 1.1.4
define-properties: 1.2.1
- es-abstract: 1.24.0
+ es-abstract: 1.24.1
es-object-atoms: 1.1.1
has-property-descriptors: 1.0.2
@@ -7239,10 +7214,10 @@ snapshots:
strip-json-comments@3.1.1: {}
- styled-jsx@5.1.6(react@19.2.0):
+ styled-jsx@5.1.6(react@19.2.3):
dependencies:
client-only: 0.0.1
- react: 19.2.0
+ react: 19.2.3
supports-color@5.5.0:
dependencies:
@@ -7326,18 +7301,18 @@ snapshots:
tree-kill@1.2.2: {}
- ts-api-utils@2.1.0(typescript@5.8.3):
+ ts-api-utils@2.1.0(typescript@5.9.3):
dependencies:
- typescript: 5.8.3
+ typescript: 5.9.3
- ts-node@10.9.2(@types/node@20.19.21)(typescript@5.9.3):
+ ts-node@10.9.2(@types/node@25.0.2)(typescript@5.9.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
- '@tsconfig/node10': 1.0.11
+ '@tsconfig/node10': 1.0.12
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.4
- '@types/node': 20.19.21
+ '@types/node': 25.0.2
acorn: 8.15.0
acorn-walk: 8.3.4
arg: 4.1.3
@@ -7357,21 +7332,39 @@ snapshots:
turbo-darwin-64@2.6.3:
optional: true
+ turbo-darwin-64@2.7.2:
+ optional: true
+
turbo-darwin-arm64@2.6.3:
optional: true
+ turbo-darwin-arm64@2.7.2:
+ optional: true
+
turbo-linux-64@2.6.3:
optional: true
+ turbo-linux-64@2.7.2:
+ optional: true
+
turbo-linux-arm64@2.6.3:
optional: true
+ turbo-linux-arm64@2.7.2:
+ optional: true
+
turbo-windows-64@2.6.3:
optional: true
+ turbo-windows-64@2.7.2:
+ optional: true
+
turbo-windows-arm64@2.6.3:
optional: true
+ turbo-windows-arm64@2.7.2:
+ optional: true
+
turbo@2.6.3:
optionalDependencies:
turbo-darwin-64: 2.6.3
@@ -7381,6 +7374,15 @@ snapshots:
turbo-windows-64: 2.6.3
turbo-windows-arm64: 2.6.3
+ turbo@2.7.2:
+ optionalDependencies:
+ turbo-darwin-64: 2.7.2
+ turbo-darwin-arm64: 2.7.2
+ turbo-linux-64: 2.7.2
+ turbo-linux-arm64: 2.7.2
+ turbo-windows-64: 2.7.2
+ turbo-windows-arm64: 2.7.2
+
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
@@ -7420,19 +7422,17 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typescript-eslint@8.46.1(eslint@9.37.0)(typescript@5.8.3):
+ typescript-eslint@8.50.0(eslint@9.39.2)(typescript@5.9.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.8.3))(eslint@9.37.0)(typescript@5.8.3)
- '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
- '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.8.3)
- '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.8.3)
- eslint: 9.37.0
- typescript: 5.8.3
+ '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ eslint: 9.39.2
+ typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- typescript@5.8.3: {}
-
typescript@5.9.3: {}
uglify-js@3.19.3:
@@ -7457,6 +7457,12 @@ snapshots:
universalify@2.0.1: {}
+ update-browserslist-db@1.2.2(browserslist@4.28.1):
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
update-check@1.5.4:
dependencies:
registry-auth-token: 3.3.2
@@ -7482,15 +7488,15 @@ snapshots:
validate-npm-package-name@6.0.2: {}
- viem@2.42.0(typescript@5.9.3):
+ viem@2.42.1(typescript@5.9.3)(zod@4.2.0):
dependencies:
'@noble/curves': 1.9.1
'@noble/hashes': 1.8.0
'@scure/bip32': 1.7.0
'@scure/bip39': 1.6.0
- abitype: 1.1.0(typescript@5.9.3)
+ abitype: 1.1.0(typescript@5.9.3)(zod@4.2.0)
isows: 1.0.7(ws@8.18.3)
- ox: 0.9.17(typescript@5.9.3)
+ ox: 0.9.17(typescript@5.9.3)(zod@4.2.0)
ws: 8.18.3
optionalDependencies:
typescript: 5.9.3
@@ -7499,22 +7505,22 @@ snapshots:
- utf-8-validate
- zod
- vite@7.2.7(@types/node@24.10.4):
+ vite@7.3.0(@types/node@25.0.2):
dependencies:
- esbuild: 0.25.12
+ esbuild: 0.27.2
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
- rollup: 4.53.3
+ rollup: 4.53.4
tinyglobby: 0.2.15
optionalDependencies:
- '@types/node': 24.10.4
+ '@types/node': 25.0.2
fsevents: 2.3.3
- vitest@4.0.15(@types/node@24.10.4)(happy-dom@20.0.11):
+ vitest@4.0.15(@types/node@25.0.2)(happy-dom@20.0.11):
dependencies:
'@vitest/expect': 4.0.15
- '@vitest/mocker': 4.0.15(vite@7.2.7(@types/node@24.10.4))
+ '@vitest/mocker': 4.0.15(vite@7.3.0(@types/node@25.0.2))
'@vitest/pretty-format': 4.0.15
'@vitest/runner': 4.0.15
'@vitest/snapshot': 4.0.15
@@ -7531,10 +7537,10 @@ snapshots:
tinyexec: 1.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vite: 7.2.7(@types/node@24.10.4)
+ vite: 7.3.0(@types/node@25.0.2)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 24.10.4
+ '@types/node': 25.0.2
happy-dom: 20.0.11
transitivePeerDependencies:
- jiti
@@ -7633,6 +7639,8 @@ snapshots:
y18n@5.0.8: {}
+ yallist@3.1.1: {}
+
yargs-parser@21.1.1: {}
yargs-parser@22.0.0: {}
@@ -7659,3 +7667,9 @@ snapshots:
yn@3.1.1: {}
yocto-queue@0.1.0: {}
+
+ zod-validation-error@4.0.2(zod@4.2.0):
+ dependencies:
+ zod: 4.2.0
+
+ zod@4.2.0: {}
diff --git a/repo/eslint-config/package.json b/repo/eslint-config/package.json
index 7fa53be38..5625bc699 100644
--- a/repo/eslint-config/package.json
+++ b/repo/eslint-config/package.json
@@ -9,16 +9,16 @@
"./react-internal": "./react-internal.js"
},
"devDependencies": {
- "@eslint/js": "^9.28.0",
- "@next/eslint-plugin-next": "^15.3.3",
- "eslint": "^9.28.0",
- "eslint-config-prettier": "^9.1.0",
+ "@eslint/js": "^9.39.2",
+ "@next/eslint-plugin-next": "^15.5.9",
+ "eslint": "^9.39.2",
+ "eslint-config-prettier": "^10.1.8",
"eslint-plugin-only-warn": "^1.1.0",
"eslint-plugin-react": "^7.37.5",
- "eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-turbo": "^2.5.4",
- "globals": "^15.15.0",
- "typescript": "^5.8.3",
- "typescript-eslint": "^8.33.1"
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-turbo": "^2.6.3",
+ "globals": "^16.5.0",
+ "typescript": "^5.9.3",
+ "typescript-eslint": "^8.49.0"
}
}
diff --git a/repo/ui/package.json b/repo/ui/package.json
index 226eed0d9..6b380862e 100644
--- a/repo/ui/package.json
+++ b/repo/ui/package.json
@@ -13,16 +13,16 @@
"typecheck": "tsc --noEmit"
},
"devDependencies": {
- "@repo/eslint-config": "workspace:*",
- "@repo/typescript-config": "workspace:*",
+ "@repo/eslint-config": "workspace:^",
+ "@repo/typescript-config": "workspace:^",
"@turbo/gen": "^1.13.4",
- "@types/node": "^20.17.57",
- "@types/react": "^19.2.6",
+ "@types/node": "^25.0.2",
+ "@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
- "typescript": "^5.8.3"
+ "typescript": "^5.9.3"
},
"dependencies": {
- "react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3"
}
}
diff --git a/wagmi-project/.changeset/README.md b/wagmi-project/.changeset/README.md
new file mode 100644
index 000000000..e5b6d8d6a
--- /dev/null
+++ b/wagmi-project/.changeset/README.md
@@ -0,0 +1,8 @@
+# Changesets
+
+Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
+with multi-package repos, or single-package repos to help you version and publish your code. You can
+find the full documentation for it [in our repository](https://github.com/changesets/changesets)
+
+We have a quick list of common questions to get you started engaging with this project in
+[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
diff --git a/wagmi-project/.changeset/config.json b/wagmi-project/.changeset/config.json
new file mode 100644
index 000000000..c47279e4c
--- /dev/null
+++ b/wagmi-project/.changeset/config.json
@@ -0,0 +1,19 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
+ "access": "public",
+ "baseBranch": "main",
+ "changelog": ["@changesets/changelog-github", { "repo": "wevm/wagmi" }],
+ "commit": false,
+ "ignore": [
+ "*-register",
+ "@wagmi/test",
+ "site",
+ "next-app",
+ "nuxt-app",
+ "vite-*"
+ ],
+ "updateInternalDependencies": "patch",
+ "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
+ "onlyUpdatePeerDependentsWhenOutOfRange": true
+ }
+}
diff --git a/wagmi-project/.changeset/new-elephants-travel.md b/wagmi-project/.changeset/new-elephants-travel.md
new file mode 100644
index 000000000..ddfb37374
--- /dev/null
+++ b/wagmi-project/.changeset/new-elephants-travel.md
@@ -0,0 +1,5 @@
+---
+"@wagmi/cli": patch
+---
+
+Updated block explorer chains.
diff --git a/wagmi-project/.changeset/nice-pandas-clap.md b/wagmi-project/.changeset/nice-pandas-clap.md
new file mode 100644
index 000000000..7f4af5301
--- /dev/null
+++ b/wagmi-project/.changeset/nice-pandas-clap.md
@@ -0,0 +1,5 @@
+---
+
+---
+
+Circleci project setup
diff --git a/wagmi-project/.changeset/quick-hairs-scream.md b/wagmi-project/.changeset/quick-hairs-scream.md
new file mode 100644
index 000000000..206e94e24
--- /dev/null
+++ b/wagmi-project/.changeset/quick-hairs-scream.md
@@ -0,0 +1,6 @@
+---
+"wagmi": patch
+"@wagmi/core": patch
+---
+
+Added `chainId` parameter to `getCapabilities`/`useCapabilities`.
diff --git a/wagmi-project/.changeset/spicy-bats-juggle.md b/wagmi-project/.changeset/spicy-bats-juggle.md
new file mode 100644
index 000000000..cf7a15422
--- /dev/null
+++ b/wagmi-project/.changeset/spicy-bats-juggle.md
@@ -0,0 +1,6 @@
+---
+"@wagmi/cli": patch
+"site": patch
+---
+
+Circleci project setup
diff --git a/wagmi-project/.changeset/tall-fans-mate.md b/wagmi-project/.changeset/tall-fans-mate.md
new file mode 100644
index 000000000..cf7a15422
--- /dev/null
+++ b/wagmi-project/.changeset/tall-fans-mate.md
@@ -0,0 +1,6 @@
+---
+"@wagmi/cli": patch
+"site": patch
+---
+
+Circleci project setup
diff --git a/wagmi-project/.changeset/tiny-laws-dream.md b/wagmi-project/.changeset/tiny-laws-dream.md
new file mode 100644
index 000000000..c39a3d68b
--- /dev/null
+++ b/wagmi-project/.changeset/tiny-laws-dream.md
@@ -0,0 +1,5 @@
+---
+"@fake-scope/fake-pkg": patch
+---
+
+Circleci project setup
diff --git a/wagmi-project/.changeset/young-guests-care.md b/wagmi-project/.changeset/young-guests-care.md
new file mode 100644
index 000000000..8de2292dd
--- /dev/null
+++ b/wagmi-project/.changeset/young-guests-care.md
@@ -0,0 +1,5 @@
+---
+"site": patch
+---
+
+docs(readme): fix typo
diff --git a/wagmi-project/.circleci/config.yml b/wagmi-project/.circleci/config.yml
new file mode 100644
index 000000000..edb6605e3
--- /dev/null
+++ b/wagmi-project/.circleci/config.yml
@@ -0,0 +1,26 @@
+# Use the latest 2.1 version of CircleCI pipeline process engine.
+# See: https://circleci.com/docs/configuration-reference
+
+version: 2.1
+executors:
+ my-custom-executor:
+ docker:
+ - image: cimg/base:stable
+ auth:
+ # ensure you have first added these secrets
+ # visit app.circleci.com/settings/project/github/Dargon789/foundry/environment-variables
+ username: $DOCKER_HUB_USER
+ password: $DOCKER_HUB_PASSWORD
+jobs:
+ web3-defi-game-project-:
+
+ executor: my-custom-executor
+ steps:
+ - checkout
+ - run: |
+ # echo Hello, World!
+
+workflows:
+ my-custom-workflow:
+ jobs:
+ - web3-defi-game-project-
diff --git a/wagmi-project/.github/CODEOWNERS b/wagmi-project/.github/CODEOWNERS
new file mode 100644
index 000000000..12451d4bc
--- /dev/null
+++ b/wagmi-project/.github/CODEOWNERS
@@ -0,0 +1,5 @@
+@tmm @jxom
+
+/packages/connectors/src/metaMask @ecp4224 @omridan159 @abretonc7s @elefantel @BjornGunnarsson @EdouardBougon
+/packages/connectors/src/safe @DaniSomoza @dasanra @mikhailxyz @yagopv
+/packages/connectors/src/walletConnect @ganchoradkov @glitch-txs @ignaciosantise @tomiir
diff --git a/wagmi-project/.github/CONTRIBUTING.md b/wagmi-project/.github/CONTRIBUTING.md
new file mode 100644
index 000000000..d3ab387e1
--- /dev/null
+++ b/wagmi-project/.github/CONTRIBUTING.md
@@ -0,0 +1 @@
+[View Contributing Guide on wagmi.sh](https://wagmi.sh/dev/contributing)
\ No newline at end of file
diff --git a/wagmi-project/.github/DISCUSSION_TEMPLATE/connector-request.yml b/wagmi-project/.github/DISCUSSION_TEMPLATE/connector-request.yml
new file mode 100644
index 000000000..c1e31b1b6
--- /dev/null
+++ b/wagmi-project/.github/DISCUSSION_TEMPLATE/connector-request.yml
@@ -0,0 +1,51 @@
+title: '[Connector Request] '
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for your interest in contributing a new Connector to the Wagmi! If you haven't already, please read the [Contributing Guidelines](https://wagmi.sh/dev/contributing). Once you submit the form, the Wagmi team will follow up in the discussion thread to discuss next steps.
+
+ Please note that in order for connector requests to be accepted, the team creating the Connector must [sponsor Wagmi](https://github.com/sponsors/wevm). It takes time and effort to maintain third-party connectors. Wagmi is an OSS project that depends on sponsors and grants to continue our work. Please get in touch via [dev@wevm.dev](mailto:dev@wevm.dev) if you have questions about sponsoring.
+
+ - type: textarea
+ attributes:
+ label: What **novel use-case** does the Connector provide?
+ description: |
+ A novel use-case is likely one that is not already covered by or not easily extended from another Connector (such as the `injected` or `walletConnect`).
+
+ Examples of **novel** use-cases could be a connector that integrates with:
+
+ - the injected `window.ethereum` provider (a la `injected`)
+ - a series of wallets via QR Codes or Mobile Deep Links (a la `walletConnect`)
+ - a wallet with it's own SDK (a la `coinbaseWallet`)
+ - hardware wallet(s) via Web USB/Bluetooth
+ - an Externally Owned Account via a private key or some other method
+
+ Examples of **nonnovel** use-cases would be a connector that:
+
+ - extends another connector (e.g. `walletConnect`) with no significant differences in functionality other than branding, etc.
+ placeholder: Info on what makes this connector different.
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Are the Connector's integrations production-ready and generally available?
+ description: Connectors are intended to be used by consumers in production as part of Wagmi. As such, the Connector and all dependencies must be production-ready and generally available. This means your connector should not rely on non-production software or be restricted to a limited group of users. For example, if your connector requires a wallet that has a closed beta, it is not ready for inclusion in Wagmi.
+ placeholder: Info about the Connector and any dependencies (e.g. browser extension, wallet app, npm package).
+ validations:
+ required: true
+
+ - type: checkboxes
+ attributes:
+ label: Are you committed to actively maintaining the Connector?
+ description: It is critical connectors are updated in a timely manner and actively maintained so that users of Wagmi can rely on them in production settings. The Wagmi core team will provide as much assistance as possible to keep connectors up-to-date with breaking changes from Wagmi, but it is your responsibility to ensure that any dependencies and issues/discussions related to the Connector are handled in a timely manner. If this is not done, the Connector could be removed from the future versions.
+ options:
+ - label: Yes, my team is or I am committed to actively maintaining the Connector.
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Additional comments
+ description: Feel free to jot down any additional info you think might be helpful.
+ placeholder: Additional comments, questions, feedback.
diff --git a/wagmi-project/.github/ISSUE_TEMPLATE/bug_report.yml b/wagmi-project/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 000000000..8a561abba
--- /dev/null
+++ b/wagmi-project/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,88 @@
+name: Bug Report
+description: Report bugs or issues.
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to fill out this bug report! The more info you provide, the more we can help you.
+
+ If you are a [Wagmi Sponsor](https://github.com/sponsors/wevm?metadata_campaign=gh_issue), your issues are prioritized.
+
+ - type: checkboxes
+ attributes:
+ label: Check existing issues
+ description: By submitting this issue, you checked there isn't [already an issue](https://github.com/wevm/wagmi/issues) for this bug.
+ options:
+ - label: I checked there isn't [already an issue](https://github.com/wevm/wagmi/issues) for the bug I encountered.
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Describe the bug
+ description: Clear and concise description of the bug. If you intend to submit a PR for this issue, tell us in the description. Thanks!
+ placeholder: I am doing⦠What I expect is⦠What is actually happeningā¦
+ validations:
+ required: true
+
+ - type: input
+ id: reproduction
+ attributes:
+ label: Link to Minimal Reproducible Example
+ description: "Please provide a link that can reproduce the problem: [new.wagmi.sh](https://new.wagmi.sh) for runtime issues or [TypeScript Playground](https://www.typescriptlang.org/play) for type issues. For most issues, you will likely get asked to provide a minimal reproducible example so why not add one now :) If a report is vague (e.g. just snippets, generic error message, screenshot, etc.) and has no reproduction, it will receive a \"Needs Reproduction\" label and be auto-closed."
+ placeholder: https://new.wagmi.sh
+ validations:
+ required: false
+
+ - type: textarea
+ attributes:
+ label: Steps To Reproduce
+ description: Steps or code snippets to reproduce the behavior.
+ validations:
+ required: false
+
+ - type: dropdown
+ attributes:
+ label: What Wagmi package(s) are you using?
+ multiple: true
+ options:
+ - 'wagmi'
+ - '@wagmi/cli'
+ - '@wagmi/connectors'
+ - '@wagmi/core'
+ - '@wagmi/vue'
+ - 'create-wagmi'
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Wagmi Package(s) Version(s)
+ description: What version of the Wagmi packages you selected above are you using? If using multiple, separate with comma (e.g. `wagmi@x.y.z, @wagmi/cli@x.y.z`).
+ placeholder: x.y.z (do not write `latest`)
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: Viem Version
+ description: What version of [Viem](https://viem.sh) are you using?
+ placeholder: x.y.z (do not write `latest`)
+ validations:
+ required: true
+
+ - type: input
+ attributes:
+ label: TypeScript Version
+ description: What version of TypeScript are you using? Wagmi requires `typescript@>=5`.
+ placeholder: x.y.z (do not write `latest`)
+ validations:
+ required: false
+
+ - type: textarea
+ attributes:
+ label: Anything else?
+ description: Anything that will give us more context about the issue you are encountering. Framework version (e.g. React, Vue), app framework (e.g. Next.js, Nuxt), bundler, etc.
+ validations:
+ required: false
+
+
diff --git a/wagmi-project/.github/ISSUE_TEMPLATE/config.yml b/wagmi-project/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..fc8027c87
--- /dev/null
+++ b/wagmi-project/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,14 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Get Help
+ url: https://github.com/wevm/wagmi/discussions/new?category=q-a
+ about: Ask a question and discuss with other community members.
+
+ - name: Feature Request
+ url: https://github.com/wevm/wagmi/discussions/new?category=ideas
+ about: Request features or brainstorm ideas for new functionality.
+
+ - name: Connector Request
+ url: https://github.com/wevm/wagmi/discussions/new?category=connector-request
+ about: Kick off a request for a new connector
+
diff --git a/wagmi-project/.github/ISSUE_TEMPLATE/docs_issue.yml b/wagmi-project/.github/ISSUE_TEMPLATE/docs_issue.yml
new file mode 100644
index 000000000..f2d53b8a9
--- /dev/null
+++ b/wagmi-project/.github/ISSUE_TEMPLATE/docs_issue.yml
@@ -0,0 +1,34 @@
+name: Documentation Issue
+description: Tell us about missing or incorrect documentation.
+labels: ['Area: Docs']
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for submitting a documentation request. It helps make Wagmi better.
+
+ If it's a small change, like misspelling or example that needs updating, feel free to submit a PR instead of creating this issue.
+
+ - type: dropdown
+ attributes:
+ label: What is the type of issue?
+ multiple: true
+ options:
+ - Documentation is missing
+ - Documentation is incorrect
+ - Documentation is confusing
+ - Example code is not working
+ - Something else
+
+ - type: textarea
+ attributes:
+ label: What is the issue?
+ validations:
+ required: true
+
+ - type: textarea
+ attributes:
+ label: Where did you find it?
+ description: Please provide the URL(s) where you found this issue.
+ validations:
+ required: true
diff --git a/wagmi-project/.github/README.md b/wagmi-project/.github/README.md
new file mode 100644
index 000000000..6b5f33641
--- /dev/null
+++ b/wagmi-project/.github/README.md
@@ -0,0 +1,256 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reactive primitives for Ethereum apps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+---
+
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
+
+## Community
+
+For help, discussion about best practices, or any other conversation that would benefit from being searchable:
+
+[Discuss Wagmi on GitHub](https://github.com/wevm/wagmi/discussions)
+
+For casual chit-chat with others using the framework:
+
+[Join the Wagmi Discord](https://discord.gg/SghfWBKexF)
+
+## Contributing
+
+Contributions to Wagmi are greatly appreciated! If you're interested in contributing to Wagmi, please read the [Contributing Guide](https://wagmi.sh/dev/contributing) **before submitting a pull request**.
+
+## Sponsors
+
+If you find Wagmi useful or use it for work, please consider [sponsoring Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support). Thank you š
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Sponsor Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support_bottom)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wagmi-project/.github/SECURITY.md b/wagmi-project/.github/SECURITY.md
new file mode 100644
index 000000000..54f40f38d
--- /dev/null
+++ b/wagmi-project/.github/SECURITY.md
@@ -0,0 +1,6 @@
+# Security Policy
+
+## Reporting a Vulnerability
+
+Contact [dev@wevm.dev](mailto:dev@wevm.dev).
+
diff --git a/wagmi-project/.github/dependabot.yml b/wagmi-project/.github/dependabot.yml
new file mode 100644
index 000000000..bc63aca35
--- /dev/null
+++ b/wagmi-project/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+ - package-ecosystem: 'github-actions'
+ directory: '/'
+ schedule:
+ interval: 'monthly'
diff --git a/wagmi-project/.github/logo-dark.svg b/wagmi-project/.github/logo-dark.svg
new file mode 100644
index 000000000..5d47cce33
--- /dev/null
+++ b/wagmi-project/.github/logo-dark.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/wagmi-project/.github/logo-light.svg b/wagmi-project/.github/logo-light.svg
new file mode 100644
index 000000000..4e28590c3
--- /dev/null
+++ b/wagmi-project/.github/logo-light.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/wagmi-project/.github/pull_request_template.md b/wagmi-project/.github/pull_request_template.md
new file mode 100644
index 000000000..602a32d0a
--- /dev/null
+++ b/wagmi-project/.github/pull_request_template.md
@@ -0,0 +1,12 @@
+
+
+
diff --git a/wagmi-project/.github/workflows/Vercel Preview Deployment.yml b/wagmi-project/.github/workflows/Vercel Preview Deployment.yml
new file mode 100644
index 000000000..ca7ca9700
--- /dev/null
+++ b/wagmi-project/.github/workflows/Vercel Preview Deployment.yml
@@ -0,0 +1,22 @@
+name: Playwright Tests
+
+on:
+ repository_dispatch:
+ types:
+ - 'vercel.deployment.success'
+permissions:
+ contents: read
+jobs:
+ run-e2es:
+ if: github.event_name == 'repository_dispatch'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.client_payload.git.sha }}
+ - name: Install dependencies
+ run: npm ci && npx playwright install --with-deps
+ - name: Run tests
+ run: npx playwright test
+ env:
+ BASE_URL: ${{ github.event.client_payload.url }}
diff --git a/wagmi-project/.github/workflows/changesets.yml b/wagmi-project/.github/workflows/changesets.yml
new file mode 100644
index 000000000..745341ed9
--- /dev/null
+++ b/wagmi-project/.github/workflows/changesets.yml
@@ -0,0 +1,60 @@
+name: Changesets
+on:
+ push:
+ branches: [main]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ verify:
+ name: Verify
+ uses: ./.github/workflows/verify.yml
+ secrets: inherit
+
+ changesets:
+ name: Publish
+ needs: verify
+ permissions:
+ contents: write
+ id-token: write
+ pull-requests: write
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
+ with:
+ # This makes Actions fetch all Git history so that Changesets can generate changelogs with the correct commits
+ fetch-depth: 0
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: PR or publish
+ uses: changesets/action@e0145edc7d9d8679003495b11f87bd8ef63c0cba
+ with:
+ title: 'chore: version packages'
+ commit: 'chore: version packages'
+ createGithubReleases: ${{ github.ref == 'refs/heads/main' }}
+ publish: pnpm changeset:publish
+ version: pnpm changeset:version
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Publish prerelease
+ if: steps.changesets.outputs.published != 'true'
+ continue-on-error: true
+ env:
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ npm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN"
+ git reset --hard origin/main
+ pnpm clean
+ pnpm changeset version --no-git-tag --snapshot canary
+ pnpm changeset:prepublish
+ pnpm changeset publish --no-git-tag --snapshot canary --tag canary
diff --git a/wagmi-project/.github/workflows/dependency-review.yml b/wagmi-project/.github/workflows/dependency-review.yml
new file mode 100644
index 000000000..d19e21b79
--- /dev/null
+++ b/wagmi-project/.github/workflows/dependency-review.yml
@@ -0,0 +1,39 @@
+# Dependency Review Action
+#
+# This Action will scan dependency manifest files that change as part of a Pull Request,
+# surfacing known-vulnerable versions of the packages declared or updated in the PR.
+# Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable
+# packages will be blocked from merging.
+#
+# Source repository: https://github.com/actions/dependency-review-action
+# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
+name: 'Dependency review'
+on:
+ pull_request:
+ branches: [ "main" ]
+
+# If using a dependency submission action in this workflow this permission will need to be set to:
+#
+# permissions:
+# contents: write
+#
+# https://docs.github.com/en/enterprise-cloud@latest/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api
+permissions:
+ contents: read
+ # Write permissions for pull-requests are required for using the `comment-summary-in-pr` option, comment out if you aren't using this option
+ pull-requests: write
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Checkout repository'
+ uses: actions/checkout@v4
+ - name: 'Dependency Review'
+ uses: actions/dependency-review-action@v4
+ # Commonly enabled options, see https://github.com/actions/dependency-review-action#configuration-options for all available options.
+ with:
+ comment-summary-in-pr: always
+ # fail-on-severity: moderate
+ # deny-licenses: GPL-1.0-or-later, LGPL-2.0-or-later
+ # retry-on-snapshot-warnings: true
diff --git a/wagmi-project/.github/workflows/issue-labeled.yml b/wagmi-project/.github/workflows/issue-labeled.yml
new file mode 100644
index 000000000..39b98291d
--- /dev/null
+++ b/wagmi-project/.github/workflows/issue-labeled.yml
@@ -0,0 +1,19 @@
+name: Issue Labeled
+
+on:
+ issues:
+ types: [labeled]
+
+jobs:
+ issue-labeled:
+ if: ${{ github.repository_owner == 'wevm' }}
+ uses: wevm/actions/.github/workflows/issue-labeled.yml@main
+ with:
+ needs-reproduction-body: |
+ Hello @${{ github.event.issue.user.login }}.
+
+ Please provide a [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) using [StackBlitz](https://new.wagmi.sh), [TypeScript Playground](https://www.typescriptlang.org/play) (for type issues), or a separate minimal GitHub repository.
+
+ [Minimal reproductions are required](https://antfu.me/posts/why-reproductions-are-required) as they save us a lot of time reproducing your config/environment and issue, and allow us to help you faster.
+
+ Once a minimal reproduction is added, a team member will confirm it works, then re-open the issue.
diff --git a/wagmi-project/.github/workflows/jekyll-docker.yml b/wagmi-project/.github/workflows/jekyll-docker.yml
new file mode 100644
index 000000000..c88a4430c
--- /dev/null
+++ b/wagmi-project/.github/workflows/jekyll-docker.yml
@@ -0,0 +1,23 @@
+name: Jekyll site CI
+
+permissions:
+ contents: read
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Build the site in the jekyll/builder container
+ run: |
+ docker run \
+ -v ${{ github.workspace }}:/srv/jekyll -v ${{ github.workspace }}/_site:/srv/jekyll/_site \
+ jekyll/builder:latest /bin/bash -c "chmod -R 777 /srv/jekyll && jekyll build --future"
diff --git a/wagmi-project/.github/workflows/lock-issue.yml b/wagmi-project/.github/workflows/lock-issue.yml
new file mode 100644
index 000000000..279452d22
--- /dev/null
+++ b/wagmi-project/.github/workflows/lock-issue.yml
@@ -0,0 +1,16 @@
+name: Lock Issue
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+
+jobs:
+ lock-issue:
+ if: ${{ github.repository_owner == 'wevm' }}
+ uses: wevm/actions/.github/workflows/lock-issue.yml@main
+ with:
+ issue-comment: |
+ This issue has been locked since it has been closed for more than 14 days.
+
+ If you found a concrete bug or regression related to it, please open a new [bug report](https://github.com/wevm/wagmi/issues/new?template=bug_report.yml) with a reproduction against the latest Wagmi version. If you have any questions or comments you can create a new [discussion thread](https://github.com/wevm/wagmi/discussions).
+
diff --git a/wagmi-project/.github/workflows/octopusdeploy.yml b/wagmi-project/.github/workflows/octopusdeploy.yml
new file mode 100644
index 000000000..9c4403d55
--- /dev/null
+++ b/wagmi-project/.github/workflows/octopusdeploy.yml
@@ -0,0 +1,112 @@
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by separate terms of service,
+# privacy policy, and support documentation.
+#
+# This workflow will build and publish a Docker container which is then deployed through Octopus Deploy.
+#
+# The build job in this workflow currently assumes that there is a Dockerfile that generates the relevant application image.
+# If required, this job can be modified to generate whatever alternative build artifact is required for your deployment.
+#
+# This workflow assumes you have already created a Project in Octopus Deploy.
+# For instructions see https://octopus.com/docs/projects/setting-up-projects
+#
+# To configure this workflow:
+#
+# 1. Decide where you are going to host your image.
+# This template uses the GitHub Registry for simplicity but if required you can update the relevant DOCKER_REGISTRY variables below.
+#
+# 2. Create and configure an OIDC credential for a service account in Octopus.
+# This allows for passwordless authentication to your Octopus instance through a trust relationship configured between Octopus, GitHub and your GitHub Repository.
+# https://octopus.com/docs/octopus-rest-api/openid-connect/github-actions
+#
+# 3. Configure your Octopus project details below:
+# OCTOPUS_URL: update to your Octopus Instance Url
+# OCTOPUS_SERVICE_ACCOUNT: update to your service account Id
+# OCTOPUS_SPACE: update to the name of the space your project is configured in
+# OCTOPUS_PROJECT: update to the name of your Octopus project
+# OCTOPUS_ENVIRONMENT: update to the name of the environment to recieve the first deployment
+
+
+name: 'Build and Deploy to Octopus Deploy'
+
+on:
+ push:
+ branches:
+ - '"main"'
+
+jobs:
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ permissions:
+ packages: write
+ contents: read
+ env:
+ DOCKER_REGISTRY: ghcr.io # TODO: Update to your docker registry uri
+ DOCKER_REGISTRY_USERNAME: ${{ github.actor }} # TODO: Update to your docker registry username
+ DOCKER_REGISTRY_PASSWORD: ${{ secrets.GITHUB_TOKEN }} # TODO: Update to your docker registry password
+ outputs:
+ image_tag: ${{ steps.meta.outputs.version }}
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
+ with:
+ registry: ${{ env.DOCKER_REGISTRY }}
+ username: ${{ env.DOCKER_REGISTRY_USERNAME }}
+ password: ${{ env.DOCKER_REGISTRY_PASSWORD }}
+
+ - name: Extract metadata (tags, labels) for Docker
+ id: meta
+ uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
+ with:
+ images: ${{ env.DOCKER_REGISTRY }}/${{ github.repository }}
+ tags: type=semver,pattern={{version}},value=v1.0.0-{{sha}}
+
+ - name: Build and push Docker image
+ id: push
+ uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ deploy:
+ name: Deploy
+ permissions:
+ id-token: write
+ runs-on: ubuntu-latest
+ needs: [ build ]
+ env:
+ OCTOPUS_URL: 'https://your-octopus-url' # TODO: update to your Octopus Instance url
+ OCTOPUS_SERVICE_ACCOUNT: 'your-service-account-id' # TODO: update to your service account Id
+ OCTOPUS_SPACE: 'your-space' # TODO: update to the name of the space your project is configured in
+ OCTOPUS_PROJECT: 'your-project' # TODO: update to the name of your Octopus project
+ OCTOPUS_ENVIRONMENT: 'your-environment' # TODO: update to the name of the environment to recieve the first deployment
+
+ steps:
+ - name: Log in to Octopus Deploy
+ uses: OctopusDeploy/login@e485a40e4b47a154bdf59cc79e57894b0769a760 #v1.0.3
+ with:
+ server: '${{ env.OCTOPUS_URL }}'
+ service_account_id: '${{ env.OCTOPUS_SERVICE_ACCOUNT }}'
+
+ - name: Create Release
+ id: create_release
+ uses: OctopusDeploy/create-release-action@fea7e7b45c38c021b6bc5a14bd7eaa2ed5269214 #v3.2.2
+ with:
+ project: '${{ env.OCTOPUS_PROJECT }}'
+ space: '${{ env.OCTOPUS_SPACE }}'
+ packages: '*:${{ needs.build.outputs.image_tag }}'
+
+ - name: Deploy Release
+ uses: OctopusDeploy/deploy-release-action@b10a606c903b0a5bce24102af9d066638ab429ac #v3.2.1
+ with:
+ project: '${{ env.OCTOPUS_PROJECT }}'
+ space: '${{ env.OCTOPUS_SPACE }}'
+ release_number: '${{ steps.create_release.outputs.release_number }}'
+ environments: ${{ env.OCTOPUS_ENVIRONMENT }}
diff --git a/wagmi-project/.github/workflows/pull-request.yml b/wagmi-project/.github/workflows/pull-request.yml
new file mode 100644
index 000000000..9ff4c5bb7
--- /dev/null
+++ b/wagmi-project/.github/workflows/pull-request.yml
@@ -0,0 +1,32 @@
+name: Pull Request
+on:
+ pull_request:
+ types: [opened, reopened, synchronize, ready_for_review]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ verify:
+ name: Verify
+ uses: ./.github/workflows/verify.yml
+ secrets: inherit
+
+ size:
+ name: Size
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: Report build size
+ uses: preactjs/compressed-size-action@v2
+ with:
+ pattern: 'packages/**/dist/**'
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/wagmi-project/.github/workflows/release.yml b/wagmi-project/.github/workflows/release.yml
new file mode 100644
index 000000000..297c74f63
--- /dev/null
+++ b/wagmi-project/.github/workflows/release.yml
@@ -0,0 +1,44 @@
+name: Release
+
+on:
+ push:
+ branches:
+ - main
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: write
+
+jobs:
+ release:
+ name: Release
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repo
+ uses: actions/checkout@v3
+
+ - name: Setup Node.js 20.x
+ uses: actions/setup-node@v3
+ with:
+ node-version: 20.x
+
+ - name: Install Dependencies
+ run: pnpm install
+
+ - name: Create Release Pull Request or Publish to npm
+ id: changesets
+ uses: changesets/action@v1
+ with:
+ # This expects you to have a script called release which does a build for your packages and calls changeset publish
+ publish: pnpm release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+ - name: Send a Slack notification if a publish happens
+ if: steps.changesets.outputs.published == 'true'
+ # You can do something when a publish happens.
+ run: my-slack-bot send-notification --message "A new version of ${GITHUB_REPOSITORY} was published!"
diff --git a/wagmi-project/.github/workflows/snapshot.yml b/wagmi-project/.github/workflows/snapshot.yml
new file mode 100644
index 000000000..39683bb68
--- /dev/null
+++ b/wagmi-project/.github/workflows/snapshot.yml
@@ -0,0 +1,32 @@
+name: Snapshot
+on:
+ workflow_dispatch:
+
+jobs:
+ snapshot:
+ name: Release snapshot version
+ permissions:
+ contents: write
+ id-token: write
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: Publish Snapshots
+ continue-on-error: true
+ env:
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ snapshot=$(git branch --show-current | tr -cs '[:alnum:]-' '-' | tr '[:upper:]' '[:lower:]' | sed 's/-$//')
+ npm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN"
+ pnpm clean
+ pnpm changeset version --no-git-tag --snapshot $snapshot
+ pnpm changeset:prepublish
+ pnpm changeset publish --no-git-tag --snapshot $snapshot --tag $snapshot
diff --git a/wagmi-project/.github/workflows/verify.yml b/wagmi-project/.github/workflows/verify.yml
new file mode 100644
index 000000000..582eef2d5
--- /dev/null
+++ b/wagmi-project/.github/workflows/verify.yml
@@ -0,0 +1,127 @@
+name: Verify
+on:
+ workflow_call:
+ workflow_dispatch:
+
+jobs:
+ check:
+ name: Check
+ permissions:
+ contents: write
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GH_PTOKEN }}
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: Check repo
+ run: pnpm check:repo
+
+ - name: Check code
+ run: pnpm check
+
+ - name: Update package versions
+ run: pnpm version:update
+
+ - uses: stefanzweifel/git-auto-commit-action@v5
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ commit_message: 'chore: format'
+ commit_user_name: 'github-actions[bot]'
+ commit_user_email: 'github-actions[bot]@users.noreply.github.com'
+
+ build:
+ name: Build
+ needs: check
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: Build
+ run: pnpm build
+
+ - name: Publint
+ run: pnpm test:build
+
+ - name: Check for unused files, dependencies, and exports
+ run: pnpm knip --production
+
+ types:
+ name: Types
+ needs: check
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ strategy:
+ matrix:
+ typescript-version: ['5.7.3', '5.8.3', 'latest']
+ viem-version: ['2.29.2', 'latest']
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} viem@${{ matrix.viem-version }}
+
+ - name: Link packages
+ run: pnpm preconstruct
+
+ - name: Check types
+ run: pnpm check:types
+
+ # Redundant with `pnpm check:types`
+ # If Vitest adds special features in the future, e.g. type coverage, can add this back!
+ # - name: Test types
+ # run: pnpm test:typecheck
+
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ strategy:
+ max-parallel: 3
+ matrix:
+ shard: [1, 2, 3]
+ total-shards: [3]
+
+ steps:
+ - name: Clone repository
+ uses: actions/checkout@v4
+
+ - name: Install dependencies
+ uses: wevm/actions/.github/actions/pnpm@main
+
+ - name: Set up foundry
+ uses: foundry-rs/foundry-toolchain@v1
+ with:
+ version: nightly
+
+ - name: Run tests
+ uses: nick-fields/retry@v3
+ with:
+ command: CI=true pnpm test:cov --shard=${{ matrix.shard }}/${{ matrix.total-shards }} --retry=3 --bail=1
+ max_attempts: 3
+ timeout_minutes: 5
+ env:
+ VITE_MAINNET_FORK_URL: ${{ secrets.VITE_MAINNET_FORK_URL }}
+ VITE_OPTIMISM_FORK_URL: ${{ secrets.VITE_OPTIMISM_FORK_URL }}
+
+ - name: Upload coverage reports to Codecov
+ uses: codecov/codecov-action@v5
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/wagmi-project/.gitignore b/wagmi-project/.gitignore
index fc5ae9f0c..1834fe72a 100644
--- a/wagmi-project/.gitignore
+++ b/wagmi-project/.gitignore
@@ -1,25 +1,39 @@
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-node_modules
+.DS_Store
+.next
+.nuxt
+.pnpm-debug.log*
+cache
+coverage
dist
-dist-ssr
-*.local
+node_modules
+tsconfig.tsbuildinfo
+*.vitest-temp.json
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
-.vercel
+# local env files
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+.envrc
+
+# proxy packages
+packages/cli/config
+packages/cli/plugins
+packages/core/actions
+packages/core/chains
+packages/core/codegen
+packages/core/experimental
+packages/core/internal
+packages/core/query
+packages/react/actions
+packages/react/chains
+packages/react/codegen
+packages/react/connectors
+packages/react/experimental
+packages/react/query
+packages/vue/actions
+packages/vue/chains
+packages/vue/connectors
+packages/vue/nuxt
+packages/vue/query
diff --git a/wagmi-project/.npmrc b/wagmi-project/.npmrc
index ca1e9d98b..47687565b 100644
--- a/wagmi-project/.npmrc
+++ b/wagmi-project/.npmrc
@@ -1 +1,5 @@
-legacy-peer-deps = true
\ No newline at end of file
+auto-install-peers=false
+enable-pre-post-scripts=true
+link-workspace-packages=deep
+provenance=true
+strict-peer-dependencies=false
diff --git a/wagmi-project/.vscode/extensions.json b/wagmi-project/.vscode/extensions.json
new file mode 100644
index 000000000..9cb435094
--- /dev/null
+++ b/wagmi-project/.vscode/extensions.json
@@ -0,0 +1,7 @@
+{
+ "recommendations": [
+ "biomejs.biome",
+ "orta.vscode-twoslash-queries",
+ "Vue.volar"
+ ]
+}
diff --git a/wagmi-project/.vscode/settings.json b/wagmi-project/.vscode/settings.json
new file mode 100644
index 000000000..c32e8fa4c
--- /dev/null
+++ b/wagmi-project/.vscode/settings.json
@@ -0,0 +1,17 @@
+{
+ "editor.defaultFormatter": "biomejs.biome",
+ "editor.formatOnSave": true,
+ "typescript.enablePromptUseWorkspaceTsdk": true,
+ "typescript.preferences.importModuleSpecifier": "shortest",
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "editor.codeActionsOnSave": {
+ "quickfix.biome": "explicit",
+ "source.organizeImports.biome": "explicit"
+ },
+ "[javascript][javascriptreact][json][typescript][typescriptreact]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[vue]": {
+ "editor.defaultFormatter": "Vue.volar"
+ }
+}
diff --git a/wagmi-project/.vscode/workspace.code-workspace b/wagmi-project/.vscode/workspace.code-workspace
new file mode 100644
index 000000000..0d626129d
--- /dev/null
+++ b/wagmi-project/.vscode/workspace.code-workspace
@@ -0,0 +1,16 @@
+{
+ "folders": [
+ {
+ "name": "docs",
+ "path": "../docs"
+ },
+ {
+ "name": "packages",
+ "path": "../packages"
+ },
+ {
+ "name": "playgrounds",
+ "path": "../playgrounds"
+ }
+ ]
+}
diff --git a/wagmi-project/FUNDING.json b/wagmi-project/FUNDING.json
new file mode 100644
index 000000000..5e0125416
--- /dev/null
+++ b/wagmi-project/FUNDING.json
@@ -0,0 +1,10 @@
+{
+ "drips": {
+ "ethereum": {
+ "ownedBy": "0xd2135CfB216b74109775236E36d4b433F1DF507B"
+ }
+ },
+ "opRetro": {
+ "projectId": "0xc0615947773148cbc340b175fb9afc98dbb4e0acd31d018b1ee41a5538785abf"
+ }
+}
diff --git a/wagmi-project/LICENSE b/wagmi-project/LICENSE
new file mode 100644
index 000000000..650c3c1c0
--- /dev/null
+++ b/wagmi-project/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022-present weth, LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/wagmi-project/biome.json b/wagmi-project/biome.json
index 08eb8a26a..ce99662cb 100644
--- a/wagmi-project/biome.json
+++ b/wagmi-project/biome.json
@@ -1,13 +1,89 @@
{
+ "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
+ "files": {
+ "ignore": ["CHANGELOG.md", "pnpm-lock.yaml", "tsconfig.base.json"]
+ },
"formatter": {
"enabled": true,
+ "formatWithErrors": false,
"indentStyle": "space",
- "lineWidth": 120
+ "indentWidth": 2,
+ "lineWidth": 80
},
"linter": {
- "enabled": true
+ "ignore": ["packages/create-wagmi/templates/*"],
+ "enabled": true,
+ "rules": {
+ "recommended": true,
+ "a11y": {
+ "useButtonType": "off"
+ },
+ "correctness": {
+ "noUnusedVariables": "error",
+ "useExhaustiveDependencies": "error"
+ },
+ "performance": {
+ "noBarrelFile": "error",
+ "noReExportAll": "error",
+ "noDelete": "off"
+ },
+ "style": {
+ "noNonNullAssertion": "off",
+ "useShorthandArrayType": "error"
+ },
+ "suspicious": {
+ "noArrayIndexKey": "off",
+ "noConfusingVoidType": "off",
+ "noConsoleLog": "error",
+ "noExplicitAny": "off"
+ }
+ }
+ },
+ "javascript": {
+ "formatter": {
+ "quoteStyle": "single",
+ "trailingCommas": "all",
+ "semicolons": "asNeeded"
+ }
},
"organizeImports": {
"enabled": true
+ },
+ "overrides": [
+ {
+ "include": ["*.vue"],
+ "linter": {
+ "rules": {
+ "correctness": {
+ "noUnusedVariables": "off"
+ }
+ }
+ }
+ },
+ {
+ "include": ["./scripts/**/*.ts"],
+ "linter": {
+ "rules": {
+ "suspicious": {
+ "noConsoleLog": "off"
+ }
+ }
+ }
+ },
+ {
+ "include": ["./playgrounds/**"],
+ "linter": {
+ "rules": {
+ "style": {
+ "useNodejsImportProtocol": "off"
+ }
+ }
+ }
+ }
+ ],
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
}
}
diff --git a/wagmi-project/package.json b/wagmi-project/package.json
index fb48d8e6a..ddc9a6a5a 100644
--- a/wagmi-project/package.json
+++ b/wagmi-project/package.json
@@ -1,29 +1,136 @@
{
- "name": "wagmi-project",
"private": true,
- "version": "0.0.0",
"type": "module",
"scripts": {
- "dev": "vite",
- "build": "tsc && vite build",
- "lint": "biome check .",
- "preview": "vite preview"
- },
- "dependencies": {
- "@tanstack/react-query": "5.64.2",
- "react": "^18.3.1",
- "react-dom": "^18.3.1",
- "viem": "^2.x",
- "wagmi": "~0.x.x"
+ "build": "pnpm run --r --filter \"./packages/**\" build",
+ "changeset:prepublish": "pnpm version:update && pnpm build && bun scripts/formatPackageJson.ts && bun scripts/generateProxyPackages.ts",
+ "changeset:publish": "pnpm changeset:prepublish && changeset publish",
+ "changeset:version": "changeset version && pnpm version:update && pnpm format",
+ "check": "biome check --write",
+ "check:repo": "sherif -i viem",
+ "check:types": "pnpm run --r --parallel check:types && tsc --noEmit",
+ "check:unused": "pnpm clean && knip",
+ "clean": "pnpm run --r --parallel clean && rm -rf packages/**/*.json.tmp",
+ "deps": "pnpx taze -r",
+ "dev": "pnpm dev:react",
+ "dev:cli": "pnpm --filter cli dev",
+ "dev:core": "pnpm --filter vite-core dev",
+ "dev:create-wagmi": "pnpm --filter create-wagmi dev",
+ "dev:next": "pnpm --filter next-app dev",
+ "dev:nuxt": "pnpm --filter nuxt-app dev",
+ "dev:react": "pnpm --filter vite-react dev",
+ "dev:vue": "pnpm --filter vite-vue dev",
+ "docs:dev": "pnpm --filter site dev",
+ "format": "biome format --write",
+ "postinstall": "pnpm preconstruct",
+ "preconstruct": "bun scripts/preconstruct.ts",
+ "preinstall": "pnpx only-allow pnpm",
+ "prepare": "pnpm simple-git-hooks",
+ "test": "vitest",
+ "test:build": "bun scripts/generateProxyPackages.ts && pnpm run --r --parallel test:build",
+ "test:cli": "vitest --project @wagmi/cli",
+ "test:connectors": "vitest --project @wagmi/connectors",
+ "test:core": "vitest --project @wagmi/core",
+ "test:create-wagmi": "vitest --project create-wagmi",
+ "test:cov": "vitest run --coverage",
+ "test:react": "vitest --project wagmi",
+ "test:typecheck": "vitest typecheck",
+ "test:update": "vitest --update",
+ "test:vue": "vitest --project @wagmi/vue",
+ "version:update": "bun scripts/updateVersion.ts",
+ "version:update:viem": "bun scripts/updateViemVersion.ts"
},
"devDependencies": {
- "@biomejs/biome": "^1.8.0",
- "@types/react": "^18.3.1",
- "@types/react-dom": "^18.3.0",
- "@vitejs/plugin-react": "^4.2.1",
- "@wagmi/cli": "~0.x.x",
- "buffer": "^6.0.3",
- "typescript": "^5.4.5",
- "vite": "^5.2.11"
+ "@arethetypeswrong/cli": "^0.16.4",
+ "@biomejs/biome": "^1.9.4",
+ "@changesets/changelog-github": "0.4.6",
+ "@changesets/cli": "^2.27.8",
+ "@types/bun": "^1.1.10",
+ "@vitest/coverage-v8": "^3.2.4",
+ "@wagmi/test": "workspace:*",
+ "bun": "^1.1.30",
+ "happy-dom": "^20.0.2",
+ "knip": "^5.30.6",
+ "prool": "^0.0.23",
+ "publint": "^0.3.0",
+ "sherif": "^1.0.0",
+ "simple-git-hooks": "^2.11.1",
+ "typescript": "5.8.3",
+ "viem": "2.31.4",
+ "vitest": "^2.1.9"
+ },
+ "packageManager": "pnpm@9.11.0",
+ "pnpm": {
+ "peerDependencyRules": {
+ "ignoreMissing": [
+ "@algolia/client-search",
+ "react",
+ "react-native",
+ "search-insights"
+ ]
+ }
+ },
+ "engines": {
+ "node": "22.x"
+ },
+ "simple-git-hooks": {
+ "pre-commit": "pnpm check"
+ },
+ "knip": {
+ "ignore": ["**/templates/**", "**/hardhat.config.js"],
+ "ignoreBinaries": ["only-allow"],
+ "ignoreWorkspaces": [
+ "packages/register-tests/**",
+ "packages/test",
+ "playgrounds/**"
+ ],
+ "workspaces": {
+ ".": {
+ "project": "scripts/*.ts"
+ },
+ "packages/cli": {
+ "entry": [
+ "src/cli.ts!",
+ "src/exports/{config,index,plugins}.ts!",
+ "types/*.d.ts!"
+ ],
+ "ignore": ["test/{constants,setup,utils}.ts"]
+ },
+ "packages/connectors": {
+ "entry": "src/exports/index.ts!"
+ },
+ "packages/core": {
+ "entry": "src/exports/{actions,chains,codegen,experimental,index,internal,query}.ts!",
+ "ignore": ["test/setup.ts"],
+ "ignoreDependencies": ["@tanstack/query-core"]
+ },
+ "packages/create-wagmi": {
+ "entry": "src/cli.ts!"
+ },
+ "packages/react": {
+ "entry": [
+ "src/exports/{actions,chains,codegen,connectors,experimental,index,query}.ts!",
+ "src/exports/actions/experimental.ts!"
+ ],
+ "ignore": ["test/setup.ts"]
+ },
+ "packages/test": {
+ "entry": [
+ "src/{globalSetup,setup}.ts!",
+ "src/exports/{index,react}.ts!"
+ ]
+ },
+ "packages/vue": {
+ "entry": [
+ "src/exports/{actions,chains,connectors,index,nuxt,query}.ts!",
+ "src/exports/actions/experimental.ts!"
+ ],
+ "ignore": ["src/nuxt/runtime/*", "test/setup.ts"],
+ "ignoreDependencies": ["nuxt"]
+ },
+ "site": {
+ "project": ["**/*.ts", "**/*.tsx"]
+ }
+ }
}
}
diff --git a/wagmi-project/packages/cli/CHANGELOG.md b/wagmi-project/packages/cli/CHANGELOG.md
new file mode 100644
index 000000000..a2911e230
--- /dev/null
+++ b/wagmi-project/packages/cli/CHANGELOG.md
@@ -0,0 +1,449 @@
+# @wagmi/cli
+
+## 2.3.1
+
+### Patch Changes
+
+- [#4655](https://github.com/wevm/wagmi/pull/4655) [`43241c8417f3c342036bb46ec8e507d052ae2691`](https://github.com/wevm/wagmi/commit/43241c8417f3c342036bb46ec8e507d052ae2691) Thanks [@tmm](https://github.com/tmm)! - Bumped internal deps.
+
+## 2.3.0
+
+### Minor Changes
+
+- [#4629](https://github.com/wevm/wagmi/pull/4629) [`66dec7d75d580b3121ebc7e8162c1f9ae37cfd41`](https://github.com/wevm/wagmi/commit/66dec7d75d580b3121ebc7e8162c1f9ae37cfd41) Thanks [@allezxandre](https://github.com/allezxandre)! - Upgraded to Sourcify v2 API in `sourcify` plugin
+
+## 2.2.1
+
+### Patch Changes
+
+- [`7b0dbe3886c1a7c6dbbdab945d7436ec20ad8f93`](https://github.com/wevm/wagmi/commit/7b0dbe3886c1a7c6dbbdab945d7436ec20ad8f93) Thanks [@tmm](https://github.com/tmm)! - Updated block explorer chains.
+
+## 2.2.0
+
+### Minor Changes
+
+- [#4503](https://github.com/wevm/wagmi/pull/4503) [`8fce8a6f97aa2ee5fd1bda6a3ece422b10324b5a`](https://github.com/wevm/wagmi/commit/8fce8a6f97aa2ee5fd1bda6a3ece422b10324b5a) Thanks [@tmm](https://github.com/tmm)! - Updated Etherscan Plugin to use Etherscan API v2.
+
+- [#4507](https://github.com/wevm/wagmi/pull/4507) [`6f09cc57935891e1c67d6df3459f6998985c69dc`](https://github.com/wevm/wagmi/commit/6f09cc57935891e1c67d6df3459f6998985c69dc) Thanks [@tmm](https://github.com/tmm)! - Added `tryFetchProxyImplementation` flag to Etherscan Plugin to enable fetching the implementation ABI instead of the proxy ABI.
+
+## 2.1.22
+
+### Patch Changes
+
+- [#4462](https://github.com/wevm/wagmi/pull/4462) [`0b2238d27cecbcd33aee64fb0e30ddc18b6ddf74`](https://github.com/wevm/wagmi/commit/0b2238d27cecbcd33aee64fb0e30ddc18b6ddf74) Thanks [@groninge01](https://github.com/groninge01)! - Added Sonic to Etherscan plugin.
+
+## 2.1.21
+
+### Patch Changes
+
+- [#4457](https://github.com/wevm/wagmi/pull/4457) [`21ec74da7f93fc13e253d7b35ddeddc23422a6c1`](https://github.com/wevm/wagmi/commit/21ec74da7f93fc13e253d7b35ddeddc23422a6c1) Thanks [@tmm](https://github.com/tmm)! - Removed internal dependency.
+
+## 2.1.20
+
+### Patch Changes
+
+- [#4450](https://github.com/wevm/wagmi/pull/4450) [`7b9a6bb35881b657a00bdd7ccd7edea32660f5bf`](https://github.com/wevm/wagmi/commit/7b9a6bb35881b657a00bdd7ccd7edea32660f5bf) Thanks [@tmm](https://github.com/tmm)! - Removed internal usage of `fs-extra`.
+
+## 2.1.19
+
+### Patch Changes
+
+- [#4449](https://github.com/wevm/wagmi/pull/4449) [`3fa5c238baa13d948e89974b0bb8530f8fa264fd`](https://github.com/wevm/wagmi/commit/3fa5c238baa13d948e89974b0bb8530f8fa264fd) Thanks [@tmm](https://github.com/tmm)! - Removed `ora` for `nanospinner`.
+
+## 2.1.18
+
+### Patch Changes
+
+- [#4399](https://github.com/wevm/wagmi/pull/4399) [`bc18673e4c272e3b60a1b6016934fe3fbeb6d93a`](https://github.com/wevm/wagmi/commit/bc18673e4c272e3b60a1b6016934fe3fbeb6d93a) Thanks [@tmm](https://github.com/tmm)! - Added Polygon Amoy to Sourcify and Etherscan plugins.
+
+## 2.1.17
+
+### Patch Changes
+
+- [#4370](https://github.com/wevm/wagmi/pull/4370) [`cb58b1ea3ad40e77210f24eb598f9d2306db998c`](https://github.com/wevm/wagmi/commit/cb58b1ea3ad40e77210f24eb598f9d2306db998c) Thanks [@talentlessguy](https://github.com/talentlessguy)! - Bumped internal dependencies.
+
+## 2.1.16
+
+### Patch Changes
+
+- [#4224](https://github.com/wevm/wagmi/pull/4224) [`b0eb89c2a0781bb3434996fa53ee7ceb3bb44db9`](https://github.com/wevm/wagmi/commit/b0eb89c2a0781bb3434996fa53ee7ceb3bb44db9) Thanks [@roderik](https://github.com/roderik)! - Fixed package detection for Bun.
+
+## 2.1.15
+
+### Patch Changes
+
+- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.
+
+## 2.1.14
+
+### Patch Changes
+
+- [#4120](https://github.com/wevm/wagmi/pull/4120) [`59407bf1276a46e6f1f22a370dde71c92524cd0f`](https://github.com/wevm/wagmi/commit/59407bf1276a46e6f1f22a370dde71c92524cd0f) Thanks [@tmm](https://github.com/tmm)! - Fixed an issue where the Foundry and Hardhat plugins' `exclude` option was ignored.
+
+## 2.1.13
+
+### Patch Changes
+
+- [`7264d1f450727f6ba0cbea8aa1c7a83e22a5bf20`](https://github.com/wevm/wagmi/commit/7264d1f450727f6ba0cbea8aa1c7a83e22a5bf20) Thanks [@tmm](https://github.com/tmm)! - Fixed generate not exiting for long-running processes.
+
+## 2.1.12
+
+### Patch Changes
+
+- [`ac038b29623ccb0d2fee40d9f943c8df28138dac`](https://github.com/wevm/wagmi/commit/ac038b29623ccb0d2fee40d9f943c8df28138dac) Thanks [@tmm](https://github.com/tmm)! - Updated Foundry default excludes.
+
+## 2.1.11
+
+### Patch Changes
+
+- [#4084](https://github.com/wevm/wagmi/pull/4084) [`b54203bf8fa911e6f14b9675980cf38fb95d7d3e`](https://github.com/wevm/wagmi/commit/b54203bf8fa911e6f14b9675980cf38fb95d7d3e) Thanks [@tmm](https://github.com/tmm)! - Reduced internal dependencies.
+
+## 2.1.10
+
+### Patch Changes
+
+- [#4051](https://github.com/wevm/wagmi/pull/4051) [`275e78b0e585f0ec9da2f9661ce9990aed18e9f4`](https://github.com/wevm/wagmi/commit/275e78b0e585f0ec9da2f9661ce9990aed18e9f4) Thanks [@tmm](https://github.com/tmm)! - Updated Sourcify plugin internals.
+
+## 2.1.9
+
+### Patch Changes
+
+- [`f9346dbcffaf57a8949cb96e43df111a89d733b1`](https://github.com/wevm/wagmi/commit/f9346dbcffaf57a8949cb96e43df111a89d733b1) Thanks [@tmm](https://github.com/tmm)! - Updated Foundry plugin default excludes.
+
+## 2.1.8
+
+### Patch Changes
+
+- [#3957](https://github.com/wevm/wagmi/pull/3957) [`7d00680f73b090eb34af928ae74277bec1973953`](https://github.com/wevm/wagmi/commit/7d00680f73b090eb34af928ae74277bec1973953) Thanks [@cstoneham](https://github.com/cstoneham)! - Added Blast to Etherscan plugin
+
+## 2.1.7
+
+### Patch Changes
+
+- [`1122678bbad0232590bd4060a73752de2c84982d`](https://github.com/wevm/wagmi/commit/1122678bbad0232590bd4060a73752de2c84982d) Thanks [@tmm](https://github.com/tmm)! - Published unpublished changes in [#3756](https://github.com/wevm/wagmi/pull/3756).
+
+## 2.1.6
+
+### Patch Changes
+
+- [#3756](https://github.com/wevm/wagmi/pull/3756) [`c7d6f467`](https://github.com/wevm/wagmi/commit/c7d6f4679125fd2f6cca5b5ef362abf47e37f934) Thanks [@jrfrantz](https://github.com/jrfrantz)! - Added basescan to etherscan cli plugin
+
+## 2.1.5
+
+### Patch Changes
+
+- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Added title to CLI process.
+
+- [#3723](https://github.com/wevm/wagmi/pull/3723) [`d6bc98ca`](https://github.com/wevm/wagmi/commit/d6bc98ca0ce9081f192f62e0b0fcfea3cb07a2bb) Thanks [@leecobaby](https://github.com/leecobaby)! - Broadened TypeScript detection.
+
+## 2.1.4
+
+### Patch Changes
+
+- [#3737](https://github.com/wevm/wagmi/pull/3737) [`11020fed`](https://github.com/wevm/wagmi/commit/11020fedfc68639eace241e328331cff43bf91af) Thanks [@oskarvu](https://github.com/oskarvu)! - Added Gnosis to Etherscan plugin.
+
+## 2.1.3
+
+### Patch Changes
+
+- [#3660](https://github.com/wevm/wagmi/pull/3660) [`11a22a23`](https://github.com/wevm/wagmi/commit/11a22a23d88c025cde9c91610e9ddf62cd4fa650) Thanks [@JazzBashara](https://github.com/JazzBashara)! - Replaced SnowTrace with SnowScan for the Etherscan plugin
+
+## 2.1.2
+
+### Patch Changes
+
+- [#3641](https://github.com/wevm/wagmi/pull/3641) [`0a866403`](https://github.com/wevm/wagmi/commit/0a866403182ea6b8ba7f976c45be294e48fb7de8) Thanks [@cmwhited](https://github.com/cmwhited)! - Added Arbitrum Sepolia testnet to Etherscan plugin
+
+- [#3633](https://github.com/wevm/wagmi/pull/3633) [`a1d3d1ab`](https://github.com/wevm/wagmi/commit/a1d3d1ab2b023c61c0dbb5d7bf867a9fca673630) Thanks [@pegahcarter](https://github.com/pegahcarter)! - Added Fraxtal to Etherscan plugin
+
+- [#3616](https://github.com/wevm/wagmi/pull/3616) [`2a9f4473`](https://github.com/wevm/wagmi/commit/2a9f4473adc5bcdddf388389387ed5459583769e) Thanks [@petermazzocco](https://github.com/petermazzocco)! - Added Holesky Testnet to Etherscan Plugin
+
+## 2.1.1
+
+### Patch Changes
+
+- [#3579](https://github.com/wevm/wagmi/pull/3579) [`a057919c`](https://github.com/wevm/wagmi/commit/a057919ca3942adeed90af2e343403dc5274e84c) Thanks [@FaisalAli19](https://github.com/FaisalAli19)! - Added Optimism Sepolia Etherscan support
+
+## 2.1.0
+
+### Minor Changes
+
+- [#3506](https://github.com/wevm/wagmi/pull/3506) [`134eb4a1`](https://github.com/wevm/wagmi/commit/134eb4a1e0e29aab87bd5c7cdf05b06dfd7c4fc4) Thanks [@vmaark](https://github.com/vmaark)! - Added resolution of TypeScript Wagmi CLI config to determine if TypeScript generated output is allowed.
+
+## 2.0.4
+
+### Patch Changes
+
+- [#3462](https://github.com/wevm/wagmi/pull/3462) [`d25573ea`](https://github.com/wevm/wagmi/commit/d25573ea03358f967953e37c176b220a7b341769) Thanks [@cruzdanilo](https://github.com/cruzdanilo)! - Upgraded dependencies
+
+## 2.0.3
+
+### Patch Changes
+
+- [#3410](https://github.com/wevm/wagmi/pull/3410) [`55e31c3e`](https://github.com/wevm/wagmi/commit/55e31c3e96c2cbd1d9eb44e5a89f4365489c8310) Thanks [@o-az](https://github.com/o-az)! - Fixed actions plugin issue where `functionName` was used instead of `eventName` for generated contract event actions.
+
+## 2.0.2
+
+### Patch Changes
+
+- [#3371](https://github.com/wevm/wagmi/pull/3371) [`8294d9e5`](https://github.com/wevm/wagmi/commit/8294d9e5b358018ba869b2018cd7ed95462e021f) Thanks [@iceanddust](https://github.com/iceanddust)! - Fixed prop name when generating contract event watch hooks
+
+## 2.0.1
+
+### Major Changes
+
+- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Wagmi CLI 2.0.
+
+ [Breaking Changes & Migration Guide](https://wagmi.sh/cli/guides/migrate-from-v1-to-v2)
+
+## 1.5.2
+
+### Patch Changes
+
+- [#3051](https://github.com/wagmi-dev/wagmi/pull/3051) [`4704d351`](https://github.com/wagmi-dev/wagmi/commit/4704d351164d39704a4e375c06525554fcc8340e) Thanks [@oxSaturn](https://github.com/oxSaturn)! - Fixed ESM require issue for prettier
+
+## 1.5.1
+
+### Patch Changes
+
+- [#3035](https://github.com/wagmi-dev/wagmi/pull/3035) [`187bf96c`](https://github.com/wagmi-dev/wagmi/commit/187bf96c9fd31675b9d17a7cb4d4e24eea3fa777) Thanks [@cruzdanilo](https://github.com/cruzdanilo)! - ignore foundry invariant lib
+
+## 1.5.0
+
+### Minor Changes
+
+- [#2956](https://github.com/wevm/wagmi/pull/2956) [`2abeb285`](https://github.com/wevm/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.
+
+## 1.4.1
+
+### Patch Changes
+
+- [#2962](https://github.com/wevm/wagmi/pull/2962) [`8ac5b572`](https://github.com/wevm/wagmi/commit/8ac5b57254f77eeb0e07dd83f7d49f396d4581d8) Thanks [@tmm](https://github.com/tmm)! - Fixed esbuild version
+
+## 1.4.0
+
+### Minor Changes
+
+- [#2946](https://github.com/wevm/wagmi/pull/2946) [`1c3228bf`](https://github.com/wevm/wagmi/commit/1c3228bf3fe99b0900b2c9a223c9b81c70bdcd90) Thanks [@tomquirk](https://github.com/tomquirk)! - Added default chain ID to generated `useContractRead` hook.
+
+### Patch Changes
+
+- [#2547](https://github.com/wevm/wagmi/pull/2547) [`8c3889fe`](https://github.com/wevm/wagmi/commit/8c3889fe82c5a1ddb29e74e3863ea6f4917b777a) Thanks [@Iamshankhadeep](https://github.com/Iamshankhadeep)! - Deterministic CLI output
+
+- [#2958](https://github.com/wevm/wagmi/pull/2958) [`b31f36d5`](https://github.com/wevm/wagmi/commit/b31f36d522a634f53d44349d6a9ea47f59d84d7a) Thanks [@tmm](https://github.com/tmm)! - Removed generated file header
+
+- [#2960](https://github.com/wevm/wagmi/pull/2960) [`5d4c4592`](https://github.com/wevm/wagmi/commit/5d4c4592009568cd0b096906a424f27469721a42) Thanks [@tmm](https://github.com/tmm)! - Updated esbuild version
+
+## 1.3.0
+
+### Minor Changes
+
+- [#2616](https://github.com/wevm/wagmi/pull/2616) [`c282a8f7`](https://github.com/wevm/wagmi/commit/c282a8f786d57fec77c931fe99dc20220e843bc8) Thanks [@portdeveloper](https://github.com/portdeveloper)! - Added sepolia chain id
+
+## 1.2.1
+
+### Patch Changes
+
+- [#2607](https://github.com/wevm/wagmi/pull/2607) [`79335b4c`](https://github.com/wevm/wagmi/commit/79335b4c0fcd5e8152a2a1d28314c634db9d9cbf) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed opitmism goerli chain id
+
+## 1.2.0
+
+### Minor Changes
+
+- [#2536](https://github.com/wevm/wagmi/pull/2536) [`85e9760a`](https://github.com/wevm/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193) Thanks [@tmm](https://github.com/tmm)! - Changed `Address` type import from ABIType to viem.
+
+## 1.1.0
+
+### Minor Changes
+
+- [#2482](https://github.com/wevm/wagmi/pull/2482) [`8764b54a`](https://github.com/wevm/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to v5.0.4.
+
+### Patch Changes
+
+- [#2484](https://github.com/wevm/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wevm/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated `abitype` to 0.8.7
+
+- [#2484](https://github.com/wevm/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wevm/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.0.3
+
+### Patch Changes
+
+- [#2441](https://github.com/wevm/wagmi/pull/2441) [`326edee4`](https://github.com/wevm/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type issue
+
+## 1.0.2
+
+### Patch Changes
+
+- [#2430](https://github.com/wevm/wagmi/pull/2430) [`71d92029`](https://github.com/wevm/wagmi/commit/71d92029ee4344842cd41698858a330fee95b6e0) Thanks [@tmm](https://github.com/tmm)! - Added message when command is not found.
+
+## 1.0.1
+
+### Patch Changes
+
+- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.
+
+## 1.0.0
+
+### Major Changes
+
+- [#2235](https://github.com/wevm/wagmi/pull/2235) [`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349) Thanks [@jxom](https://github.com/jxom)! - Released v1. Read [Migration Guide](https://next.wagmi.sh/react/migration-guide#1xx-breaking-changes).
+
+## 1.0.0-next.7
+
+### Patch Changes
+
+- Fixed react plugin generic.
+
+## 1.0.0-next.6
+
+### Major Changes
+
+- Updated references.
+
+## 1.0.0-next.5
+
+### Major Changes
+
+- Added `config.setConnectors`
+
+## 1.0.0-next.4
+
+### Major Changes
+
+- Updated viem.
+ Removed `goerli` export from main entrypoint.
+
+## 1.0.0-next.3
+
+### Major Changes
+
+- Updated references.
+
+## 1.0.0-next.2
+
+### Major Changes
+
+- Updated dependencies
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/chains@1.0.0-next.0
+
+## 1.0.0-next.1
+
+### Major Changes
+
+- updated viem
+
+## 1.0.0-next.0
+
+### Major Changes
+
+- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.
+
+### Patch Changes
+
+- Updated dependencies [[`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb)]:
+ - @wagmi/core@1.0.0-next.0
+ - wagmi@1.0.0-next.0
+
+## 0.1.15
+
+### Patch Changes
+
+- [#2145](https://github.com/wevm/wagmi/pull/2145) [`2520743c`](https://github.com/wevm/wagmi/commit/2520743c417a158a00d5edca13a9aa92cefb0cfd) Thanks [@tmm](https://github.com/tmm)! - Fixed issue using Hardhat Plugin with npm.
+
+## 0.1.14
+
+### Patch Changes
+
+- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Updated references.
+
+- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Fixed Actions plugin `overridePackageName` option.
+
+## 0.1.13
+
+### Patch Changes
+
+- [#2000](https://github.com/wevm/wagmi/pull/2000) [`01254765`](https://github.com/wevm/wagmi/commit/01254765eb37b77aca26500c00c721f08a260912) Thanks [@tmm](https://github.com/tmm)! - Fixed React plugin name conflict.
+
+## 0.1.12
+
+### Patch Changes
+
+- [#1992](https://github.com/wevm/wagmi/pull/1992) [`efc93cad`](https://github.com/wevm/wagmi/commit/efc93cadacdb9c9960644dabe4ae837d384df52b) Thanks [@tmm](https://github.com/tmm)! - Refactored internals from ethers to viem.
+
+## 0.1.11
+
+### Patch Changes
+
+- [#1916](https://github.com/wevm/wagmi/pull/1916) [`950490fd`](https://github.com/wevm/wagmi/commit/950490fd132b3fb5b3455e77b58d70f134b8e5c9) Thanks [@technophile-04](https://github.com/technophile-04)! - Updated React plugin to use `Address` type instead of hardcoding `` `0x{string}` ``.
+
+## 0.1.10
+
+### Patch Changes
+
+- [#1892](https://github.com/wevm/wagmi/pull/1892) [`d3d6973b`](https://github.com/wevm/wagmi/commit/d3d6973ba9407e490140d2434eb83aad88d6e10d) Thanks [@greg-schrammel](https://github.com/greg-schrammel)! - Fixed generated read hooks `select` type.
+
+## 0.1.9
+
+### Patch Changes
+
+- [#1886](https://github.com/wevm/wagmi/pull/1886) [`36e119c6`](https://github.com/wevm/wagmi/commit/36e119c6d4bc28a7ae15c9602d0c613bc9681356) Thanks [@roninjin10](https://github.com/roninjin10)! - Fixed package detection for yarn^3
+
+## 0.1.8
+
+### Patch Changes
+
+- [#1884](https://github.com/wevm/wagmi/pull/1884) [`cc03bb44`](https://github.com/wevm/wagmi/commit/cc03bb44268874f95203de67f6d32586e34c0857) Thanks [@roninjin10](https://github.com/roninjin10)! - Added better compatibility for yarn@^3 in `@wagmi/cli`.
+
+## 0.1.7
+
+### Patch Changes
+
+- [#1841](https://github.com/wevm/wagmi/pull/1841) [`cb707f01`](https://github.com/wevm/wagmi/commit/cb707f01cbdcc62a70cf5c8a162d77948d6b6a56) Thanks [@tmm](https://github.com/tmm)! - Added [Sourcify](https://sourcify.dev) CLI plugin.
+
+## 0.1.6
+
+### Patch Changes
+
+- [#1803](https://github.com/wevm/wagmi/pull/1803) [`09b13538`](https://github.com/wevm/wagmi/commit/09b13538abcde879034293cae39551c30cc81445) Thanks [@shotaronowhere](https://github.com/shotaronowhere)! - Swapped deprecated Arbitrum Rinkeby for Arbitrum Goerli URL for Etherscan Plugin.
+
+## 0.1.5
+
+### Patch Changes
+
+- [#1788](https://github.com/wevm/wagmi/pull/1788) [`c3e16d82`](https://github.com/wevm/wagmi/commit/c3e16d82c9c39b8b1c2f3c51037e11d642a20cd6) Thanks [@tmm](https://github.com/tmm)! - Fixed CLI import
+
+## 0.1.4
+
+### Patch Changes
+
+- [#1779](https://github.com/wevm/wagmi/pull/1779) [`97346750`](https://github.com/wevm/wagmi/commit/973467505dc2bb46198a3e9fe6072306170d24c0) Thanks [@tmm](https://github.com/tmm)! - Made `project` optional for Foundry plugin
+
+## 0.1.3
+
+### Patch Changes
+
+- [#1754](https://github.com/wevm/wagmi/pull/1754) [`298728b5`](https://github.com/wevm/wagmi/commit/298728b5918fa15b6b5b082597204a268d4b01f1) Thanks [@tmm](https://github.com/tmm)! - Updated project resolution for Foundry and Hardhat plugins.
+
+- [#1738](https://github.com/wevm/wagmi/pull/1738) [`37c221d0`](https://github.com/wevm/wagmi/commit/37c221d0f4d175084e23a6b172d72f177bfa0c81) Thanks [@roninjin10](https://github.com/roninjin10)! - Added automatic Foundry config detection for artifacts directory.
+
+## 0.1.2
+
+### Patch Changes
+
+- [#1743](https://github.com/wevm/wagmi/pull/1743) [`379315fa`](https://github.com/wevm/wagmi/commit/379315fa359c3118b5d200ec50db3812b0cdd984) Thanks [@kyscott18](https://github.com/kyscott18)! - Add celoscan to `etherscan` plugin
+
+## 0.1.1
+
+### Patch Changes
+
+- [#1736](https://github.com/wevm/wagmi/pull/1736) [`7c43e431`](https://github.com/wevm/wagmi/commit/7c43e431e2eb970610cc6490cee6a4093655a683) Thanks [@tmm](https://github.com/tmm)! - Fixed generated address object key type.
+
+## 0.1.0
+
+### Minor Changes
+
+- [#1732](https://github.com/wevm/wagmi/pull/1732) [`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c) Thanks [@tmm](https://github.com/tmm)! - Initial release
diff --git a/wagmi-project/packages/cli/README.md b/wagmi-project/packages/cli/README.md
new file mode 100644
index 000000000..640acb22d
--- /dev/null
+++ b/wagmi-project/packages/cli/README.md
@@ -0,0 +1,13 @@
+# @wagmi/cli
+
+Manage and generate code from Ethereum ABIs
+
+## Installation
+
+```bash
+pnpm add @wagmi/cli
+```
+
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
diff --git a/wagmi-project/packages/cli/package.json b/wagmi-project/packages/cli/package.json
new file mode 100644
index 000000000..8d59adb2b
--- /dev/null
+++ b/wagmi-project/packages/cli/package.json
@@ -0,0 +1,94 @@
+{
+ "name": "@wagmi/cli",
+ "description": "Manage and generate code from Ethereum ABIs",
+ "version": "2.3.1",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/wevm/wagmi.git",
+ "directory": "packages/cli"
+ },
+ "scripts": {
+ "build": "pnpm run clean && pnpm run build:esm+types",
+ "build:esm+types": "tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types",
+ "check:types": "tsc --noEmit",
+ "clean": "rm -rf dist tsconfig.tsbuildinfo config plugins",
+ "dev": "bun src/cli.ts",
+ "test:build": "publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm"
+ },
+ "files": [
+ "dist/**",
+ "!dist/**/*.tsbuildinfo",
+ "src/**/*.ts",
+ "!src/**/*.test.ts",
+ "!src/**/*.test-d.ts",
+ "/config",
+ "/plugins"
+ ],
+ "bin": {
+ "wagmi": "./dist/esm/cli.js"
+ },
+ "sideEffects": false,
+ "type": "module",
+ "main": "./dist/esm/exports/index.js",
+ "types": "./dist/types/exports/index.d.ts",
+ "typings": "./dist/types/exports/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/types/exports/index.d.ts",
+ "default": "./dist/esm/exports/index.js"
+ },
+ "./config": {
+ "types": "./dist/types/exports/config.d.ts",
+ "default": "./dist/esm/exports/config.js"
+ },
+ "./plugins": {
+ "types": "./dist/types/exports/plugins.d.ts",
+ "default": "./dist/esm/exports/plugins.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "typesVersions": {
+ "*": {
+ "config": ["./dist/types/exports/config.d.ts"],
+ "plugins": ["./dist/types/exports/plugins.d.ts"]
+ }
+ },
+ "peerDependencies": {
+ "typescript": ">=5.0.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "abitype": "^1.0.4",
+ "bundle-require": "^5.1.0",
+ "cac": "^6.7.14",
+ "change-case": "^5.4.4",
+ "chokidar": "4.0.3",
+ "dedent": "^1.5.3",
+ "dotenv": "^16.3.1",
+ "dotenv-expand": "^10.0.0",
+ "esbuild": "~0.26.0",
+ "escalade": "3.2.0",
+ "fdir": "^6.1.1",
+ "nanospinner": "1.2.2",
+ "pathe": "^2.0.3",
+ "picocolors": "^1.0.0",
+ "picomatch": "^4.0.2",
+ "prettier": "^3.0.3",
+ "viem": "2.x",
+ "zod": "^3.22.3"
+ },
+ "devDependencies": {
+ "@types/dedent": "^0.7.2",
+ "@types/node": "^22.14.0",
+ "fixturez": "^1.1.0",
+ "msw": "^2.4.9"
+ },
+ "contributors": ["awkweb.eth ", "jxom.eth "],
+ "funding": "https://github.com/sponsors/wevm",
+ "keywords": ["wagmi", "eth", "ethereum", "dapps", "wallet", "web3", "cli"]
+}
diff --git a/wagmi-project/packages/cli/src/cli.ts b/wagmi-project/packages/cli/src/cli.ts
new file mode 100644
index 000000000..551543bb2
--- /dev/null
+++ b/wagmi-project/packages/cli/src/cli.ts
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+import { cac } from 'cac'
+
+import { type Generate, generate } from './commands/generate.js'
+import { type Init, init } from './commands/init.js'
+import * as logger from './logger.js'
+import { version } from './version.js'
+
+const cli = cac('wagmi')
+
+cli
+ .command('generate', 'generate code based on configuration')
+ .option('-c, --config ', '[string] path to config file')
+ .option('-r, --root ', '[string] root path to resolve config from')
+ .option('-w, --watch', '[boolean] watch for changes')
+ .example((name) => `${name} generate`)
+ .action(async (options: Generate) => {
+ await generate(options)
+ if (!options.watch) process.exit(0)
+ })
+
+cli
+ .command('init', 'create configuration file')
+ .option('-c, --config ', '[string] path to config file')
+ .option('-r, --root ', '[string] root path to resolve config from')
+ .example((name) => `${name} init`)
+ .action(async (options: Init) => {
+ await init(options)
+ process.exit(0)
+ })
+
+cli.help()
+cli.version(version)
+
+void (async () => {
+ try {
+ process.title = 'node (wagmi)'
+ } catch {}
+
+ try {
+ // Parse CLI args without running command
+ cli.parse(process.argv, { run: false })
+ if (!cli.matchedCommand) {
+ if (cli.args.length === 0) {
+ if (!cli.options.help && !cli.options.version) cli.outputHelp()
+ } else throw new Error(`Unknown command: ${cli.args.join(' ')}`)
+ }
+ await cli.runMatchedCommand()
+ } catch (error) {
+ logger.error(`\n${(error as Error).message}`)
+ process.exit(1)
+ }
+})()
diff --git a/wagmi-project/packages/cli/src/commands/generate.test.ts b/wagmi-project/packages/cli/src/commands/generate.test.ts
new file mode 100644
index 000000000..91e426521
--- /dev/null
+++ b/wagmi-project/packages/cli/src/commands/generate.test.ts
@@ -0,0 +1,409 @@
+import { readFile } from 'node:fs/promises'
+import dedent from 'dedent'
+import { resolve } from 'pathe'
+import { afterEach, beforeEach, expect, test, vi } from 'vitest'
+
+import { createFixture, typecheck, watchConsole } from '../../test/utils.js'
+import { generate } from './generate.js'
+
+let console: ReturnType
+beforeEach(() => {
+ console = watchConsole()
+ vi.useFakeTimers()
+
+ const date = new Date(2023, 0, 30, 12)
+ vi.setSystemTime(date)
+})
+
+afterEach(() => {
+ vi.restoreAllMocks()
+ vi.useRealTimers()
+})
+
+test('generates output', async () => {
+ const { dir } = await createFixture({
+ files: {
+ tsconfig: true,
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.js',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await generate()
+
+ expect(console.formatted).toMatchInlineSnapshot(`
+ "- Validating plugins
+ ā Validating plugins
+ - Resolving contracts
+ ā Resolving contracts
+ - Running plugins
+ ā Running plugins
+ - Writing to generated.js
+ ā Writing to generated.js"
+ `)
+})
+
+test('generates typescript output', async () => {
+ const { dir, paths } = await createFixture({
+ files: {
+ tsconfig: true,
+ 'wagmi.config.ts': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await generate()
+
+ expect(console.formatted).toMatchInlineSnapshot(`
+ "- Validating plugins
+ ā Validating plugins
+ - Resolving contracts
+ ā Resolving contracts
+ - Running plugins
+ ā Running plugins
+ - Writing to generated.ts
+ ā Writing to generated.ts"
+ `)
+ await expect(typecheck(paths.tsconfig)).resolves.toMatchInlineSnapshot('""')
+})
+
+test('generates output with plugin', async () => {
+ const { dir } = await createFixture({
+ files: {
+ tsconfig: true,
+ 'wagmi.config.ts': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ plugins: [
+ {
+ name: 'Test',
+ async run({ contracts, isTypeScript, outputs }) {
+ return {
+ imports: '/* imports test */',
+ prepend: '/* prepend test */',
+ content: '/* content test */',
+ }
+ },
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await generate()
+
+ expect(console.formatted).toMatchInlineSnapshot(`
+ "- Validating plugins
+ ā Validating plugins
+ - Resolving contracts
+ ā Resolving contracts
+ - Running plugins
+ ā Running plugins
+ - Writing to generated.ts
+ ā Writing to generated.ts"
+ `)
+ /* eslint-disable no-irregular-whitespace */
+ await expect(
+ readFile(resolve(dir, 'generated.ts'), 'utf8'),
+ ).resolves.toMatchInlineSnapshot(`
+ "/* imports test */
+
+ /* prepend test */
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // Foo
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ export const fooAbi = [] as const
+
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // Test
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+ /* content test */
+ "
+ `)
+ /* eslint-enable no-irregular-whitespace */
+})
+
+test('behavior: invalid cli options', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(
+ generate({
+ // @ts-expect-error possible to pass untyped options through from cli
+ config: 1,
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [Error: Invalid option
+ - Expected string, received number at \`config\`]
+ `)
+})
+
+test('behavior: config not found', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: Config not found]',
+ )
+})
+
+test('behavior: config not found for path', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ try {
+ await generate({ config: 'wagmi.config.js' })
+ } catch (error) {
+ expect(
+ (error as Error).message.replace(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot('"Config not found at wagmi.config.js"')
+ }
+})
+
+test('behavior: config out not unique', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default [
+ {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ]
+ },
+ {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ },
+ ]
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(
+ `[Error: out "generated.ts" must be unique.]`,
+ )
+})
+
+test('behavior: config contract names not unique', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(
+ `[Error: Contract name "Foo" must be unique.]`,
+ )
+})
+
+test('behavior: displays message if no contracts found', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': "export default { out: 'generated.ts' }",
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await generate()
+
+ expect(console.formatted).toMatchInlineSnapshot(
+ `
+ "- Validating plugins
+ ā Validating plugins
+ - Resolving contracts
+ Ć Resolving contracts
+ No contracts found."
+ `,
+ )
+})
+
+test('behavior: throws when abi is invalid', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [{
+ type: 'function',
+ name: 'balanceOf',
+ stateMutability: 'view',
+ inputs: [{ type: 'address' }],
+ }],
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [Error: Invalid ABI for contract "Foo"
+ - Invalid input at \`[0]\`]
+ `)
+})
+
+test('behavior: throws when address is invalid', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ address: '0xfoo',
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [Error: Invalid address for contract "Foo"
+ - Invalid address]
+ `)
+})
+
+test('behavior: throws when multichain address is invalid', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ address: {
+ 1: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
+ 5: '0xfoo',
+ },
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [Error: Invalid address for contract "Foo"
+ - Invalid address at \`5\`]
+ `)
+})
+
+test('behavior: displays message if using --watch flag without watchers configured', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.js': dedent`
+ export default {
+ out: 'generated.ts',
+ contracts: [
+ {
+ abi: [],
+ name: 'Foo',
+ },
+ ],
+ }
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await generate({ watch: true })
+
+ expect(console.formatted).toMatchInlineSnapshot(`
+ "- Validating plugins
+ ā Validating plugins
+ - Resolving contracts
+ ā Resolving contracts
+ - Running plugins
+ ā Running plugins
+ - Writing to generated.ts
+ ā Writing to generated.ts
+ Used --watch flag, but no plugins are watching."
+ `)
+})
+
+test.todo('behavior: save config file logs change')
+test.todo('behavior: updates on add file')
+test.todo('behavior: updates on change file')
+test.todo('behavior: updates on unlink file')
+test.todo('behavior: runs watch command')
+test.todo('behavior: shuts down watch on SIGINT/SIGTERM')
diff --git a/wagmi-project/packages/cli/src/commands/generate.ts b/wagmi-project/packages/cli/src/commands/generate.ts
new file mode 100644
index 000000000..992a2e292
--- /dev/null
+++ b/wagmi-project/packages/cli/src/commands/generate.ts
@@ -0,0 +1,409 @@
+import { mkdir, writeFile } from 'node:fs/promises'
+import { Abi as AbiSchema } from 'abitype/zod'
+import { camelCase } from 'change-case'
+import type { ChokidarOptions, FSWatcher } from 'chokidar'
+import { watch } from 'chokidar'
+import { default as dedent } from 'dedent'
+import { basename, dirname, resolve } from 'pathe'
+import pc from 'picocolors'
+import { type Abi, type Address, getAddress } from 'viem'
+import { z } from 'zod'
+
+import type { Contract, ContractConfig, Plugin, Watch } from '../config.js'
+import { fromZodError } from '../errors.js'
+import * as logger from '../logger.js'
+import { findConfig } from '../utils/findConfig.js'
+import { format } from '../utils/format.js'
+import { getAddressDocString } from '../utils/getAddressDocString.js'
+import { getIsUsingTypeScript } from '../utils/getIsUsingTypeScript.js'
+import { resolveConfig } from '../utils/resolveConfig.js'
+
+const Generate = z.object({
+ /** Path to config file */
+ config: z.string().optional(),
+ /** Directory to search for config file */
+ root: z.string().optional(),
+ /** Watch for file system changes to config and plugins */
+ watch: z.boolean().optional(),
+})
+export type Generate = z.infer
+
+export async function generate(options: Generate = {}) {
+ // Validate command line options
+ try {
+ await Generate.parseAsync(options)
+ } catch (error) {
+ if (error instanceof z.ZodError)
+ throw fromZodError(error, { prefix: 'Invalid option' })
+ throw error
+ }
+
+ // Get cli config file
+ const configPath = await findConfig(options)
+ if (!configPath) {
+ if (options.config)
+ throw new Error(`Config not found at ${pc.gray(options.config)}`)
+ throw new Error('Config not found')
+ }
+
+ const resolvedConfigs = await resolveConfig({ configPath })
+ const isTypeScript = await getIsUsingTypeScript()
+
+ type Watcher = FSWatcher & { config?: Watch }
+ const watchers: Watcher[] = []
+ const watchWriteDelay = 100
+ const watchOptions = {
+ atomic: true,
+ // awaitWriteFinish: true,
+ ignoreInitial: true,
+ persistent: true,
+ } satisfies ChokidarOptions
+
+ const outNames = new Set()
+ const isArrayConfig = Array.isArray(resolvedConfigs)
+ const configs = isArrayConfig ? resolvedConfigs : [resolvedConfigs]
+ for (const config of configs) {
+ if (isArrayConfig)
+ logger.log(`Using config ${pc.gray(basename(configPath))}`)
+ if (!config.out) throw new Error('out is required.')
+ if (outNames.has(config.out))
+ throw new Error(`out "${config.out}" must be unique.`)
+ outNames.add(config.out)
+
+ // Collect contracts and watch configs from plugins
+ const plugins = (config.plugins ?? []).map((x, i) => ({
+ ...x,
+ id: `${x.name}-${i}`,
+ }))
+ const spinner = logger.spinner('Validating plugins')
+ spinner.start()
+ for (const plugin of plugins) {
+ await plugin.validate?.()
+ }
+ spinner.success()
+
+ // Add plugin contracts to config contracts
+ const contractConfigs = config.contracts ?? []
+ const watchConfigs: Watch[] = []
+ spinner.start('Resolving contracts')
+ for (const plugin of plugins) {
+ if (plugin.watch) watchConfigs.push(plugin.watch)
+ if (plugin.contracts) {
+ const contracts = await plugin.contracts()
+ contractConfigs.push(...contracts)
+ }
+ }
+
+ // Get contracts from config
+ const contractNames = new Set()
+ const contractMap = new Map()
+ for (const contractConfig of contractConfigs) {
+ if (contractNames.has(contractConfig.name))
+ throw new Error(
+ `Contract name "${contractConfig.name}" must be unique.`,
+ )
+ const contract = await getContract({ ...contractConfig, isTypeScript })
+ contractMap.set(contract.name, contract)
+
+ contractNames.add(contractConfig.name)
+ }
+
+ // Sort contracts by name Ascending (low to high) as the key is `String`
+ const sortedAscContractMap = new Map([...contractMap].sort())
+ const contracts = [...sortedAscContractMap.values()]
+ if (!contracts.length && !options.watch) {
+ spinner.error()
+ logger.warn('No contracts found.')
+ return
+ }
+ spinner.success()
+
+ // Run plugins
+ const imports = []
+ const prepend = []
+ const content = []
+ type Output = {
+ plugin: Pick
+ } & Awaited>>
+ const outputs: Output[] = []
+ spinner.start('Running plugins')
+ for (const plugin of plugins) {
+ if (!plugin.run) continue
+ const result = await plugin.run({
+ contracts,
+ isTypeScript,
+ outputs,
+ })
+ outputs.push({
+ plugin: { name: plugin.name },
+ ...result,
+ })
+ if (!result.imports && !result.prepend && !result.content) continue
+ content.push(getBannerContent({ name: plugin.name }), result.content)
+ result.imports && imports.push(result.imports)
+ result.prepend && prepend.push(result.prepend)
+ }
+ spinner.success()
+
+ // Write output to file
+ spinner.start(`Writing to ${pc.gray(config.out)}`)
+ await writeContracts({
+ content,
+ contracts,
+ imports,
+ prepend,
+ filename: config.out,
+ })
+ spinner.success()
+
+ if (options.watch) {
+ if (!watchConfigs.length) {
+ logger.log(pc.gray('Used --watch flag, but no plugins are watching.'))
+ continue
+ }
+ logger.log()
+ logger.log('Setting up watch process')
+
+ // Watch for changes
+ let timeout: NodeJS.Timeout | null
+ for (const watchConfig of watchConfigs) {
+ const paths =
+ typeof watchConfig.paths === 'function'
+ ? await watchConfig.paths()
+ : watchConfig.paths
+ const watcher = watch(paths, watchOptions)
+ // Watch for changes to files, new files, and deleted files
+ watcher.on('all', async (event, path) => {
+ if (event !== 'change' && event !== 'add' && event !== 'unlink')
+ return
+
+ let needsWrite = false
+ if (event === 'change' || event === 'add') {
+ const eventFn =
+ event === 'change' ? watchConfig.onChange : watchConfig.onAdd
+ const config = await eventFn?.(path)
+ if (!config) return
+ const contract = await getContract({ ...config, isTypeScript })
+ contractMap.set(contract.name, contract)
+ needsWrite = true
+ } else if (event === 'unlink') {
+ const name = await watchConfig.onRemove?.(path)
+ if (!name) return
+ contractMap.delete(name)
+ needsWrite = true
+ }
+
+ // Debounce writes
+ if (needsWrite) {
+ if (timeout) clearTimeout(timeout)
+ timeout = setTimeout(async () => {
+ timeout = null
+ // Sort contracts by name Ascending (low to high) as the key is `String`
+ const sortedAscContractMap = new Map([...contractMap].sort())
+ const contracts = [...sortedAscContractMap.values()]
+ const imports = []
+ const prepend = []
+ const content = []
+ const outputs: Output[] = []
+ for (const plugin of plugins) {
+ if (!plugin.run) continue
+ const result = await plugin.run({
+ contracts,
+ isTypeScript,
+ outputs,
+ })
+ outputs.push({
+ plugin: { name: plugin.name },
+ ...result,
+ })
+ if (!result.imports && !result.prepend && !result.content)
+ continue
+ content.push(
+ getBannerContent({ name: plugin.name }),
+ result.content,
+ )
+ result.imports && imports.push(result.imports)
+ result.prepend && prepend.push(result.prepend)
+ }
+
+ const spinner = logger.spinner(
+ `Writing to ${pc.gray(config.out)}`,
+ )
+ spinner.start()
+ await writeContracts({
+ content,
+ contracts,
+ imports,
+ prepend,
+ filename: config.out,
+ })
+ spinner.success()
+ }, watchWriteDelay)
+ needsWrite = false
+ }
+ })
+
+ // Run parallel command on ready
+ if (watchConfig.command)
+ watcher.on('ready', async () => {
+ await watchConfig.command?.()
+ })
+ ;(watcher as Watcher).config = watchConfig
+ watchers.push(watcher)
+ }
+ }
+ }
+
+ if (!watchers.length) return
+
+ // Watch `@wagmi/cli` config file for changes
+ const watcher = watch(configPath).on('change', async (path) => {
+ logger.log(
+ `> Found a change to config ${pc.gray(
+ basename(path),
+ )}. Restart process for changes to take effect.`,
+ )
+ })
+ watchers.push(watcher)
+
+ // Display message and close watchers on exit
+ process.once('SIGINT', shutdown)
+ process.once('SIGTERM', shutdown)
+ async function shutdown() {
+ logger.log()
+ logger.log('Shutting down watch process')
+ const promises = []
+ for (const watcher of watchers) {
+ if (watcher.config?.onClose) promises.push(watcher.config?.onClose?.())
+ promises.push(watcher.close())
+ }
+ await Promise.allSettled(promises)
+ process.exit(0)
+ }
+}
+
+async function getContract({
+ abi,
+ address,
+ name,
+ isTypeScript,
+}: ContractConfig & { isTypeScript: boolean }): Promise {
+ const constAssertion = isTypeScript ? ' as const' : ''
+ const abiName = `${camelCase(name)}Abi`
+ try {
+ abi = (await AbiSchema.parseAsync(abi)) as Abi
+ } catch (error) {
+ if (error instanceof z.ZodError)
+ throw fromZodError(error, {
+ prefix: `Invalid ABI for contract "${name}"`,
+ })
+ throw error
+ }
+ const docString =
+ typeof address === 'object'
+ ? dedent`\n
+ /**
+ ${getAddressDocString({ address })}
+ */
+ `
+ : ''
+ let content = dedent`
+ ${getBannerContent({ name })}
+
+ ${docString}
+ export const ${abiName} = ${JSON.stringify(abi)}${constAssertion}
+ `
+
+ let meta: Contract['meta'] = { abiName }
+ if (address) {
+ let resolvedAddress: Address | Record
+ try {
+ const Address = z
+ .string()
+ .regex(/^0x[a-fA-F0-9]{40}$/, { message: 'Invalid address' })
+ .transform((val) => getAddress(val)) as z.ZodType
+ const MultiChainAddress = z.record(z.string(), Address)
+ const AddressSchema = z.union([Address, MultiChainAddress])
+ resolvedAddress = await AddressSchema.parseAsync(address)
+ } catch (error) {
+ if (error instanceof z.ZodError)
+ throw fromZodError(error, {
+ prefix: `Invalid address for contract "${name}"`,
+ })
+ throw error
+ }
+
+ const addressName = `${camelCase(name)}Address`
+ const configName = `${camelCase(name)}Config`
+ meta = {
+ ...meta,
+ addressName,
+ configName,
+ }
+
+ const addressContent =
+ typeof resolvedAddress === 'string'
+ ? JSON.stringify(resolvedAddress)
+ : // Remove quotes from chain id key
+ JSON.stringify(resolvedAddress, null, 2).replace(/"(\d*)":/gm, '$1:')
+ content = dedent`
+ ${content}
+
+ ${docString}
+ export const ${addressName} = ${addressContent}${constAssertion}
+
+ ${docString}
+ export const ${configName} = { address: ${addressName}, abi: ${abiName} }${constAssertion}
+ `
+ }
+
+ return { abi, address, content, meta, name }
+}
+
+async function writeContracts({
+ content,
+ contracts,
+ imports,
+ prepend,
+ filename,
+}: {
+ content: string[]
+ contracts: Contract[]
+ imports: string[]
+ prepend: string[]
+ filename: string
+}) {
+ // Assemble code
+ let code = dedent`
+ ${imports.join('\n\n') ?? ''}
+
+ ${prepend.join('\n\n') ?? ''}
+ `
+ for (const contract of contracts) {
+ code = dedent`
+ ${code}
+
+ ${contract.content}
+ `
+ }
+ code = dedent`
+ ${code}
+
+ ${content.join('\n\n') ?? ''}
+ `
+
+ // Format and write output
+ const cwd = process.cwd()
+ const outPath = resolve(cwd, filename)
+ await mkdir(dirname(outPath), { recursive: true })
+ const formatted = await format(code)
+ await writeFile(outPath, formatted)
+}
+
+function getBannerContent({ name }: { name: string }) {
+ return dedent`
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ // ${name}
+ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+ `
+}
diff --git a/wagmi-project/packages/cli/src/commands/init.test.ts b/wagmi-project/packages/cli/src/commands/init.test.ts
new file mode 100644
index 000000000..ed4a1d164
--- /dev/null
+++ b/wagmi-project/packages/cli/src/commands/init.test.ts
@@ -0,0 +1,189 @@
+import { existsSync } from 'node:fs'
+import { mkdir, readFile } from 'node:fs/promises'
+import { resolve } from 'pathe'
+import { afterEach, beforeEach, expect, test, vi } from 'vitest'
+
+import { createFixture, watchConsole } from '../../test/utils.js'
+import { defaultConfig } from '../config.js'
+import { init } from './init.js'
+
+let console: ReturnType
+beforeEach(() => {
+ console = watchConsole()
+})
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('creates config file', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ const configFile = await init()
+
+ expect(existsSync(configFile)).toBeTruthy()
+ expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`
+ "// @ts-check
+
+ /** @type {import('@wagmi/cli').Config} */
+ export default {
+ out: 'src/generated.js',
+ contracts: [],
+ plugins: [],
+ }
+ "
+ `)
+ expect(
+ console.formatted.replaceAll(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot(`
+ "- Creating config
+ ā Creating config
+ Config created at wagmi.config.js"
+ `)
+})
+
+test('parameters: config', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ const configFile = await init({
+ config: 'foo.config.ts',
+ })
+
+ expect(existsSync(configFile)).toBeTruthy()
+ expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`
+ "// @ts-check
+
+ /** @type {import('@wagmi/cli').Config} */
+ export default {
+ out: 'src/generated.js',
+ contracts: [],
+ plugins: [],
+ }
+ "
+ `)
+ expect(
+ console.formatted.replaceAll(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot(`
+ "- Creating config
+ ā Creating config
+ Config created at foo.config.ts"
+ `)
+})
+
+test('parameters: content', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'tsconfig.json': '{}',
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ const configFile = await init({
+ content: {
+ ...defaultConfig,
+ out: 'foo/bar/baz.ts',
+ },
+ })
+
+ expect(existsSync(configFile)).toBeTruthy()
+ expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`
+ "import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig({
+ out: 'foo/bar/baz.ts',
+ contracts: [],
+ plugins: [],
+ })
+ "
+ `)
+ expect(
+ console.formatted.replaceAll(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot(`
+ "- Creating config
+ ā Creating config
+ Config created at wagmi.config.ts"
+ `)
+})
+
+test('parameters: root', async () => {
+ const { dir } = await createFixture()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+ mkdir(resolve(dir, 'foo'))
+
+ const configFile = await init({
+ root: 'foo/',
+ })
+
+ expect(existsSync(configFile)).toBeTruthy()
+ expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`
+ "// @ts-check
+
+ /** @type {import('@wagmi/cli').Config} */
+ export default {
+ out: 'src/generated.js',
+ contracts: [],
+ plugins: [],
+ }
+ "
+ `)
+ expect(
+ console.formatted.replaceAll(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot(`
+ "- Creating config
+ ā Creating config
+ Config created at foo/wagmi.config.js"
+ `)
+})
+
+test('behavior: creates config file in TypeScript format', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'tsconfig.json': '{}',
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ const configFile = await init()
+
+ expect(existsSync(configFile)).toBeTruthy()
+ expect(await readFile(configFile, 'utf-8')).toMatchInlineSnapshot(`
+ "import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig({
+ out: 'src/generated.ts',
+ contracts: [],
+ plugins: [],
+ })
+ "
+ `)
+ expect(
+ console.formatted.replaceAll(dir, 'path/to/project'),
+ ).toMatchInlineSnapshot(`
+ "- Creating config
+ ā Creating config
+ Config created at wagmi.config.ts"
+ `)
+})
+
+test('behavior: displays config file location when config exists', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.ts': '',
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ const configFile = await init()
+
+ expect(
+ console.formatted.replaceAll(configFile, 'path/to/project/wagmi.config.ts'),
+ ).toMatchInlineSnapshot('"Config already exists at wagmi.config.ts"')
+})
diff --git a/wagmi-project/packages/cli/src/commands/init.ts b/wagmi-project/packages/cli/src/commands/init.ts
new file mode 100644
index 000000000..ce4e5b32d
--- /dev/null
+++ b/wagmi-project/packages/cli/src/commands/init.ts
@@ -0,0 +1,95 @@
+import { writeFile } from 'node:fs/promises'
+import dedent from 'dedent'
+import { relative, resolve } from 'pathe'
+import pc from 'picocolors'
+import { z } from 'zod'
+
+import { type Config, defaultConfig } from '../config.js'
+import { fromZodError } from '../errors.js'
+import * as logger from '../logger.js'
+import { findConfig } from '../utils/findConfig.js'
+import { format } from '../utils/format.js'
+import { getIsUsingTypeScript } from '../utils/getIsUsingTypeScript.js'
+
+export type Init = {
+ /** Path to config file */
+ config?: string
+ /** Watch for file system changes to config and plugins */
+ content?: Config
+ /** Directory to init config file */
+ root?: string
+}
+
+const Init = z.object({
+ config: z.string().optional(),
+ content: z.object({}).optional(),
+ root: z.string().optional(),
+})
+
+export async function init(options: Init = {}) {
+ // Validate command line options
+ try {
+ await Init.parseAsync(options)
+ } catch (error) {
+ if (error instanceof z.ZodError)
+ throw fromZodError(error, { prefix: 'Invalid option' })
+ throw error
+ }
+
+ // Check for existing config file
+ const configPath = await findConfig(options)
+ if (configPath) {
+ logger.info(
+ `Config already exists at ${pc.gray(
+ relative(process.cwd(), configPath),
+ )}`,
+ )
+ return configPath
+ }
+
+ const spinner = logger.spinner('Creating config')
+ spinner.start()
+ // Check if project is using TypeScript
+ const isUsingTypeScript = await getIsUsingTypeScript()
+ const rootDir = resolve(options.root || process.cwd())
+ let outPath: string
+ if (options.config) {
+ outPath = resolve(rootDir, options.config)
+ } else {
+ const extension = isUsingTypeScript ? 'ts' : 'js'
+ outPath = resolve(rootDir, `wagmi.config.${extension}`)
+ }
+
+ let content: string
+ if (isUsingTypeScript) {
+ const config = options.content ?? defaultConfig
+ content = dedent(`
+ import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig(${JSON.stringify(config)})
+ `)
+ } else {
+ const config = options.content ?? {
+ ...defaultConfig,
+ out: defaultConfig.out.replace('.ts', '.js'),
+ }
+ content = dedent(`
+ // @ts-check
+
+ /** @type {import('@wagmi/cli').Config} */
+ export default ${JSON.stringify(config, null, 2).replace(
+ /"(\d*)":/gm,
+ '$1:',
+ )}
+ `)
+ }
+
+ const formatted = await format(content)
+ await writeFile(outPath, formatted)
+ spinner.success()
+ logger.success(
+ `Config created at ${pc.gray(relative(process.cwd(), outPath))}`,
+ )
+
+ return outPath
+}
diff --git a/wagmi-project/packages/cli/src/config.test.ts b/wagmi-project/packages/cli/src/config.test.ts
new file mode 100644
index 000000000..f95d7cb6d
--- /dev/null
+++ b/wagmi-project/packages/cli/src/config.test.ts
@@ -0,0 +1,39 @@
+import { expect, test, vi } from 'vitest'
+
+import { type Config, defineConfig } from './config.js'
+
+test('object', () => {
+ const config: Config = {
+ contracts: [],
+ out: 'wagmi.ts',
+ plugins: [],
+ }
+ expect(defineConfig(config)).toEqual(config)
+})
+
+test('array', () => {
+ const config: Config = {
+ contracts: [],
+ out: 'wagmi.ts',
+ plugins: [],
+ }
+ expect(defineConfig([config, config])).toEqual([config, config])
+})
+
+test('function', () => {
+ const config = vi.fn().mockImplementation(() => ({
+ contracts: [],
+ out: 'wagmi.ts',
+ plugins: [],
+ }))
+ expect(defineConfig(config)).toEqual(config)
+})
+
+test('async function', () => {
+ const config = vi.fn().mockImplementation(async () => ({
+ contracts: [],
+ out: 'wagmi.ts',
+ plugins: [],
+ }))
+ expect(defineConfig(config)).toEqual(config)
+})
diff --git a/wagmi-project/packages/cli/src/config.ts b/wagmi-project/packages/cli/src/config.ts
new file mode 100644
index 000000000..146a1e342
--- /dev/null
+++ b/wagmi-project/packages/cli/src/config.ts
@@ -0,0 +1,121 @@
+import type { Abi, Address } from 'viem'
+
+import type { Compute, MaybeArray, MaybePromise } from './types.js'
+
+export type ContractConfig<
+ chainId extends number = number,
+ requiredChainId extends number | undefined = undefined,
+> = {
+ /**
+ * Contract ABI
+ */
+ abi: Abi
+ /**
+ * Contract address or addresses.
+ *
+ * Accepts an object `{ [chainId]: address }` to support multiple chains.
+ *
+ * @example
+ * '0x314159265dd8dbb310642f98f50c066173c1259b'
+ *
+ * @example
+ * {
+ * 1: '0x314159265dd8dbb310642f98f50c066173c1259b',
+ * 5: '0x112234455c3a32fd11230c42e7bccd4a84e02010',
+ * }
+ */
+ address?:
+ | Address
+ | (requiredChainId extends number
+ ? Record & Partial>
+ : Record)
+ | undefined
+ /**
+ * Name of contract.
+ */
+ name: string
+}
+
+export type Contract = Compute<
+ ContractConfig & {
+ /** Generated string content */
+ content: string
+ /** Meta info about contract */
+ meta: {
+ abiName: string
+ addressName?: string | undefined
+ configName?: string | undefined
+ }
+ }
+>
+
+export type Watch = {
+ /** Command to run along with watch process */
+ command?: (() => MaybePromise) | undefined
+ /** Paths to watch for changes. */
+ paths: string[] | (() => MaybePromise)
+ /** Callback that fires when file is added */
+ onAdd?:
+ | ((path: string) => MaybePromise)
+ | undefined
+ /** Callback that fires when file changes */
+ onChange: (path: string) => MaybePromise
+ /** Callback that fires when watcher is shutdown */
+ onClose?: (() => MaybePromise) | undefined
+ /** Callback that fires when file is removed */
+ onRemove?: ((path: string) => MaybePromise) | undefined
+}
+
+export type Plugin = {
+ /** Contracts provided by plugin */
+ contracts?: (() => MaybePromise) | undefined
+ /** Plugin name */
+ name: string
+ /** Run plugin logic */
+ run?:
+ | ((config: {
+ /** All resolved contracts from config and plugins */
+ contracts: Contract[]
+ /** Whether TypeScript is detected in project */
+ isTypeScript: boolean
+ /** Previous plugin outputs */
+ outputs: readonly {
+ plugin: Pick
+ imports?: string
+ prepend?: string
+ content: string
+ }[]
+ }) => MaybePromise<{
+ imports?: string
+ prepend?: string
+ content: string
+ }>)
+ | undefined
+ /**
+ * Validate plugin configuration or other @wagmi/cli settings require for plugin.
+ */
+ validate?: (() => MaybePromise) | undefined
+ /** File system watch config */
+ watch?: Watch | undefined
+}
+
+export type Config = {
+ /** Contracts to use in commands */
+ contracts?: ContractConfig[] | undefined
+ /** Output file path */
+ out: string
+ /** Plugins to run */
+ plugins?: Plugin[] | undefined
+}
+
+export function defineConfig(
+ config: MaybeArray | (() => MaybePromise>),
+) {
+ return config
+}
+
+export const defaultConfig = {
+ out: 'src/generated.ts',
+ contracts: [],
+ plugins: [],
+} satisfies Config
diff --git a/wagmi-project/packages/cli/src/errors.ts b/wagmi-project/packages/cli/src/errors.ts
new file mode 100644
index 000000000..6ef37093f
--- /dev/null
+++ b/wagmi-project/packages/cli/src/errors.ts
@@ -0,0 +1,57 @@
+import type { z } from 'zod'
+
+class ValidationError extends Error {
+ details: Zod.ZodIssue[]
+
+ constructor(
+ message: string,
+ options: {
+ details: Zod.ZodIssue[]
+ },
+ ) {
+ super(message)
+ this.details = options.details
+ }
+}
+
+// From https://github.com/causaly/zod-validation-error
+export function fromZodError(
+ zError: z.ZodError,
+ {
+ maxIssuesInMessage = 99,
+ issueSeparator = '\n- ',
+ prefixSeparator = '\n- ',
+ prefix = 'Validation Error',
+ }: {
+ maxIssuesInMessage?: number
+ issueSeparator?: string
+ prefixSeparator?: string
+ prefix?: string
+ } = {},
+): ValidationError {
+ function joinPath(arr: Array): string {
+ return arr.reduce((acc, value) => {
+ if (typeof value === 'number') return `${acc}[${value}]`
+ const separator = acc === '' ? '' : '.'
+ return acc + separator + value
+ }, '')
+ }
+
+ const reason = zError.errors
+ // limit max number of issues printed in the reason section
+ .slice(0, maxIssuesInMessage)
+ // format error message
+ .map((issue) => {
+ const { message, path } = issue
+ if (path.length > 0) return `${message} at \`${joinPath(path)}\``
+ return message
+ })
+ // concat as string
+ .join(issueSeparator)
+
+ const message = reason ? [prefix, reason].join(prefixSeparator) : prefix
+
+ return new ValidationError(message, {
+ details: zError.errors,
+ })
+}
diff --git a/wagmi-project/packages/cli/src/exports/config.test.ts b/wagmi-project/packages/cli/src/exports/config.test.ts
new file mode 100644
index 000000000..c833780ff
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/config.test.ts
@@ -0,0 +1,12 @@
+import { expect, test } from 'vitest'
+
+import * as Exports from './config.js'
+
+test('exports', () => {
+ expect(Object.keys(Exports)).toMatchInlineSnapshot(`
+ [
+ "defineConfig",
+ "defaultConfig",
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/exports/config.ts b/wagmi-project/packages/cli/src/exports/config.ts
new file mode 100644
index 000000000..b3c4a83ba
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/config.ts
@@ -0,0 +1,10 @@
+// biome-ignore lint/performance/noBarrelFile: entrypoint module
+export {
+ type ContractConfig,
+ type Contract,
+ type Watch,
+ type Plugin,
+ type Config,
+ defineConfig,
+ defaultConfig,
+} from '../config.js'
diff --git a/wagmi-project/packages/cli/src/exports/index.test-d.ts b/wagmi-project/packages/cli/src/exports/index.test-d.ts
new file mode 100644
index 000000000..b056d5635
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/index.test-d.ts
@@ -0,0 +1,4 @@
+import { expectTypeOf } from 'vitest'
+
+// noop test because vitest typecheck fails unless each workspace project has type test
+expectTypeOf(1).toEqualTypeOf()
diff --git a/wagmi-project/packages/cli/src/exports/index.test.ts b/wagmi-project/packages/cli/src/exports/index.test.ts
new file mode 100644
index 000000000..2da78e8da
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/index.test.ts
@@ -0,0 +1,14 @@
+import { expect, test } from 'vitest'
+
+import * as Exports from './index.js'
+
+test('exports', () => {
+ expect(Object.keys(Exports)).toMatchInlineSnapshot(`
+ [
+ "defineConfig",
+ "logger",
+ "loadEnv",
+ "version",
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/exports/index.ts b/wagmi-project/packages/cli/src/exports/index.ts
new file mode 100644
index 000000000..1c5e624df
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/index.ts
@@ -0,0 +1,14 @@
+// biome-ignore lint/performance/noBarrelFile: entrypoint module
+export {
+ defineConfig,
+ type Config,
+ type ContractConfig,
+ type Plugin,
+} from '../config.js'
+
+// biome-ignore lint/performance/noReExportAll: entrypoint module
+export * as logger from '../logger.js'
+
+export { loadEnv } from '../utils/loadEnv.js'
+
+export { version } from '../version.js'
diff --git a/wagmi-project/packages/cli/src/exports/plugins.test.ts b/wagmi-project/packages/cli/src/exports/plugins.test.ts
new file mode 100644
index 000000000..4d7b5a97c
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/plugins.test.ts
@@ -0,0 +1,20 @@
+import { expect, test } from 'vitest'
+
+import * as Exports from './plugins.js'
+
+test('exports', () => {
+ expect(Object.keys(Exports)).toMatchInlineSnapshot(`
+ [
+ "actions",
+ "blockExplorer",
+ "etherscan",
+ "fetch",
+ "foundry",
+ "foundryDefaultExcludes",
+ "hardhat",
+ "hardhatDefaultExcludes",
+ "react",
+ "sourcify",
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/exports/plugins.ts b/wagmi-project/packages/cli/src/exports/plugins.ts
new file mode 100644
index 000000000..a289b5c57
--- /dev/null
+++ b/wagmi-project/packages/cli/src/exports/plugins.ts
@@ -0,0 +1,27 @@
+// biome-ignore lint/performance/noBarrelFile: entrypoint module
+export { actions, type ActionsConfig } from '../plugins/actions.js'
+
+export {
+ blockExplorer,
+ type BlockExplorerConfig,
+} from '../plugins/blockExplorer.js'
+
+export { etherscan, type EtherscanConfig } from '../plugins/etherscan.js'
+
+export { fetch, type FetchConfig } from '../plugins/fetch.js'
+
+export {
+ foundry,
+ foundryDefaultExcludes,
+ type FoundryConfig,
+} from '../plugins/foundry.js'
+
+export {
+ hardhat,
+ hardhatDefaultExcludes,
+ type HardhatConfig,
+} from '../plugins/hardhat.js'
+
+export { react, type ReactConfig } from '../plugins/react.js'
+
+export { sourcify, type SourcifyConfig } from '../plugins/sourcify.js'
diff --git a/wagmi-project/packages/cli/src/logger.test.ts b/wagmi-project/packages/cli/src/logger.test.ts
new file mode 100644
index 000000000..7338c3bb1
--- /dev/null
+++ b/wagmi-project/packages/cli/src/logger.test.ts
@@ -0,0 +1,32 @@
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { watchConsole } from '../test/utils.js'
+
+import * as logger from './logger.js'
+
+const mockLog = vi.fn()
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test.each(['success', 'info', 'log', 'warn', 'error'])('%s()', (level) => {
+ const spy = vi.spyOn(logger, level as any)
+ spy.mockImplementation(mockLog)
+ const loggerFn = (logger as any)[level]
+ loggerFn(level)
+ expect(spy).toHaveBeenCalledWith(level)
+})
+
+test('spinner', () => {
+ const console = watchConsole()
+ const spinner = logger.spinner('start')
+ spinner.start()
+ spinner.success('success')
+ spinner.error('error')
+ expect(console.formatted).toMatchInlineSnapshot(`
+ "- start
+ ā success
+ Ć error"
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/logger.ts b/wagmi-project/packages/cli/src/logger.ts
new file mode 100644
index 000000000..b56fb9728
--- /dev/null
+++ b/wagmi-project/packages/cli/src/logger.ts
@@ -0,0 +1,37 @@
+import { format as utilFormat } from 'node:util'
+import { createSpinner } from 'nanospinner'
+import pc from 'picocolors'
+
+function format(args: any[]) {
+ return utilFormat(...args)
+ .split('\n')
+ .join('\n')
+}
+
+export function success(...args: any[]) {
+ // biome-ignore lint/suspicious/noConsoleLog: console.log is used for logging
+ console.log(pc.green(format(args)))
+}
+
+export function info(...args: any[]) {
+ console.info(pc.blue(format(args)))
+}
+
+export function log(...args: any[]) {
+ // biome-ignore lint/suspicious/noConsoleLog: console.log is used for logging
+ console.log(pc.white(format(args)))
+}
+
+export function warn(...args: any[]) {
+ console.warn(pc.yellow(format(args)))
+}
+
+export function error(...args: any[]) {
+ console.error(pc.red(format(args)))
+}
+
+export function spinner(text: string) {
+ return createSpinner(text, {
+ color: 'yellow',
+ })
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/.gitignore b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/.gitignore
new file mode 100644
index 000000000..3269660cc
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/.gitignore
@@ -0,0 +1,11 @@
+# Compiler files
+cache/
+out/
+
+# Ignores development broadcast logs
+!/broadcast
+/broadcast/*/31337/
+/broadcast/**/dry-run/
+
+# Dotenv file
+.env
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/foundry.toml b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/foundry.toml
new file mode 100644
index 000000000..59374b16c
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/foundry.toml
@@ -0,0 +1,7 @@
+[profile.default]
+libs = ['lib']
+out = 'out'
+solc = '0.8.13'
+src = 'src'
+
+# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Counter.sol b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Counter.sol
new file mode 100644
index 000000000..5242caa43
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Counter.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+contract Counter {
+ uint256 public number;
+
+ function setNumber(uint256 newNumber) public {
+ number = newNumber;
+ }
+
+ function increment() public {
+ number++;
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Foo.sol b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Foo.sol
new file mode 100644
index 000000000..f47873652
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/foundry/src/Foo.sol
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+contract Foo {
+ string public bar;
+
+ function setFoo(string memory baz) public {
+ bar = baz;
+ }
+}
+
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/.gitignore b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/.gitignore
new file mode 100644
index 000000000..85d361b91
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/.gitignore
@@ -0,0 +1,10 @@
+node_modules
+.env
+coverage
+coverage.json
+typechain
+typechain-types
+
+# Hardhat files
+cache
+artifacts
\ No newline at end of file
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Counter.sol b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Counter.sol
new file mode 100644
index 000000000..5242caa43
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Counter.sol
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+contract Counter {
+ uint256 public number;
+
+ function setNumber(uint256 newNumber) public {
+ number = newNumber;
+ }
+
+ function increment() public {
+ number++;
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Foo.sol b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Foo.sol
new file mode 100644
index 000000000..699a63ce0
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/contracts/Foo.sol
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.13;
+
+contract Foo {
+ string public bar;
+
+ function setFoo(string memory baz) public {
+ bar = baz;
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js
new file mode 100644
index 000000000..c8126eedf
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ solidity: '0.8.17',
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/package.json b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/package.json
new file mode 100644
index 000000000..85c9ffb7b
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__fixtures__/hardhat/package.json
@@ -0,0 +1,7 @@
+{
+ "name": "hardhat-fixture",
+ "private": true,
+ "devDependencies": {
+ "hardhat": "^2.22.3"
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/__snapshots__/blockExplorer.test.ts.snap b/wagmi-project/packages/cli/src/plugins/__snapshots__/blockExplorer.test.ts.snap
new file mode 100644
index 000000000..2abd35174
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__snapshots__/blockExplorer.test.ts.snap
@@ -0,0 +1,736 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`fetches ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ "name": "WagmiMintExample",
+ },
+]
+`;
+
+exports[`fetches ABI with multichain deployment 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "1": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ "10": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ },
+ "name": "WagmiMintExample",
+ },
+]
+`;
diff --git a/wagmi-project/packages/cli/src/plugins/__snapshots__/etherscan.test.ts.snap b/wagmi-project/packages/cli/src/plugins/__snapshots__/etherscan.test.ts.snap
new file mode 100644
index 000000000..e03ee30f8
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__snapshots__/etherscan.test.ts.snap
@@ -0,0 +1,1238 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`fetches ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "1": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ },
+ "name": "WagmiMintExample",
+ },
+]
+`;
+
+exports[`fetches ABI with multichain deployment 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "1": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ "10": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ },
+ "name": "WagmiMintExample",
+ },
+]
+`;
+
+exports[`tryFetchProxyImplementation: fetches ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "1": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ },
+ "name": "WagmiMintExample",
+ },
+]
+`;
+
+exports[`tryFetchProxyImplementation: fetches implementation ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newImplementation",
+ "type": "address",
+ },
+ ],
+ "name": "upgradeTo",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newImplementation",
+ "type": "address",
+ },
+ {
+ "name": "data",
+ "type": "bytes",
+ },
+ ],
+ "name": "upgradeToAndCall",
+ "outputs": [],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function",
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "implementation",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newAdmin",
+ "type": "address",
+ },
+ ],
+ "name": "changeAdmin",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "admin",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "name": "_implementation",
+ "type": "address",
+ },
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "previousAdmin",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "name": "newAdmin",
+ "type": "address",
+ },
+ ],
+ "name": "AdminChanged",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "implementation",
+ "type": "address",
+ },
+ ],
+ "name": "Upgraded",
+ "type": "event",
+ },
+ ],
+ "address": {
+ "1": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
+ },
+ "name": "FiatToken",
+ },
+]
+`;
diff --git a/wagmi-project/packages/cli/src/plugins/__snapshots__/fetch.test.ts.snap b/wagmi-project/packages/cli/src/plugins/__snapshots__/fetch.test.ts.snap
new file mode 100644
index 000000000..83c4e81f5
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__snapshots__/fetch.test.ts.snap
@@ -0,0 +1,367 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`fetches ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "approved",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Approval",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "ApprovalForAll",
+ "type": "event",
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "Transfer",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "approve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ {
+ "internalType": "bytes",
+ "name": "_data",
+ "type": "bytes",
+ },
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "operator",
+ "type": "address",
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool",
+ },
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "tokenURI",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address",
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address",
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256",
+ },
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": "0xaf0326d92b97df1221759476b072abfd8084f9be",
+ "name": "WagmiMintExample",
+ },
+]
+`;
diff --git a/wagmi-project/packages/cli/src/plugins/__snapshots__/sourcify.test.ts.snap b/wagmi-project/packages/cli/src/plugins/__snapshots__/sourcify.test.ts.snap
new file mode 100644
index 000000000..77e82fecd
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/__snapshots__/sourcify.test.ts.snap
@@ -0,0 +1,214 @@
+// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
+
+exports[`fetches ABI 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "inputs": [
+ {
+ "name": "pubkey",
+ "type": "bytes",
+ },
+ {
+ "name": "withdrawal_credentials",
+ "type": "bytes",
+ },
+ {
+ "name": "amount",
+ "type": "bytes",
+ },
+ {
+ "name": "signature",
+ "type": "bytes",
+ },
+ {
+ "name": "index",
+ "type": "bytes",
+ },
+ ],
+ "name": "DepositEvent",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "name": "pubkey",
+ "type": "bytes",
+ },
+ {
+ "name": "withdrawal_credentials",
+ "type": "bytes",
+ },
+ {
+ "name": "signature",
+ "type": "bytes",
+ },
+ {
+ "name": "deposit_data_root",
+ "type": "bytes32",
+ },
+ ],
+ "name": "deposit",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "get_deposit_count",
+ "outputs": [
+ {
+ "type": "bytes",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "get_deposit_root",
+ "outputs": [
+ {
+ "type": "bytes32",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "1": "0x00000000219ab540356cbb839cbe05303d7705fa",
+ },
+ "name": "DepositContract",
+ },
+]
+`;
+
+exports[`fetches ABI with multichain deployment 1`] = `
+[
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor",
+ },
+ {
+ "inputs": [
+ {
+ "name": "pubkey",
+ "type": "bytes",
+ },
+ {
+ "name": "withdrawal_credentials",
+ "type": "bytes",
+ },
+ {
+ "name": "amount",
+ "type": "bytes",
+ },
+ {
+ "name": "signature",
+ "type": "bytes",
+ },
+ {
+ "name": "index",
+ "type": "bytes",
+ },
+ ],
+ "name": "DepositEvent",
+ "type": "event",
+ },
+ {
+ "inputs": [
+ {
+ "name": "pubkey",
+ "type": "bytes",
+ },
+ {
+ "name": "withdrawal_credentials",
+ "type": "bytes",
+ },
+ {
+ "name": "signature",
+ "type": "bytes",
+ },
+ {
+ "name": "deposit_data_root",
+ "type": "bytes32",
+ },
+ ],
+ "name": "deposit",
+ "outputs": [],
+ "stateMutability": "payable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "get_deposit_count",
+ "outputs": [
+ {
+ "type": "bytes",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "get_deposit_root",
+ "outputs": [
+ {
+ "type": "bytes32",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "name": "interfaceId",
+ "type": "bytes4",
+ },
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "type": "bool",
+ },
+ ],
+ "stateMutability": "pure",
+ "type": "function",
+ },
+ ],
+ "address": {
+ "100": "0xC4c622862a8F548997699bE24EA4bc504e5cA865",
+ "137": "0xC4c622862a8F548997699bE24EA4bc504e5cA865",
+ },
+ "name": "Community",
+ },
+]
+`;
diff --git a/wagmi-project/packages/cli/src/plugins/actions.test.ts b/wagmi-project/packages/cli/src/plugins/actions.test.ts
new file mode 100644
index 000000000..51b445b61
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/actions.test.ts
@@ -0,0 +1,359 @@
+import { erc20Abi } from 'viem'
+import { expect, test } from 'vitest'
+
+import { actions } from './actions.js'
+
+test('default', async () => {
+ const result = await actions().run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.imports).toMatchInlineSnapshot(`
+ "import { createReadContract, createWriteContract, createSimulateContract, createWatchContractEvent } from '@wagmi/core/codegen'
+ "
+ `)
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'name' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const simulateErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const simulateErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const simulateErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const simulateErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, eventName: 'Transfer' })"
+ `)
+})
+
+test('address', async () => {
+ const result = await actions().run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ addressName: 'erc20Address',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const simulateErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const simulateErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const simulateErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const simulateErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })"
+ `)
+})
+
+test('legacy hook names', async () => {
+ const result = await actions({ getActionName: 'legacy' }).run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ addressName: 'erc20Address',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const readErc20 = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const readErc20Allowance = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const readErc20BalanceOf = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const readErc20Decimals = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const readErc20Name = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const readErc20Symbol = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link readContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const readErc20TotalSupply = /*#__PURE__*/ createReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const writeErc20 = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const writeErc20Approve = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const writeErc20Transfer = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link writeContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const writeErc20TransferFrom = /*#__PURE__*/ createWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const prepareWriteErc20 = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const prepareWriteErc20Approve = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const prepareWriteErc20Transfer = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link simulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const prepareWriteErc20TransferFrom = /*#__PURE__*/ createSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const watchErc20Event = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const watchErc20ApprovalEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link watchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const watchErc20TransferEvent = /*#__PURE__*/ createWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })"
+ `)
+})
+
+test('override package name', async () => {
+ const result = await actions({ overridePackageName: 'wagmi' }).run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.imports).toMatchInlineSnapshot(`
+ "import { createReadContract, createWriteContract, createSimulateContract, createWatchContractEvent } from 'wagmi/codegen'
+ "
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/plugins/actions.ts b/wagmi-project/packages/cli/src/plugins/actions.ts
new file mode 100644
index 000000000..01c804fd9
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/actions.ts
@@ -0,0 +1,321 @@
+import { pascalCase } from 'change-case'
+
+import type { Contract, Plugin } from '../config.js'
+import type { Compute, RequiredBy } from '../types.js'
+import { getAddressDocString } from '../utils/getAddressDocString.js'
+import { getIsPackageInstalled } from '../utils/packages.js'
+
+export type ActionsConfig = {
+ getActionName?:
+ | 'legacy' // TODO: Deprecate `'legacy'` option
+ | ((options: {
+ contractName: string
+ itemName?: string | undefined
+ type: 'read' | 'simulate' | 'watch' | 'write'
+ }) => string)
+ overridePackageName?: '@wagmi/core' | 'wagmi' | undefined
+}
+
+type ActionsResult = Compute>
+
+export function actions(config: ActionsConfig = {}): ActionsResult {
+ return {
+ name: 'Action',
+ async run({ contracts }) {
+ const imports = new Set([])
+ const content: string[] = []
+ const pure = '/*#__PURE__*/'
+
+ const actionNames = new Set()
+ for (const contract of contracts) {
+ let hasReadFunction = false
+ let hasWriteFunction = false
+ let hasEvent = false
+ const readItems = []
+ const writeItems = []
+ const eventItems = []
+ for (const item of contract.abi) {
+ if (item.type === 'function')
+ if (
+ item.stateMutability === 'view' ||
+ item.stateMutability === 'pure'
+ ) {
+ hasReadFunction = true
+ readItems.push(item)
+ } else {
+ hasWriteFunction = true
+ writeItems.push(item)
+ }
+ else if (item.type === 'event') {
+ hasEvent = true
+ eventItems.push(item)
+ }
+ }
+
+ let innerContent: string
+ if (contract.meta.addressName)
+ innerContent = `abi: ${contract.meta.abiName}, address: ${contract.meta.addressName}`
+ else innerContent = `abi: ${contract.meta.abiName}`
+
+ if (hasReadFunction) {
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'read',
+ contract.name,
+ )
+ const docString = genDocString('readContract', contract)
+ const functionName = 'createReadContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of readItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'pure' &&
+ item.stateMutability !== 'view'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const hookName = getActionName(
+ config,
+ actionNames,
+ 'read',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('readContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+
+ if (hasWriteFunction) {
+ {
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'write',
+ contract.name,
+ )
+ const docString = genDocString('writeContract', contract)
+ const functionName = 'createWriteContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of writeItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'nonpayable' &&
+ item.stateMutability !== 'payable'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'write',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('writeContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+
+ {
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'simulate',
+ contract.name,
+ )
+ const docString = genDocString('simulateContract', contract)
+ const functionName = 'createSimulateContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of writeItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'nonpayable' &&
+ item.stateMutability !== 'payable'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'simulate',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('simulateContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+ }
+
+ if (hasEvent) {
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'watch',
+ contract.name,
+ )
+ const docString = genDocString('watchContractEvent', contract)
+ const functionName = 'createWatchContractEvent'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of eventItems) {
+ if (item.type !== 'event') continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const actionName = getActionName(
+ config,
+ actionNames,
+ 'watch',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('watchContractEvent', contract, {
+ name: 'eventName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${actionName} = ${pure} ${functionName}({ ${innerContent}, eventName: '${item.name}' })`,
+ )
+ }
+ }
+ }
+
+ const importValues = [...imports.values()]
+
+ let packageName = '@wagmi/core/codegen'
+ if (config.overridePackageName) {
+ switch (config.overridePackageName) {
+ case '@wagmi/core':
+ packageName = '@wagmi/core/codegen'
+ break
+ case 'wagmi':
+ packageName = 'wagmi/codegen'
+ break
+ }
+ } else if (await getIsPackageInstalled({ packageName: 'wagmi' }))
+ packageName = 'wagmi/codegen'
+ else if (await getIsPackageInstalled({ packageName: '@wagmi/core' }))
+ packageName = '@wagmi/core/codegen'
+
+ return {
+ imports: importValues.length
+ ? `import { ${importValues.join(', ')} } from '${packageName}'\n`
+ : '',
+ content: content.join('\n\n'),
+ }
+ },
+ }
+}
+
+function genDocString(
+ actionName: string,
+ contract: Contract,
+ item?: { name: string; value: string },
+) {
+ let description = `Wraps __{@link ${actionName}}__ with \`abi\` set to __{@link ${contract.meta.abiName}}__`
+ if (item) description += ` and \`${item.name}\` set to \`"${item.value}"\``
+
+ const docString = getAddressDocString({ address: contract.address })
+ if (docString)
+ return `/**
+ * ${description}
+ *
+ ${docString}
+ */`
+
+ return `/**
+ * ${description}
+ */`
+}
+
+function getActionName(
+ config: ActionsConfig,
+ actionNames: Set,
+ type: 'read' | 'simulate' | 'watch' | 'write',
+ contractName: string,
+ itemName?: string | undefined,
+) {
+ const ContractName = pascalCase(contractName)
+ const ItemName = itemName ? pascalCase(itemName) : undefined
+
+ let actionName: string
+ if (typeof config.getActionName === 'function')
+ actionName = config.getActionName({
+ type,
+ contractName: ContractName,
+ itemName: ItemName,
+ })
+ else if (typeof config.getActionName === 'string' && type === 'simulate') {
+ actionName = `prepareWrite${ContractName}${ItemName ?? ''}`
+ } else {
+ actionName = `${type}${ContractName}${ItemName ?? ''}`
+ if (type === 'watch') actionName = `${actionName}Event`
+ }
+
+ if (actionNames.has(actionName))
+ throw new Error(
+ `Action name "${actionName}" must be unique for contract "${contractName}". Try using \`getActionName\` to create a unique name.`,
+ )
+
+ actionNames.add(actionName)
+ return actionName
+}
diff --git a/wagmi-project/packages/cli/src/plugins/blockExplorer.test.ts b/wagmi-project/packages/cli/src/plugins/blockExplorer.test.ts
new file mode 100644
index 000000000..13372f53e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/blockExplorer.test.ts
@@ -0,0 +1,53 @@
+import { setupServer } from 'msw/node'
+import { afterAll, afterEach, beforeAll, expect, test } from 'vitest'
+
+import {
+ address,
+ apiKey,
+ baseUrl,
+ handlers,
+ unverifiedContractAddress,
+} from '../../test/utils.js'
+import { blockExplorer } from './blockExplorer.js'
+
+const server = setupServer(...handlers)
+
+beforeAll(() => server.listen())
+afterEach(() => server.resetHandlers())
+afterAll(() => server.close())
+
+test('fetches ABI', async () => {
+ await expect(
+ blockExplorer({
+ apiKey,
+ baseUrl,
+ contracts: [{ name: 'WagmiMintExample', address }],
+ }).contracts!(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fetches ABI with multichain deployment', async () => {
+ await expect(
+ blockExplorer({
+ apiKey,
+ baseUrl,
+ contracts: [
+ { name: 'WagmiMintExample', address: { 1: address, 10: address } },
+ ],
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fails to fetch for unverified contract', async () => {
+ await expect(
+ blockExplorer({
+ apiKey,
+ baseUrl,
+ contracts: [
+ { name: 'WagmiMintExample', address: unverifiedContractAddress },
+ ],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: Contract source code not verified]',
+ )
+})
diff --git a/wagmi-project/packages/cli/src/plugins/blockExplorer.ts b/wagmi-project/packages/cli/src/plugins/blockExplorer.ts
new file mode 100644
index 000000000..2518b6e93
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/blockExplorer.ts
@@ -0,0 +1,107 @@
+import { camelCase } from 'change-case'
+import type { Address } from 'viem'
+import { z } from 'zod'
+
+import type { ContractConfig } from '../config.js'
+import { fromZodError } from '../errors.js'
+import type { Compute } from '../types.js'
+import { fetch } from './fetch.js'
+
+export type BlockExplorerConfig = {
+ /**
+ * API key for block explorer. Appended to the request URL as query param `&apikey=${apiKey}`.
+ */
+ apiKey?: string | undefined
+ /**
+ * Base URL for block explorer.
+ */
+ baseUrl: string
+ /**
+ * Duration in milliseconds to cache ABIs.
+ *
+ * @default 1_800_000 // 30m in ms
+ */
+ cacheDuration?: number | undefined
+ /**
+ * Chain ID for block explorer. Appended to the request URL as query param `&chainId=${chainId}`.
+ */
+ chainId?: number | undefined
+ /**
+ * Contracts to fetch ABIs for.
+ */
+ contracts: Compute>[]
+ /**
+ * Function to get address from contract config.
+ */
+ getAddress?:
+ | ((config: {
+ address: NonNullable
+ }) => Address)
+ | undefined
+ /**
+ * Name of source.
+ */
+ name?: ContractConfig['name'] | undefined
+}
+
+const BlockExplorerResponse = z.discriminatedUnion('status', [
+ z.object({
+ status: z.literal('1'),
+ message: z.literal('OK'),
+ result: z
+ .string()
+ .transform((val) => JSON.parse(val) as ContractConfig['abi']),
+ }),
+ z.object({
+ status: z.literal('0'),
+ message: z.literal('NOTOK'),
+ result: z.string(),
+ }),
+])
+
+/**
+ * Fetches contract ABIs from block explorers, supporting `?module=contract&action=getabi` requests.
+ */
+export function blockExplorer(config: BlockExplorerConfig) {
+ const {
+ apiKey,
+ baseUrl,
+ cacheDuration,
+ chainId,
+ contracts,
+ getAddress = ({ address }) => {
+ if (typeof address === 'string') return address
+ return Object.values(address)[0]!
+ },
+ name = 'Block Explorer',
+ } = config
+
+ return fetch({
+ cacheDuration,
+ contracts,
+ name,
+ getCacheKey({ contract }) {
+ if (typeof contract.address === 'string')
+ return `${camelCase(name)}:${contract.address}`
+ return `${camelCase(name)}:${JSON.stringify(contract.address)}`
+ },
+ async parse({ response }) {
+ const json = await response.json()
+ const parsed = await BlockExplorerResponse.safeParseAsync(json)
+ if (!parsed.success)
+ throw fromZodError(parsed.error, { prefix: 'Invalid response' })
+ if (parsed.data.status === '0') throw new Error(parsed.data.result)
+ return parsed.data.result
+ },
+ request({ address }) {
+ if (!address) throw new Error('address is required')
+ return {
+ url: `${baseUrl}?${chainId ? `chainId=${chainId}&` : ''}module=contract&action=getabi&address=${getAddress(
+ {
+ address,
+ },
+ )}${apiKey ? `&apikey=${apiKey}` : ''}`,
+ }
+ },
+ })
+}
diff --git a/wagmi-project/packages/cli/src/plugins/etherscan.test.ts b/wagmi-project/packages/cli/src/plugins/etherscan.test.ts
new file mode 100644
index 000000000..dc496f463
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/etherscan.test.ts
@@ -0,0 +1,112 @@
+import { mkdir, rm } from 'node:fs/promises'
+import { setupServer } from 'msw/node'
+import { afterAll, afterEach, beforeAll, expect, test } from 'vitest'
+
+import {
+ address,
+ apiKey,
+ handlers,
+ invalidApiKey,
+ proxyAddress,
+ timeoutAddress,
+ unverifiedContractAddress,
+} from '../../test/utils.js'
+import { etherscan } from './etherscan.js'
+import { getCacheDir } from './fetch.js'
+
+const server = setupServer(...handlers)
+
+beforeAll(() => server.listen())
+afterEach(() => server.resetHandlers())
+afterAll(() => server.close())
+
+test('fetches ABI', async () => {
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ contracts: [{ name: 'WagmiMintExample', address }],
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fetches ABI with multichain deployment', async () => {
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ contracts: [
+ { name: 'WagmiMintExample', address: { 1: address, 10: address } },
+ ],
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fails to fetch for unverified contract', async () => {
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ contracts: [
+ { name: 'WagmiMintExample', address: unverifiedContractAddress },
+ ],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: Contract source code not verified]',
+ )
+})
+
+test('missing address for chainId', async () => {
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ // @ts-expect-error `chainId` and `keyof typeof contracts[number].address` mismatch
+ contracts: [{ name: 'WagmiMintExample', address: { 10: address } }],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ `[Error: No address found for chainId "1". Make sure chainId "1" is set as an address.]`,
+ )
+})
+
+test('invalid api key', async () => {
+ await expect(
+ etherscan({
+ apiKey: invalidApiKey,
+ chainId: 1,
+ contracts: [{ name: 'WagmiMintExample', address: timeoutAddress }],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot('[Error: Invalid API Key]')
+})
+
+test('tryFetchProxyImplementation: fetches ABI', async () => {
+ const cacheDir = getCacheDir()
+ await mkdir(cacheDir, { recursive: true })
+
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ contracts: [{ name: 'WagmiMintExample', address }],
+ tryFetchProxyImplementation: true,
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+
+ await rm(cacheDir, { recursive: true })
+})
+
+test('tryFetchProxyImplementation: fetches implementation ABI', async () => {
+ const cacheDir = getCacheDir()
+ await mkdir(cacheDir, { recursive: true })
+
+ await expect(
+ etherscan({
+ apiKey,
+ chainId: 1,
+ contracts: [{ name: 'FiatToken', address: proxyAddress }],
+ tryFetchProxyImplementation: true,
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+
+ await rm(cacheDir, { recursive: true })
+})
diff --git a/wagmi-project/packages/cli/src/plugins/etherscan.ts b/wagmi-project/packages/cli/src/plugins/etherscan.ts
new file mode 100644
index 000000000..fda375c24
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/etherscan.ts
@@ -0,0 +1,268 @@
+import { mkdir, writeFile } from 'node:fs/promises'
+import { Address as AddressSchema } from 'abitype/zod'
+import { camelCase } from 'change-case'
+import { join } from 'pathe'
+import type { Abi, Address } from 'viem'
+import { z } from 'zod'
+
+import type { ContractConfig } from '../config.js'
+import { fromZodError } from '../errors.js'
+import type { Compute } from '../types.js'
+import { fetch, getCacheDir } from './fetch.js'
+
+export type EtherscanConfig = {
+ /**
+ * Etherscan API key.
+ *
+ * Create or manage keys at https://etherscan.io/myapikey
+ */
+ apiKey: string
+ /**
+ * Duration in milliseconds to cache ABIs.
+ *
+ * @default 1_800_000 // 30m in ms
+ */
+ cacheDuration?: number | undefined
+ /**
+ * Chain ID to use for fetching ABI.
+ *
+ * If `address` is an object, `chainId` is used to select the address.
+ *
+ * View supported chains on the [Etherscan docs](https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains).
+ */
+ chainId: (chainId extends ChainId ? chainId : never) | (ChainId & {})
+ /**
+ * Contracts to fetch ABIs for.
+ */
+ contracts: Compute, 'abi'>>[]
+ /**
+ * Whether to try fetching proxy implementation address of the contract
+ *
+ * @default false
+ */
+ tryFetchProxyImplementation?: boolean | undefined
+}
+
+/**
+ * Fetches contract ABIs from Etherscan.
+ */
+export function etherscan(
+ config: EtherscanConfig,
+) {
+ const {
+ apiKey,
+ cacheDuration = 1_800_000,
+ chainId,
+ tryFetchProxyImplementation = false,
+ } = config
+
+ const contracts = config.contracts.map((x) => ({
+ ...x,
+ address:
+ typeof x.address === 'string' ? { [chainId]: x.address } : x.address,
+ })) as Omit[]
+
+ const name = 'Etherscan'
+
+ const getCacheKey: Parameters[0]['getCacheKey'] = ({
+ contract,
+ }) => {
+ if (typeof contract.address === 'string')
+ return `${camelCase(name)}:${contract.address}`
+ return `${camelCase(name)}:${JSON.stringify(contract.address)}`
+ }
+
+ return fetch({
+ cacheDuration,
+ contracts,
+ name,
+ getCacheKey,
+ async parse({ response }) {
+ const json = await response.json()
+ const parsed = await GetAbiResponse.safeParseAsync(json)
+ if (!parsed.success)
+ throw fromZodError(parsed.error, { prefix: 'Invalid response' })
+ if (parsed.data.status === '0') throw new Error(parsed.data.result)
+ return parsed.data.result
+ },
+ async request(contract) {
+ if (!contract.address) throw new Error('address is required')
+
+ const resolvedAddress = (() => {
+ if (!contract.address) throw new Error('address is required')
+ if (typeof contract.address === 'string') return contract.address
+ const contractAddress = contract.address[chainId]
+ if (!contractAddress)
+ throw new Error(
+ `No address found for chainId "${chainId}". Make sure chainId "${chainId}" is set as an address.`,
+ )
+ return contractAddress
+ })()
+
+ const options = {
+ address: resolvedAddress,
+ apiKey,
+ chainId,
+ }
+
+ let abi: Abi | undefined
+ const implementationAddress = await (async () => {
+ if (!tryFetchProxyImplementation) return
+ const json = await globalThis
+ .fetch(buildUrl({ ...options, action: 'getsourcecode' }))
+ .then((res) => res.json())
+ const parsed = await GetSourceCodeResponse.safeParseAsync(json)
+ if (!parsed.success)
+ throw fromZodError(parsed.error, { prefix: 'Invalid response' })
+ if (parsed.data.status === '0') throw new Error(parsed.data.result)
+ if (!parsed.data.result[0]) return
+ abi = parsed.data.result[0].ABI
+ return parsed.data.result[0].Implementation as Address
+ })()
+
+ if (abi) {
+ const cacheDir = getCacheDir()
+ await mkdir(cacheDir, { recursive: true })
+ const cacheKey = getCacheKey({ contract })
+ const cacheFilePath = join(cacheDir, `${cacheKey}.json`)
+ await writeFile(
+ cacheFilePath,
+ `${JSON.stringify({ abi, timestamp: Date.now() + cacheDuration }, undefined, 2)}\n`,
+ )
+ }
+
+ return {
+ url: buildUrl({
+ ...options,
+ action: 'getabi',
+ address: implementationAddress || resolvedAddress,
+ }),
+ }
+ },
+ })
+}
+
+function buildUrl(options: {
+ action: 'getabi' | 'getsourcecode'
+ address: Address
+ apiKey: string
+ chainId: ChainId | undefined
+}) {
+ const baseUrl = 'https://api.etherscan.io/v2/api'
+ const { action, address, apiKey, chainId } = options
+ return `${baseUrl}?${chainId ? `chainId=${chainId}&` : ''}module=contract&action=${action}&address=${address}${apiKey ? `&apikey=${apiKey}` : ''}`
+}
+
+const GetAbiResponse = z.discriminatedUnion('status', [
+ z.object({
+ status: z.literal('1'),
+ message: z.literal('OK'),
+ result: z.string().transform((val) => JSON.parse(val) as Abi),
+ }),
+ z.object({
+ status: z.literal('0'),
+ message: z.literal('NOTOK'),
+ result: z.string(),
+ }),
+])
+
+const GetSourceCodeResponse = z.discriminatedUnion('status', [
+ z.object({
+ status: z.literal('1'),
+ message: z.literal('OK'),
+ result: z.array(
+ z.discriminatedUnion('Proxy', [
+ z.object({
+ ABI: z.string().transform((val) => JSON.parse(val) as Abi),
+ Implementation: AddressSchema,
+ Proxy: z.literal('1'),
+ }),
+ z.object({
+ ABI: z.string().transform((val) => JSON.parse(val) as Abi),
+ Implementation: z.string(),
+ Proxy: z.literal('0'),
+ }),
+ ]),
+ ),
+ }),
+ z.object({
+ status: z.literal('0'),
+ message: z.literal('NOTOK'),
+ result: z.string(),
+ }),
+])
+
+// Supported chains
+// https://docs.etherscan.io/etherscan-v2/getting-started/supported-chains
+type ChainId =
+ | 1 // Ethereum Mainnet
+ | 11155111 // Sepolia Testnet
+ | 17000 // Holesky Testnet
+ | 560048 // Hoodi Testnet
+ | 56 // BNB Smart Chain Mainnet
+ | 97 // BNB Smart Chain Testnet
+ | 137 // Polygon Mainnet
+ | 80002 // Polygon Amoy Testnet
+ | 1101 // Polygon zkEVM Mainnet
+ | 2442 // Polygon zkEVM Cardona Testnet
+ | 8453 // Base Mainnet
+ | 84532 // Base Sepolia Testnet
+ | 42161 // Arbitrum One Mainnet
+ | 42170 // Arbitrum Nova Mainnet
+ | 421614 // Arbitrum Sepolia Testnet
+ | 59144 // Linea Mainnet
+ | 59141 // Linea Sepolia Testnet
+ | 250 // Fantom Opera Mainnet
+ | 4002 // Fantom Testnet
+ | 81457 // Blast Mainnet
+ | 168587773 // Blast Sepolia Testnet
+ | 10 // OP Mainnet
+ | 11155420 // OP Sepolia Testnet
+ | 43114 // Avalanche C-Chain
+ | 43113 // Avalanche Fuji Testnet
+ | 199 // BitTorrent Chain Mainnet
+ | 1028 // BitTorrent Chain Testnet
+ | 42220 // Celo Mainnet
+ | 44787 // Celo Alfajores Testnet
+ | 25 // Cronos Mainnet
+ | 252 // Fraxtal Mainnet
+ | 2522 // Fraxtal Testnet
+ | 100 // Gnosis
+ | 255 // Kroma Mainnet
+ | 2358 // Kroma Sepolia Testnet
+ | 5000 // Mantle Mainnet
+ | 5003 // Mantle Sepolia Testnet
+ | 1284 // Moonbeam Mainnet
+ | 1285 // Moonriver Mainnet
+ | 1287 // Moonbase Alpha Testnet
+ | 204 // opBNB Mainnet
+ | 5611 // opBNB Testnet
+ | 534352 // Scroll Mainnet
+ | 534351 // Scroll Sepolia Testnet
+ | 167000 // Taiko Mainnet
+ | 167009 // Taiko Hekla L2 Testnet
+ | 1111 // WEMIX3.0 Mainnet
+ | 1112 // WEMIX3.0 Testnet
+ | 324 // zkSync Mainnet
+ | 300 // zkSync Sepolia Testnet
+ | 660279 // Xai Mainnet
+ | 37714555429 // Xai Sepolia Testnet
+ | 50 // XDC Mainnet
+ | 51 // XDC Apothem Testnet
+ | 33139 // ApeChain Mainnet
+ | 33111 // ApeChain Curtis Testnet
+ | 480 // World Mainnet
+ | 4801 // World Sepolia Testnet
+ | 50104 // Sophon Mainnet
+ | 531050104 // Sophon Sepolia Testnet
+ | 146 // Sonic Mainnet
+ | 57054 // Sonic Blaze Testnet
+ | 130 // Unichain Mainnet
+ | 1301 // Unichain Sepolia Testnet
+ | 2741 // Abstract Mainnet
+ | 11124 // Abstract Sepolia Testnet
+ | 80094 // Berachain Mainnet
+ | 80069 // Berachain Bepolia Testnet
+ | 1923 // Swellchain Mainnet
+ | 1924 // Swellchain Testnet
+ | 10143 // Monad Testnet
diff --git a/wagmi-project/packages/cli/src/plugins/fetch.test.ts b/wagmi-project/packages/cli/src/plugins/fetch.test.ts
new file mode 100644
index 000000000..600cbfeda
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/fetch.test.ts
@@ -0,0 +1,186 @@
+import { mkdir, rm, writeFile } from 'node:fs/promises'
+import { homedir } from 'node:os'
+import { setupServer } from 'msw/node'
+import { afterAll, afterEach, beforeAll, expect, test } from 'vitest'
+
+import {
+ address,
+ apiKey,
+ baseUrl,
+ handlers,
+ timeoutAddress,
+ unverifiedContractAddress,
+} from '../../test/utils.js'
+import { fetch, getCacheDir } from './fetch.js'
+
+const server = setupServer(...handlers)
+
+beforeAll(() => server.listen())
+afterEach(() => server.resetHandlers())
+afterAll(() => server.close())
+
+type Fetch = Parameters[0]
+const request: Fetch['request'] = ({ address }) => {
+ return {
+ url: `${baseUrl}?module=contract&action=getabi&address=${address}&apikey=${apiKey}`,
+ }
+}
+const parse: Fetch['parse'] = async ({ response }) => {
+ const data = (await response.json()) as
+ | { status: '1'; message: 'OK'; result: string }
+ | { status: '0'; message: 'NOTOK'; result: string }
+ if (data.status === '0') throw new Error(data.result)
+ return JSON.parse(data.result)
+}
+
+test('fetches ABI', async () => {
+ await expect(
+ fetch({
+ contracts: [{ name: 'WagmiMintExample', address }],
+ request,
+ parse,
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fails to fetch for unverified contract', async () => {
+ await expect(
+ fetch({
+ contracts: [
+ { name: 'WagmiMintExample', address: unverifiedContractAddress },
+ ],
+ request,
+ parse,
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: Contract source code not verified]',
+ )
+})
+
+test('aborts request', async () => {
+ await expect(
+ fetch({
+ contracts: [{ name: 'WagmiMintExample', address: timeoutAddress }],
+ request,
+ parse,
+ timeoutDuration: 1_000,
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[AbortError: This operation was aborted]',
+ )
+})
+
+test('reads from cache', async () => {
+ const cacheDir = `${homedir}/.wagmi-cli/plugins/fetch/cache`
+ await mkdir(cacheDir, { recursive: true })
+
+ const contract = {
+ name: 'WagmiMintExample',
+ address: timeoutAddress,
+ } as const
+ const cacheKey = JSON.stringify(contract)
+ const cacheFilePath = `${cacheDir}/${cacheKey}.json`
+ await writeFile(
+ cacheFilePath,
+ JSON.stringify(
+ {
+ abi: [
+ {
+ inputs: [],
+ name: 'mint',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ ],
+ timestamp: Date.now() + 30_000,
+ },
+ null,
+ 2,
+ ),
+ )
+
+ await expect(
+ fetch({
+ contracts: [contract],
+ request,
+ parse,
+ }).contracts?.(),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ "name": "WagmiMintExample",
+ },
+ ]
+ `)
+
+ await rm(cacheDir, { recursive: true })
+})
+
+test('fails and reads from cache', async () => {
+ const cacheDir = getCacheDir()
+ await mkdir(cacheDir, { recursive: true })
+
+ const contract = {
+ name: 'WagmiMintExample',
+ address: timeoutAddress,
+ } as const
+ const cacheKey = JSON.stringify(contract)
+ const cacheFilePath = `${cacheDir}/${cacheKey}.json`
+ await writeFile(
+ cacheFilePath,
+ JSON.stringify(
+ {
+ abi: [
+ {
+ inputs: [],
+ name: 'mint',
+ outputs: [],
+ stateMutability: 'nonpayable',
+ type: 'function',
+ },
+ ],
+ timestamp: Date.now() - 30_000,
+ },
+ null,
+ 2,
+ ),
+ )
+
+ await expect(
+ fetch({
+ contracts: [contract],
+ request,
+ parse,
+ timeoutDuration: 1,
+ }).contracts?.(),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ "name": "WagmiMintExample",
+ },
+ ]
+ `)
+
+ await rm(cacheDir, { recursive: true })
+})
diff --git a/wagmi-project/packages/cli/src/plugins/fetch.ts b/wagmi-project/packages/cli/src/plugins/fetch.ts
new file mode 100644
index 000000000..778d4a816
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/fetch.ts
@@ -0,0 +1,127 @@
+import { mkdir, readFile, writeFile } from 'node:fs/promises'
+import { homedir } from 'node:os'
+import { join } from 'pathe'
+
+import type { Abi } from 'viem'
+import type { ContractConfig, Plugin } from '../config.js'
+import type { Compute, RequiredBy } from '../types.js'
+
+export type FetchConfig = {
+ /**
+ * Duration in milliseconds to cache ABIs from request.
+ *
+ * @default 1_800_000 // 30m in ms
+ */
+ cacheDuration?: number | undefined
+ /**
+ * Contracts to fetch ABIs for.
+ */
+ contracts: Compute>[]
+ /**
+ * Function for creating a cache key for contract.
+ */
+ getCacheKey?:
+ | ((config: { contract: Compute> }) => string)
+ | undefined
+ /**
+ * Name of source.
+ */
+ name?: ContractConfig['name'] | undefined
+ /**
+ * Function for parsing ABI from fetch response.
+ *
+ * @default ({ response }) => response.json()
+ */
+ parse?:
+ | ((config: {
+ response: Response
+ }) => ContractConfig['abi'] | Promise)
+ | undefined
+ /**
+ * Function for returning a request to fetch ABI from.
+ */
+ request: (config: {
+ address?: ContractConfig['address'] | undefined
+ name: ContractConfig['name']
+ }) =>
+ | { url: RequestInfo; init?: RequestInit | undefined }
+ | Promise<{ url: RequestInfo; init?: RequestInit | undefined }>
+ /**
+ * Duration in milliseconds before request times out.
+ *
+ * @default 5_000 // 5s in ms
+ */
+ timeoutDuration?: number | undefined
+}
+
+type FetchResult = Compute>
+
+/** Fetches and parses contract ABIs from network resource with `fetch`. */
+export function fetch(config: FetchConfig): FetchResult {
+ const {
+ cacheDuration = 1_800_000,
+ contracts: contractConfigs,
+ getCacheKey = ({ contract }) => JSON.stringify(contract),
+ name = 'Fetch',
+ parse = ({ response }) => response.json(),
+ request,
+ timeoutDuration = 5_000,
+ } = config
+
+ return {
+ async contracts() {
+ const cacheDir = getCacheDir()
+ await mkdir(cacheDir, { recursive: true })
+
+ const timestamp = Date.now() + cacheDuration
+ const contracts = []
+ for (const contract of contractConfigs) {
+ const cacheKey = getCacheKey({ contract })
+ const cacheFilePath = join(cacheDir, `${cacheKey}.json`)
+ const cachedFile = JSON.parse(
+ await readFile(cacheFilePath, 'utf8').catch(() => 'null'),
+ )
+
+ let abi: Abi | undefined
+ if (cachedFile?.timestamp > Date.now()) abi = cachedFile.abi
+ else {
+ try {
+ const controller = new globalThis.AbortController()
+ const timeout = setTimeout(
+ () => controller.abort(),
+ timeoutDuration,
+ )
+
+ const { url, init } = await request(contract)
+ const response = await globalThis.fetch(url, {
+ ...init,
+ signal: controller.signal,
+ })
+ clearTimeout(timeout)
+
+ abi = await parse({ response })
+ await writeFile(
+ cacheFilePath,
+ `${JSON.stringify({ abi, timestamp }, undefined, 2)}\n`,
+ )
+ } catch (error) {
+ try {
+ // Attempt to read from cache if fetch fails.
+ abi = JSON.parse(await readFile(cacheFilePath, 'utf8')).abi
+ } catch {}
+ if (!abi) throw error
+ }
+ }
+
+ if (!abi) throw Error('Failed to fetch ABI for contract.')
+ contracts.push({ abi, address: contract.address, name: contract.name })
+ }
+ return contracts
+ },
+ name,
+ }
+}
+
+export function getCacheDir() {
+ return join(homedir(), '.wagmi-cli/plugins/fetch/cache')
+}
diff --git a/wagmi-project/packages/cli/src/plugins/foundry.test.ts b/wagmi-project/packages/cli/src/plugins/foundry.test.ts
new file mode 100644
index 000000000..75e5ec73e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/foundry.test.ts
@@ -0,0 +1,153 @@
+import fixtures from 'fixturez'
+import { dirname, resolve } from 'pathe'
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { foundry } from './foundry.js'
+
+const f = fixtures(__dirname)
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('forge not installed', async () => {
+ const dir = f.temp()
+ expect(
+ foundry({
+ project: dir,
+ forge: {
+ path: '/path/to/forge',
+ },
+ }).validate?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [Error: forge must be installed to use Foundry plugin.
+ To install, follow the instructions at https://book.getfoundry.sh/getting-started/installation]
+ `)
+})
+
+test('project does not exist', async () => {
+ const dir = f.temp()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ try {
+ await foundry({ project: '../path/to/project' }).validate?.()
+ } catch (error) {
+ expect(
+ (error as Error).message.replace(dirname(dir), '..'),
+ ).toMatchInlineSnapshot('"Foundry project ../path/to/project not found."')
+ }
+})
+
+test('validates without project', async () => {
+ const dir = resolve(__dirname, '__fixtures__/foundry/')
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(foundry().validate?.()).resolves.toBeUndefined()
+})
+
+test('contracts', async () => {
+ await expect(
+ foundry({
+ project: resolve(__dirname, '__fixtures__/foundry/'),
+ exclude: ['Foo.sol/**'],
+ }).contracts?.(),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "increment",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "number",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newNumber",
+ "type": "uint256",
+ },
+ ],
+ "name": "setNumber",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": undefined,
+ "name": "Counter",
+ },
+ ]
+ `)
+})
+
+test('contracts without project', async () => {
+ const dir = resolve(__dirname, '__fixtures__/foundry/')
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(
+ foundry({
+ exclude: ['Foo.sol/**'],
+ }).contracts?.(),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "increment",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "number",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newNumber",
+ "type": "uint256",
+ },
+ ],
+ "name": "setNumber",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": undefined,
+ "name": "Counter",
+ },
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/plugins/foundry.ts b/wagmi-project/packages/cli/src/plugins/foundry.ts
new file mode 100644
index 000000000..dab307a58
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/foundry.ts
@@ -0,0 +1,263 @@
+import { execSync, spawn, spawnSync } from 'node:child_process'
+import { existsSync } from 'node:fs'
+import { readFile } from 'node:fs/promises'
+import dedent from 'dedent'
+import { fdir } from 'fdir'
+import { basename, extname, join, resolve } from 'pathe'
+import pc from 'picocolors'
+import { z } from 'zod'
+
+import type { ContractConfig, Plugin } from '../config.js'
+import * as logger from '../logger.js'
+import type { Compute, RequiredBy } from '../types.js'
+
+export const foundryDefaultExcludes = [
+ 'Base.sol/**',
+ 'Common.sol/**',
+ 'Components.sol/**',
+ 'IERC165.sol/**',
+ 'IERC20.sol/**',
+ 'IERC721.sol/**',
+ 'IMulticall2.sol/**',
+ 'MockERC20.sol/**',
+ 'MockERC721.sol/**',
+ 'Script.sol/**',
+ 'StdAssertions.sol/**',
+ 'StdChains.sol/**',
+ 'StdCheats.sol/**',
+ 'StdError.sol/**',
+ 'StdInvariant.sol/**',
+ 'StdJson.sol/**',
+ 'StdMath.sol/**',
+ 'StdStorage.sol/**',
+ 'StdStyle.sol/**',
+ 'StdToml.sol/**',
+ 'StdUtils.sol/**',
+ 'Test.sol/**',
+ 'Vm.sol/**',
+ 'build-info/**',
+ 'console.sol/**',
+ 'console2.sol/**',
+ 'safeconsole.sol/**',
+ '**.s.sol/*.json',
+ '**.t.sol/*.json',
+]
+
+export type FoundryConfig = {
+ /**
+ * Project's artifacts directory.
+ *
+ * Same as your project's `--out` (`-o`) option.
+ *
+ * @default foundry.config#out | 'out'
+ */
+ artifacts?: string | undefined
+ /** Mapping of addresses to attach to artifacts. */
+ deployments?: { [key: string]: ContractConfig['address'] } | undefined
+ /** Artifact files to exclude. */
+ exclude?: string[] | undefined
+ /** [Forge](https://book.getfoundry.sh/forge) configuration */
+ forge?:
+ | {
+ /**
+ * Remove build artifacts and cache directories on start up.
+ *
+ * @default false
+ */
+ clean?: boolean | undefined
+ /**
+ * Build Foundry project before fetching artifacts.
+ *
+ * @default true
+ */
+ build?: boolean | undefined
+ /**
+ * Path to `forge` executable command
+ *
+ * @default "forge"
+ */
+ path?: string | undefined
+ /**
+ * Rebuild every time a watched file or directory is changed.
+ *
+ * @default true
+ */
+ rebuild?: boolean | undefined
+ }
+ | undefined
+ /** Artifact files to include. */
+ include?: string[] | undefined
+ /** Optional prefix to prepend to artifact names. */
+ namePrefix?: string | undefined
+ /** Path to foundry project. */
+ project?: string | undefined
+}
+
+type FoundryResult = Compute<
+ RequiredBy
+>
+
+const FoundryConfigSchema = z.object({
+ out: z.string().default('out'),
+ src: z.string().default('src'),
+})
+
+/** Resolves ABIs from [Foundry](https://github.com/foundry-rs/foundry) project. */
+export function foundry(config: FoundryConfig = {}): FoundryResult {
+ const {
+ artifacts,
+ deployments = {},
+ exclude = foundryDefaultExcludes,
+ forge: {
+ clean = false,
+ build = true,
+ path: forgeExecutable = 'forge',
+ rebuild = true,
+ } = {},
+ include = ['*.json'],
+ namePrefix = '',
+ } = config
+
+ function getContractName(artifactPath: string, usePrefix = true) {
+ const filename = basename(artifactPath)
+ const extension = extname(artifactPath)
+ return `${usePrefix ? namePrefix : ''}${filename.replace(extension, '')}`
+ }
+
+ async function getContract(artifactPath: string) {
+ const artifact = await JSON.parse(await readFile(artifactPath, 'utf8'))
+ return {
+ abi: artifact.abi,
+ address: (deployments as Record)[
+ getContractName(artifactPath, false)
+ ],
+ name: getContractName(artifactPath),
+ }
+ }
+
+ function getArtifactPaths(artifactsDirectory: string) {
+ const crawler = new fdir().withBasePath().globWithOptions(
+ include.map((x) => `${artifactsDirectory}/**/${x}`),
+ {
+ dot: true,
+ ignore: exclude.map((x) => `${artifactsDirectory}/**/${x}`),
+ },
+ )
+ return crawler.crawl(artifactsDirectory).withPromise()
+ }
+
+ const project = resolve(process.cwd(), config.project ?? '')
+
+ let foundryConfig: z.infer = {
+ out: 'out',
+ src: 'src',
+ }
+ try {
+ const result = spawnSync(
+ forgeExecutable,
+ ['config', '--json', '--root', project],
+ {
+ encoding: 'utf-8',
+ shell: true,
+ },
+ )
+ if (result.error) throw result.error
+ if (result.status !== 0)
+ throw new Error(`Failed with code ${result.status}`)
+ if (result.signal) throw new Error('Process terminated by signal')
+ foundryConfig = FoundryConfigSchema.parse(JSON.parse(result.stdout))
+ } catch {
+ } finally {
+ foundryConfig = {
+ ...foundryConfig,
+ out: artifacts ?? foundryConfig.out,
+ }
+ }
+
+ const artifactsDirectory = join(project, foundryConfig.out)
+
+ return {
+ async contracts() {
+ if (clean)
+ execSync(`${forgeExecutable} clean --root ${project}`, {
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ if (build)
+ execSync(`${forgeExecutable} build --root ${project}`, {
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ if (!existsSync(artifactsDirectory))
+ throw new Error('Artifacts not found.')
+
+ const artifactPaths = await getArtifactPaths(artifactsDirectory)
+ const contracts = []
+ for (const artifactPath of artifactPaths) {
+ const contract = await getContract(artifactPath)
+ if (!contract.abi?.length) continue
+ contracts.push(contract)
+ }
+ return contracts
+ },
+ name: 'Foundry',
+ async validate() {
+ // Check that project directory exists
+ if (!existsSync(project))
+ throw new Error(`Foundry project ${pc.gray(config.project)} not found.`)
+
+ // Ensure forge is installed
+ if (clean || build || rebuild)
+ try {
+ execSync(`${forgeExecutable} --version`, {
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ } catch (_error) {
+ throw new Error(dedent`
+ forge must be installed to use Foundry plugin.
+ To install, follow the instructions at https://book.getfoundry.sh/getting-started/installation
+ `)
+ }
+ },
+ watch: {
+ command: rebuild
+ ? async () => {
+ logger.log(
+ `${pc.magenta('Foundry')} Watching project at ${pc.gray(
+ project,
+ )}`,
+ )
+ const subprocess = spawn(forgeExecutable, [
+ 'build',
+ '--watch',
+ '--root',
+ project,
+ ])
+ subprocess.stdout?.on('data', (data) => {
+ process.stdout.write(`${pc.magenta('Foundry')} ${data}`)
+ })
+
+ process.once('SIGINT', shutdown)
+ process.once('SIGTERM', shutdown)
+ function shutdown() {
+ subprocess?.kill()
+ }
+ }
+ : undefined,
+ paths: [
+ ...include.map((x) => `${artifactsDirectory}/**/${x}`),
+ ...exclude.map((x) => `!${artifactsDirectory}/**/${x}`),
+ ],
+ async onAdd(path) {
+ return getContract(path)
+ },
+ async onChange(path) {
+ return getContract(path)
+ },
+ async onRemove(path) {
+ return getContractName(path)
+ },
+ },
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/hardhat.test.ts b/wagmi-project/packages/cli/src/plugins/hardhat.test.ts
new file mode 100644
index 000000000..efb416c5e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/hardhat.test.ts
@@ -0,0 +1,85 @@
+import fixtures from 'fixturez'
+import { dirname, resolve } from 'pathe'
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { hardhat } from './hardhat.js'
+
+const f = fixtures(__dirname)
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('validate', async () => {
+ const temp = f.temp()
+ expect(
+ hardhat({ project: temp }).validate?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: hardhat must be installed to use Hardhat plugin.]',
+ )
+})
+
+test('project does not exist', async () => {
+ const dir = f.temp()
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ try {
+ await hardhat({ project: '../path/to/project' }).validate?.()
+ } catch (error) {
+ expect(
+ (error as Error).message.replace(dirname(dir), '..'),
+ ).toMatchInlineSnapshot('"Hardhat project ../path/to/project not found."')
+ }
+})
+
+test('contracts', async () => {
+ expect(
+ hardhat({
+ project: resolve(__dirname, '__fixtures__/hardhat/'),
+ exclude: ['Foo.sol/**'],
+ }).contracts?.(),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "increment",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ {
+ "inputs": [],
+ "name": "number",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256",
+ },
+ ],
+ "stateMutability": "view",
+ "type": "function",
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "newNumber",
+ "type": "uint256",
+ },
+ ],
+ "name": "setNumber",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "address": undefined,
+ "name": "Counter",
+ },
+ ]
+ `)
+}, 10_000)
diff --git a/wagmi-project/packages/cli/src/plugins/hardhat.ts b/wagmi-project/packages/cli/src/plugins/hardhat.ts
new file mode 100644
index 000000000..a4feb6efd
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/hardhat.ts
@@ -0,0 +1,235 @@
+import { execSync, spawn } from 'node:child_process'
+import { existsSync } from 'node:fs'
+import { readFile } from 'node:fs/promises'
+import { fdir } from 'fdir'
+import { basename, extname, join, resolve } from 'pathe'
+import pc from 'picocolors'
+
+import type { ContractConfig, Plugin } from '../config.js'
+import * as logger from '../logger.js'
+import type { Compute, RequiredBy } from '../types.js'
+import { getIsPackageInstalled, getPackageManager } from '../utils/packages.js'
+
+export const hardhatDefaultExcludes = ['build-info/**', '*.dbg.json']
+
+export type HardhatConfig = {
+ /**
+ * Project's artifacts directory.
+ *
+ * Same as your project's `artifacts` [path configuration](https://hardhat.org/hardhat-runner/docs/config#path-configuration) option.
+ *
+ * @default 'artifacts/'
+ */
+ artifacts?: string | undefined
+ /** Mapping of addresses to attach to artifacts. */
+ deployments?: { [key: string]: ContractConfig['address'] } | undefined
+ /** Artifact files to exclude. */
+ exclude?: string[] | undefined
+ /** Commands to run */
+ commands?:
+ | {
+ /**
+ * Remove build artifacts and cache directories on start up.
+ *
+ * @default `${packageManger} hardhat clean`
+ */
+ clean?: string | boolean | undefined
+ /**
+ * Build Hardhat project before fetching artifacts.
+ *
+ * @default `${packageManger} hardhat compile`
+ */
+ build?: string | boolean | undefined
+ /**
+ * Command to run when watched file or directory is changed.
+ *
+ * @default `${packageManger} hardhat compile`
+ */
+ rebuild?: string | boolean | undefined
+ }
+ | undefined
+ /** Artifact files to include. */
+ include?: string[] | undefined
+ /** Optional prefix to prepend to artifact names. */
+ namePrefix?: string | undefined
+ /** Path to Hardhat project. */
+ project: string
+ /**
+ * Project's artifacts directory.
+ *
+ * Same as your project's `sources` [path configuration](https://hardhat.org/hardhat-runner/docs/config#path-configuration) option.
+ *
+ * @default 'contracts/'
+ */
+ sources?: string | undefined
+}
+
+type HardhatResult = Compute<
+ RequiredBy
+>
+
+/** Resolves ABIs from [Hardhat](https://github.com/NomicFoundation/hardhat) project. */
+export function hardhat(config: HardhatConfig): HardhatResult {
+ const {
+ artifacts = 'artifacts',
+ deployments = {},
+ exclude = hardhatDefaultExcludes,
+ commands = {},
+ include = ['*.json'],
+ namePrefix = '',
+ sources = 'contracts',
+ } = config
+
+ function getContractName(artifact: { contractName: string }) {
+ return `${namePrefix}${artifact.contractName}`
+ }
+
+ async function getContract(artifactPath: string) {
+ const artifact = await JSON.parse(await readFile(artifactPath, 'utf8'))
+ return {
+ abi: artifact.abi,
+ address: deployments[artifact.contractName],
+ name: getContractName(artifact),
+ }
+ }
+
+ function getArtifactPaths(artifactsDirectory: string) {
+ const crawler = new fdir().withBasePath().globWithOptions(
+ include.map((x) => `${artifactsDirectory}/**/${x}`),
+ {
+ dot: true,
+ ignore: exclude.map((x) => `${artifactsDirectory}/**/${x}`),
+ },
+ )
+ return crawler.crawl(artifactsDirectory).withPromise()
+ }
+
+ const project = resolve(process.cwd(), config.project)
+ const artifactsDirectory = join(project, artifacts)
+ const sourcesDirectory = join(project, sources)
+
+ const { build = true, clean = false, rebuild = true } = commands
+ return {
+ async contracts() {
+ if (clean) {
+ const packageManager = await getPackageManager(true)
+ const [command, ...options] = (
+ typeof clean === 'boolean' ? `${packageManager} hardhat clean` : clean
+ ).split(' ')
+ execSync(`${command!} ${options.join(' ')}`, {
+ cwd: project,
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ }
+ if (build) {
+ const packageManager = await getPackageManager(true)
+ const [command, ...options] = (
+ typeof build === 'boolean'
+ ? `${packageManager} hardhat compile`
+ : build
+ ).split(' ')
+ execSync(`${command!} ${options.join(' ')}`, {
+ cwd: project,
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ }
+ if (!existsSync(artifactsDirectory))
+ throw new Error('Artifacts not found.')
+
+ const artifactPaths = await getArtifactPaths(artifactsDirectory)
+ const contracts = []
+ for (const artifactPath of artifactPaths) {
+ const contract = await getContract(artifactPath)
+ if (!contract.abi?.length) continue
+ contracts.push(contract)
+ }
+ return contracts
+ },
+ name: 'Hardhat',
+ async validate() {
+ // Check that project directory exists
+ if (!existsSync(project))
+ throw new Error(`Hardhat project ${pc.gray(project)} not found.`)
+
+ // Check that `hardhat` is installed
+ const packageName = 'hardhat'
+ const isPackageInstalled = await getIsPackageInstalled({
+ packageName,
+ cwd: project,
+ })
+ if (isPackageInstalled) return
+ throw new Error(`${packageName} must be installed to use Hardhat plugin.`)
+ },
+ watch: {
+ command: rebuild
+ ? async () => {
+ logger.log(
+ `${pc.blue('Hardhat')} Watching project at ${pc.gray(project)}`,
+ )
+
+ const [command, ...options] = (
+ typeof rebuild === 'boolean'
+ ? `${await getPackageManager(true)} hardhat compile`
+ : rebuild
+ ).split(' ')
+
+ const { watch } = await import('chokidar')
+ const watcher = watch(sourcesDirectory, {
+ atomic: true,
+ awaitWriteFinish: true,
+ ignoreInitial: true,
+ persistent: true,
+ })
+ watcher.on('all', async (event, path) => {
+ if (event !== 'change' && event !== 'add' && event !== 'unlink')
+ return
+ logger.log(
+ `${pc.blue('Hardhat')} Detected ${event} at ${basename(path)}`,
+ )
+ const subprocess = spawn(command!, options, {
+ cwd: project,
+ })
+ subprocess.stdout?.on('data', (data) => {
+ process.stdout.write(`${pc.blue('Hardhat')} ${data}`)
+ })
+ })
+
+ process.once('SIGINT', shutdown)
+ process.once('SIGTERM', shutdown)
+ async function shutdown() {
+ await watcher.close()
+ }
+ }
+ : undefined,
+ paths: [
+ artifactsDirectory,
+ ...include.map((x) => `${artifactsDirectory}/**/${x}`),
+ ...exclude.map((x) => `!${artifactsDirectory}/**/${x}`),
+ ],
+ async onAdd(path) {
+ return getContract(path)
+ },
+ async onChange(path) {
+ return getContract(path)
+ },
+ async onRemove(path) {
+ const filename = basename(path)
+ const extension = extname(path)
+ // Since we can't use `getContractName`, guess from path
+ const removedContractName = `${namePrefix}${filename.replace(
+ extension,
+ '',
+ )}`
+ const artifactPaths = await getArtifactPaths(artifactsDirectory)
+ for (const artifactPath of artifactPaths) {
+ const contract = await getContract(artifactPath)
+ // If contract with same name exists, don't remove
+ if (contract.name === removedContractName) return
+ }
+ return removedContractName
+ },
+ },
+ }
+}
diff --git a/wagmi-project/packages/cli/src/plugins/react.test.ts b/wagmi-project/packages/cli/src/plugins/react.test.ts
new file mode 100644
index 000000000..939a5299a
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/react.test.ts
@@ -0,0 +1,337 @@
+import { erc20Abi } from 'viem'
+import { expect, test } from 'vitest'
+
+import { react } from './react.js'
+
+test('default', async () => {
+ const result = await react().run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.imports).toMatchInlineSnapshot(`
+ "import { createUseReadContract, createUseWriteContract, createUseSimulateContract, createUseWatchContractEvent } from 'wagmi/codegen'
+ "
+ `)
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useReadErc20 = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const useReadErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const useReadErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const useReadErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const useReadErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'name' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const useReadErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const useReadErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const useWriteErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const useWriteErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const useWriteErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const useSimulateErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const useSimulateErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const useSimulateErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const useWatchErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const useWatchErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, eventName: 'Transfer' })"
+ `)
+})
+
+test('address', async () => {
+ const result = await react().run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ addressName: 'erc20Address',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useReadErc20 = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const useReadErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const useReadErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const useReadErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const useReadErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const useReadErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const useReadErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const useWriteErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const useWriteErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const useWriteErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const useSimulateErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const useSimulateErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const useSimulateErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const useWatchErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const useWatchErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })"
+ `)
+})
+
+test('legacy hook names', async () => {
+ const result = await react({ getHookName: 'legacy' }).run?.({
+ contracts: [
+ {
+ name: 'erc20',
+ abi: erc20Abi,
+ content: '',
+ meta: {
+ abiName: 'erc20Abi',
+ addressName: 'erc20Address',
+ },
+ },
+ ],
+ isTypeScript: true,
+ outputs: [],
+ })
+
+ expect(result?.content).toMatchInlineSnapshot(`
+ "/**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useErc20Read = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"allowance"\`
+ */
+ export const useErc20Allowance = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'allowance' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"balanceOf"\`
+ */
+ export const useErc20BalanceOf = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'balanceOf' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"decimals"\`
+ */
+ export const useErc20Decimals = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'decimals' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"name"\`
+ */
+ export const useErc20Name = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'name' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"symbol"\`
+ */
+ export const useErc20Symbol = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'symbol' })
+
+ /**
+ * Wraps __{@link useReadContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"totalSupply"\`
+ */
+ export const useErc20TotalSupply = /*#__PURE__*/ createUseReadContract({ abi: erc20Abi, address: erc20Address, functionName: 'totalSupply' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useErc20Write = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const useErc20Approve = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const useErc20Transfer = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const useErc20TransferFrom = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const usePrepareErc20Write = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"approve"\`
+ */
+ export const usePrepareErc20Approve = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'approve' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transfer"\`
+ */
+ export const usePrepareErc20Transfer = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transfer' })
+
+ /**
+ * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ and \`functionName\` set to \`"transferFrom"\`
+ */
+ export const usePrepareErc20TransferFrom = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi, address: erc20Address, functionName: 'transferFrom' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__
+ */
+ export const useErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Approval"\`
+ */
+ export const useErc20ApprovalEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Approval' })
+
+ /**
+ * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ and \`eventName\` set to \`"Transfer"\`
+ */
+ export const useErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })"
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/plugins/react.ts b/wagmi-project/packages/cli/src/plugins/react.ts
new file mode 100644
index 000000000..b76ea006a
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/react.ts
@@ -0,0 +1,312 @@
+import { pascalCase } from 'change-case'
+
+import type { Contract, Plugin } from '../config.js'
+import type { Compute, RequiredBy } from '../types.js'
+import { getAddressDocString } from '../utils/getAddressDocString.js'
+
+export type ReactConfig = {
+ getHookName?:
+ | 'legacy' // TODO: Deprecate `'legacy'` option
+ | ((options: {
+ contractName: string
+ itemName?: string | undefined
+ type: 'read' | 'simulate' | 'watch' | 'write'
+ }) => `use${string}`)
+}
+
+type ReactResult = Compute>
+
+export function react(config: ReactConfig = {}): ReactResult {
+ return {
+ name: 'React',
+ async run({ contracts }) {
+ const imports = new Set([])
+ const content: string[] = []
+ const pure = '/*#__PURE__*/'
+
+ const hookNames = new Set()
+ for (const contract of contracts) {
+ let hasReadFunction = false
+ let hasWriteFunction = false
+ let hasEvent = false
+ const readItems = []
+ const writeItems = []
+ const eventItems = []
+ for (const item of contract.abi) {
+ if (item.type === 'function')
+ if (
+ item.stateMutability === 'view' ||
+ item.stateMutability === 'pure'
+ ) {
+ hasReadFunction = true
+ readItems.push(item)
+ } else {
+ hasWriteFunction = true
+ writeItems.push(item)
+ }
+ else if (item.type === 'event') {
+ hasEvent = true
+ eventItems.push(item)
+ }
+ }
+
+ let innerContent: string
+ if (contract.meta.addressName)
+ innerContent = `abi: ${contract.meta.abiName}, address: ${contract.meta.addressName}`
+ else innerContent = `abi: ${contract.meta.abiName}`
+
+ if (hasReadFunction) {
+ const hookName = getHookName(config, hookNames, 'read', contract.name)
+ const docString = genDocString('useReadContract', contract)
+ const functionName = 'createUseReadContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of readItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'pure' &&
+ item.stateMutability !== 'view'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'read',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('useReadContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+
+ if (hasWriteFunction) {
+ {
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'write',
+ contract.name,
+ )
+ const docString = genDocString('useWriteContract', contract)
+ const functionName = 'createUseWriteContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of writeItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'nonpayable' &&
+ item.stateMutability !== 'payable'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'write',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('useWriteContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+
+ {
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'simulate',
+ contract.name,
+ )
+ const docString = genDocString('useSimulateContract', contract)
+ const functionName = 'createUseSimulateContract'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of writeItems) {
+ if (item.type !== 'function') continue
+ if (
+ item.stateMutability !== 'nonpayable' &&
+ item.stateMutability !== 'payable'
+ )
+ continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'simulate',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('useSimulateContract', contract, {
+ name: 'functionName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionName: '${item.name}' })`,
+ )
+ }
+ }
+ }
+
+ if (hasEvent) {
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'watch',
+ contract.name,
+ )
+ const docString = genDocString('useWatchContractEvent', contract)
+ const functionName = 'createUseWatchContractEvent'
+ imports.add(functionName)
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`,
+ )
+
+ const names = new Set()
+ for (const item of eventItems) {
+ if (item.type !== 'event') continue
+
+ // Skip overrides since they are captured by same hook
+ if (names.has(item.name)) continue
+ names.add(item.name)
+
+ const hookName = getHookName(
+ config,
+ hookNames,
+ 'watch',
+ contract.name,
+ item.name,
+ )
+ const docString = genDocString('useWatchContractEvent', contract, {
+ name: 'eventName',
+ value: item.name,
+ })
+ content.push(
+ `${docString}
+export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, eventName: '${item.name}' })`,
+ )
+ }
+ }
+ }
+
+ const importValues = [...imports.values()]
+
+ return {
+ imports: importValues.length
+ ? `import { ${importValues.join(', ')} } from 'wagmi/codegen'\n`
+ : '',
+ content: content.join('\n\n'),
+ }
+ },
+ }
+}
+
+function genDocString(
+ hookName: string,
+ contract: Contract,
+ item?: { name: string; value: string },
+) {
+ let description = `Wraps __{@link ${hookName}}__ with \`abi\` set to __{@link ${contract.meta.abiName}}__`
+ if (item) description += ` and \`${item.name}\` set to \`"${item.value}"\``
+
+ const docString = getAddressDocString({ address: contract.address })
+ if (docString)
+ return `/**
+ * ${description}
+ *
+ ${docString}
+ */`
+
+ return `/**
+ * ${description}
+ */`
+}
+
+function getHookName(
+ config: ReactConfig,
+ hookNames: Set,
+ type: 'read' | 'simulate' | 'watch' | 'write',
+ contractName: string,
+ itemName?: string | undefined,
+) {
+ const ContractName = pascalCase(contractName)
+ const ItemName = itemName ? pascalCase(itemName) : undefined
+
+ let hookName: string
+ if (typeof config.getHookName === 'function')
+ hookName = config.getHookName({
+ type,
+ contractName: ContractName,
+ itemName: ItemName,
+ })
+ else if (typeof config.getHookName === 'string') {
+ switch (type) {
+ case 'read':
+ hookName = `use${ContractName}${ItemName ?? 'Read'}`
+ break
+ case 'simulate':
+ hookName = `usePrepare${ContractName}${ItemName ?? 'Write'}`
+ break
+ case 'watch':
+ hookName = `use${ContractName}${ItemName ?? ''}Event`
+ break
+ case 'write':
+ hookName = `use${ContractName}${ItemName ?? 'Write'}`
+ break
+ }
+ } else {
+ hookName = `use${pascalCase(type)}${ContractName}${ItemName ?? ''}`
+ if (type === 'watch') hookName = `${hookName}Event`
+ }
+
+ if (hookNames.has(hookName))
+ throw new Error(
+ `Hook name "${hookName}" must be unique for contract "${contractName}". Try using \`getHookName\` to create a unique name.`,
+ )
+
+ hookNames.add(hookName)
+ return hookName
+}
diff --git a/wagmi-project/packages/cli/src/plugins/sourcify.test.ts b/wagmi-project/packages/cli/src/plugins/sourcify.test.ts
new file mode 100644
index 000000000..842a29114
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/sourcify.test.ts
@@ -0,0 +1,83 @@
+import { http, HttpResponse } from 'msw'
+import { setupServer } from 'msw/node'
+import { afterAll, afterEach, beforeAll, expect, test } from 'vitest'
+
+import { depositAbi } from '../../test/constants.js'
+import { sourcify } from './sourcify.js'
+
+const baseUrl = 'https://sourcify.dev/server/v2/contract'
+const address = '0x00000000219ab540356cbb839cbe05303d7705fa'
+const chainId = 1
+const multichainAddress = '0xC4c622862a8F548997699bE24EA4bc504e5cA865'
+const multichainIdGnosis = 100
+const multichainIdPolygon = 137
+const successJson = {
+ abi: depositAbi,
+}
+
+const handlers = [
+ http.get(`${baseUrl}/${chainId}/${address}`, () =>
+ HttpResponse.json(successJson),
+ ),
+ http.get(`${baseUrl}/${multichainIdGnosis}/${address}`, () =>
+ HttpResponse.json({}, { status: 404 }),
+ ),
+ http.get(`${baseUrl}/${multichainIdGnosis}/${multichainAddress}`, () =>
+ HttpResponse.json(successJson),
+ ),
+ http.get(`${baseUrl}/${multichainIdPolygon}/${multichainAddress}`, () =>
+ HttpResponse.json(successJson),
+ ),
+]
+
+const server = setupServer(...handlers)
+
+beforeAll(() => server.listen())
+afterEach(() => server.resetHandlers())
+afterAll(() => server.close())
+
+test('fetches ABI', () => {
+ expect(
+ sourcify({
+ chainId: chainId,
+ contracts: [{ name: 'DepositContract', address }],
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fetches ABI with multichain deployment', () => {
+ expect(
+ sourcify({
+ chainId: 100,
+ contracts: [
+ {
+ name: 'Community',
+ address: { 100: multichainAddress, 137: multichainAddress },
+ },
+ ],
+ }).contracts?.(),
+ ).resolves.toMatchSnapshot()
+})
+
+test('fails to fetch for unverified contract', () => {
+ expect(
+ sourcify({
+ chainId: 100,
+ contracts: [{ name: 'DepositContract', address }],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '[Error: Contract not found in Sourcify repository.]',
+ )
+})
+
+test('missing address for chainId', () => {
+ expect(
+ sourcify({
+ chainId: 1,
+ // @ts-expect-error `chainId` and `keyof typeof contracts[number].address` mismatch
+ contracts: [{ name: 'DepositContract', address: { 10: address } }],
+ }).contracts?.(),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ `[Error: No address found for chainId "1". Make sure chainId "1" is set as an address.]`,
+ )
+})
diff --git a/wagmi-project/packages/cli/src/plugins/sourcify.ts b/wagmi-project/packages/cli/src/plugins/sourcify.ts
new file mode 100644
index 000000000..0d452046c
--- /dev/null
+++ b/wagmi-project/packages/cli/src/plugins/sourcify.ts
@@ -0,0 +1,312 @@
+import { Abi as AbiSchema } from 'abitype/zod'
+import type { Address } from 'viem'
+import { z } from 'zod'
+
+import type { ContractConfig } from '../config.js'
+import { fromZodError } from '../errors.js'
+import type { Compute } from '../types.js'
+import { fetch } from './fetch.js'
+
+export type SourcifyConfig = {
+ /**
+ * Duration in milliseconds to cache ABIs.
+ *
+ * @default 1_800_000 // 30m in ms
+ */
+ cacheDuration?: number | undefined
+ /**
+ * Chain id to use for fetching ABI.
+ *
+ * If `address` is an object, `chainId` is used to select the address.
+ *
+ * See https://docs.sourcify.dev/docs/chains for supported chains.
+ */
+ chainId: (chainId extends ChainId ? chainId : never) | (ChainId & {})
+ /**
+ * Contracts to fetch ABIs for.
+ */
+ contracts: Compute, 'abi'>>[]
+}
+
+const SourcifyResponse = z.object({
+ abi: AbiSchema,
+})
+
+/** Fetches contract ABIs from Sourcify. */
+export function sourcify(
+ config: SourcifyConfig,
+) {
+ const { cacheDuration, chainId, contracts: contracts_ } = config
+
+ const contracts = contracts_.map((x) => ({
+ ...x,
+ address:
+ typeof x.address === 'string' ? { [chainId]: x.address } : x.address,
+ })) as Omit[]
+
+ return fetch({
+ cacheDuration,
+ contracts,
+ async parse({ response }) {
+ if (response.status === 404)
+ throw new Error('Contract not found in Sourcify repository.')
+
+ const json = await response.json()
+ const parsed = await SourcifyResponse.safeParseAsync(json)
+ if (!parsed.success)
+ throw fromZodError(parsed.error, { prefix: 'Invalid response' })
+
+ if (parsed.data.abi) return parsed.data.abi as ContractConfig['abi']
+ throw new Error('contract not found')
+ },
+ request({ address }) {
+ if (!address) throw new Error('address is required')
+
+ let contractAddress: Address | undefined
+ if (typeof address === 'string') contractAddress = address
+ else if (typeof address === 'object') contractAddress = address[chainId]
+
+ if (!contractAddress)
+ throw new Error(
+ `No address found for chainId "${chainId}". Make sure chainId "${chainId}" is set as an address.`,
+ )
+ return {
+ url: `https://sourcify.dev/server/v2/contract/${chainId}/${contractAddress}?fields=abi`,
+ }
+ },
+ })
+}
+
+// Supported chains
+// https://docs.sourcify.dev/docs/chains
+type ChainId =
+ | 1 // Ethereum Mainnet
+ | 17000 // Ethereum Testnet Holesky
+ | 5 // Ethereum Testnet Goerli
+ | 11155111 // Ethereum Testnet Sepolia
+ | 3 // Ethereum Testnet Ropsten
+ | 4 // Ethereum Testnet Rinkeby
+ | 10 // OP Mainnet
+ | 100 // Gnosis
+ | 100009 // VeChain
+ | 100010 // VeChain Testnet
+ | 1001 // Kaia Kairos Testnet
+ | 10200 // Gnosis Chiado Testnet
+ | 10242 // Arthera Mainnet
+ | 10243 // Arthera Testnet
+ | 1030 // Conflux eSpace
+ | 103090 // Crystaleum
+ | 105105 // Stratis Mainnet
+ | 106 // Velas EVM Mainnet
+ | 10849 // Lamina1
+ | 10850 // Lamina1 Identity
+ | 1088 // Metis Andromeda Mainnet
+ | 1101 // Polygon zkEVM
+ | 111000 // Siberium Test Network
+ | 11111 // WAGMI
+ | 1114 // Core Blockchain Testnet2
+ | 1115 // Core Blockchain Testnet
+ | 11155420 // OP Sepolia Testnet
+ | 1116 // Core Blockchain Mainnet
+ | 11235 // Haqq Network
+ | 1127469 // Tiltyard Subnet
+ | 11297108099 // Palm Testnet
+ | 11297108109 // Palm
+ | 1149 // Symplexia Smart Chain
+ | 122 // Fuse Mainnet
+ | 1284 // Moonbeam
+ | 1285 // Moonriver
+ | 1287 // Moonbase Alpha
+ | 12898 // PlayFair Testnet Subnet
+ | 1291 // Swisstronik Testnet
+ | 1313161554 // Aurora Mainnet
+ | 1313161555 // Aurora Testnet
+ | 13337 // Beam Testnet
+ | 13381 // Phoenix Mainnet
+ | 1339 // Elysium Mainnet
+ | 137 // Polygon Mainnet
+ | 14 // Flare Mainnet
+ | 1433 // Rikeza Network Mainnet
+ | 1516 // Story Odyssey Testnet
+ | 16180 // PLYR PHI
+ | 16350 // Incentiv Devnet
+ | 167005 // Taiko Grimsvotn L2
+ | 167006 // Taiko Eldfell L3
+ | 17069 // Garnet Holesky
+ | 180 // AME Chain Mainnet
+ | 1890 // Lightlink Phoenix Mainnet
+ | 1891 // Lightlink Pegasus Testnet
+ | 19 // Songbird Canary-Network
+ | 19011 // HOME Verse Mainnet
+ | 192837465 // Gather Mainnet Network
+ | 2000 // Dogechain Mainnet
+ | 200810 // Bitlayer Testnet
+ | 200901 // Bitlayer Mainnet
+ | 2017 // Adiri
+ | 2020 // Ronin Mainnet
+ | 2021 // Edgeware EdgeEVM Mainnet
+ | 202401 // YMTECH-BESU Testnet
+ | 2037 // Kiwi Subnet
+ | 2038 // Shrapnel Testnet
+ | 2044 // Shrapnel Subnet
+ | 2047 // Stratos Testnet
+ | 2048 // Stratos
+ | 205205 // Auroria Testnet
+ | 212 // MAPO Makalu
+ | 216 // Happychain Testnet
+ | 222000222 // Kanazawa
+ | 2221 // Kava Testnet
+ | 2222 // Kava
+ | 223 // B2 Mainnet
+ | 22776 // MAP Protocol
+ | 23294 // Oasis Sapphire
+ | 23295 // Oasis Sapphire Testnet
+ | 2358 // Kroma Sepolia
+ | 2442 // Polygon zkEVM Cardona Testnet
+ | 246 // Energy Web Chain
+ | 25 // Cronos Mainnet
+ | 250 // Fantom Opera
+ | 252 // Fraxtal
+ | 2522 // Fraxtal Testnet
+ | 255 // Kroma
+ | 25925 // KUB Testnet
+ | 26100 // Ferrum Quantum Portal Network
+ | 28 // Boba Network Rinkeby Testnet
+ | 28528 // Optimism Bedrock (Goerli Alpha Testnet)
+ | 288 // Boba Network
+ | 295 // Hedera Mainnet
+ | 30 // Rootstock Mainnet
+ | 300 // zkSync Sepolia Testnet
+ | 311752642 // OneLedger Mainnet
+ | 314 // Filecoin - Mainnet
+ | 314159 // Filecoin - Calibration testnet
+ | 32769 // Zilliqa EVM
+ | 32770 // Zilliqa 2 EVM proto-mainnet
+ | 33101 // Zilliqa EVM Testnet
+ | 33103 // Zilliqa 2 EVM proto-testnet
+ | 33111 // Curtis
+ | 333000333 // Meld
+ | 335 // DFK Chain Test
+ | 336 // Shiden
+ | 34443 // Mode
+ | 35441 // Q Mainnet
+ | 35443 // Q Testnet
+ | 356256156 // Gather Testnet Network
+ | 369 // PulseChain
+ | 3737 // Crossbell
+ | 37714555429 // Xai Testnet v2
+ | 383414847825 // Zeniq
+ | 39797 // Energi Mainnet
+ | 40 // Telos EVM Mainnet
+ | 4000 // Ozone Chain Mainnet
+ | 41 // Telos EVM Testnet
+ | 4157 // CrossFi Testnet
+ | 420 // Optimism Goerli Testnet
+ | 4200 // Merlin Mainnet
+ | 420420 // Kekchain
+ | 420666 // Kekchain (kektest)
+ | 42161 // Arbitrum One
+ | 421611 // Arbitrum Rinkeby
+ | 421613 // Arbitrum Goerli
+ | 4216137055 // OneLedger Testnet Frankenstein
+ | 421614 // Arbitrum Sepolia
+ | 42170 // Arbitrum Nova
+ | 42220 // Celo Mainnet
+ | 42261 // Oasis Emerald Testnet
+ | 42262 // Oasis Emerald
+ | 42766 // ZKFair Mainnet
+ | 43 // Darwinia Pangolin Testnet
+ | 43113 // Avalanche Fuji Testnet
+ | 43114 // Avalanche C-Chain
+ | 432201 // Dexalot Subnet Testnet
+ | 432204 // Dexalot Subnet
+ | 4337 // Beam
+ | 44 // Crab Network
+ | 44787 // Celo Alfajores Testnet
+ | 46 // Darwinia Network
+ | 486217935 // Gather Devnet Network
+ | 48898 // Zircuit Garfield Testnet
+ | 48899 // Zircuit Testnet
+ | 48900 // Zircuit Mainnet
+ | 49797 // Energi Testnet
+ | 50 // XDC Network
+ | 5000 // Mantle
+ | 5003 // Mantle Sepolia Testnet
+ | 51 // XDC Apothem Network
+ | 5115 // Citrea Testnet
+ | 534 // Candle
+ | 534351 // Scroll Sepolia Testnet
+ | 534352 // Scroll
+ | 53935 // DFK Chain
+ | 54211 // Haqq Chain Testnet
+ | 56 // BNB Smart Chain Mainnet
+ | 560048 // Hoodi testnet
+ | 57 // Syscoin Mainnet
+ | 570 // Rollux Mainnet
+ | 5700 // Syscoin Tanenbaum Testnet
+ | 57000 // Rollux Testnet
+ | 5845 // Tangle
+ | 59141 // Linea Sepolia
+ | 59144 // Linea
+ | 592 // Astar
+ | 59902 // Metis Sepolia Testnet
+ | 61 // Ethereum Classic
+ | 6119 // UPTN
+ | 62320 // Celo Baklava Testnet
+ | 62621 // MultiVAC Mainnet
+ | 62831 // PLYR TAU Testnet
+ | 6321 // Aura Euphoria Testnet
+ | 6322 // Aura Mainnet
+ | 641230 // Bear Network Chain Mainnet
+ | 648 // Endurance Smart Chain Mainnet
+ | 660279 // Xai Mainnet
+ | 666666666 // Degen Chain
+ | 69 // Optimism Kovan
+ | 690 // Redstone
+ | 7000 // ZetaChain Mainnet
+ | 7001 // ZetaChain Testnet
+ | 7078815900 // Mekong
+ | 710420 // Tiltyard Mainnet Subnet
+ | 71401 // Godwoken Testnet v1
+ | 71402 // Godwoken Mainnet
+ | 7171 // Bitrock Mainnet
+ | 7200 // exSat Mainnet
+ | 723107 // TixChain Testnet
+ | 73799 // Energy Web Volta Testnet
+ | 764984 // Lamina1 Testnet
+ | 7668 // The Root Network - Mainnet
+ | 7672 // The Root Network - Porcini Testnet
+ | 767368 // Lamina1 Identity Testnet
+ | 77 // POA Network Sokol
+ | 7700 // Canto
+ | 7701 // Canto Tesnet
+ | 7771 // Bitrock Testnet
+ | 7777777 // Zora
+ | 78430 // Amplify Subnet
+ | 78431 // Bulletin Subnet
+ | 78432 // Conduit Subnet
+ | 8 // Ubiq
+ | 80001 // Mumbai
+ | 80002 // Amoy
+ | 82 // Meter Mainnet
+ | 8217 // Kaia Mainnet
+ | 83 // Meter Testnet
+ | 839999 // exSat Testnet
+ | 841 // Taraxa Mainnet
+ | 842 // Taraxa Testnet
+ | 8453 // Base
+ | 84531 // Base Goerli Testnet
+ | 84532 // Base Sepolia Testnet
+ | 888 // Wanchain
+ | 9000 // Evmos Testnet
+ | 9001 // Evmos
+ | 919 // Mode Testnet
+ | 957 // Lyra Chain
+ | 96 // KUB Mainnet
+ | 97 // BNB Smart Chain Testnet
+ | 970 // Oort Mainnet
+ | 99 // POA Network Core
+ | 9977 // Mind Smart Chain Testnet
+ | 999 // Wanchain Testnet
+ | 9996 // Mind Smart Chain Mainnet
+ | 999999999 // Zora Sepolia Testnet
diff --git a/wagmi-project/packages/cli/src/types.ts b/wagmi-project/packages/cli/src/types.ts
new file mode 100644
index 000000000..adb288934
--- /dev/null
+++ b/wagmi-project/packages/cli/src/types.ts
@@ -0,0 +1,10 @@
+export type Compute = { [key in keyof type]: type[key] } & unknown
+
+export type MaybeArray = T | T[]
+
+export type MaybePromise = T | Promise
+
+export type RequiredBy = Required<
+ Pick
+> &
+ Omit
diff --git a/wagmi-project/packages/cli/src/utils/findConfig.test.ts b/wagmi-project/packages/cli/src/utils/findConfig.test.ts
new file mode 100644
index 000000000..52c206677
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/findConfig.test.ts
@@ -0,0 +1,42 @@
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { createFixture } from '../../test/utils.js'
+import { findConfig } from './findConfig.js'
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('finds config file', async () => {
+ const { dir, paths } = await createFixture({
+ files: { 'wagmi.config.ts': '' },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(findConfig()).resolves.toBe(paths['wagmi.config.ts'])
+})
+
+test('finds config file at location', async () => {
+ const { dir, paths } = await createFixture({
+ files: { 'wagmi.config.ts': '' },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(findConfig({ config: paths['wagmi.config.ts'] })).resolves.toBe(
+ paths['wagmi.config.ts'],
+ )
+})
+
+test('finds config file at root', async () => {
+ const { dir, paths } = await createFixture({
+ files: { 'wagmi.config.ts': '' },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(findConfig({ root: dir })).resolves.toBe(
+ paths['wagmi.config.ts'],
+ )
+})
diff --git a/wagmi-project/packages/cli/src/utils/findConfig.ts b/wagmi-project/packages/cli/src/utils/findConfig.ts
new file mode 100644
index 000000000..2e94e2d5a
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/findConfig.ts
@@ -0,0 +1,39 @@
+import { existsSync } from 'node:fs'
+import escalade from 'escalade'
+import { resolve } from 'pathe'
+
+// Do not reorder
+// In order of preference files are checked
+const configFiles = [
+ 'wagmi.config.ts',
+ 'wagmi.config.js',
+ 'wagmi.config.mjs',
+ 'wagmi.config.mts',
+]
+
+type FindConfigParameters = {
+ /** Config file name */
+ config?: string | undefined
+ /** Config file directory */
+ root?: string | undefined
+}
+
+/**
+ * Resolves path to wagmi CLI config file.
+ */
+export async function findConfig(parameters: FindConfigParameters = {}) {
+ const { config, root } = parameters
+ const rootDir = resolve(root || process.cwd())
+ if (config) {
+ const path = resolve(rootDir, config)
+ if (existsSync(path)) return path
+ return
+ }
+ const configPath = await escalade(rootDir, (_dir, names) => {
+ for (const name of names) {
+ if (configFiles.includes(name)) return name
+ }
+ return undefined
+ })
+ return configPath
+}
diff --git a/wagmi-project/packages/cli/src/utils/format.test.ts b/wagmi-project/packages/cli/src/utils/format.test.ts
new file mode 100644
index 000000000..6d04eb546
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/format.test.ts
@@ -0,0 +1,12 @@
+import { expect, test } from 'vitest'
+
+import { format } from './format.js'
+
+test('formats code', async () => {
+ await expect(
+ format(`const foo = "bar"`),
+ ).resolves.toMatchInlineSnapshot(`
+ "const foo = 'bar'
+ "
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/utils/format.ts b/wagmi-project/packages/cli/src/utils/format.ts
new file mode 100644
index 000000000..d440e6047
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/format.ts
@@ -0,0 +1,17 @@
+import prettier from 'prettier'
+
+export async function format(content: string) {
+ const config = await prettier.resolveConfig(process.cwd())
+ return prettier.format(content, {
+ arrowParens: 'always',
+ endOfLine: 'lf',
+ parser: 'typescript',
+ printWidth: 80,
+ semi: false,
+ singleQuote: true,
+ tabWidth: 2,
+ trailingComma: 'all',
+ ...config,
+ plugins: [],
+ })
+}
diff --git a/wagmi-project/packages/cli/src/utils/getAddressDocString.test.ts b/wagmi-project/packages/cli/src/utils/getAddressDocString.test.ts
new file mode 100644
index 000000000..798e6e14e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/getAddressDocString.test.ts
@@ -0,0 +1,40 @@
+import { expect, test } from 'vitest'
+
+import { getAddressDocString } from './getAddressDocString.js'
+
+test('address', async () => {
+ expect(
+ getAddressDocString({
+ address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ }),
+ ).toMatchInlineSnapshot('""')
+})
+
+test('multichain address with known chain ids', async () => {
+ expect(
+ getAddressDocString({
+ address: {
+ 1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ 5: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ 10: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ },
+ }),
+ ).toMatchInlineSnapshot(`
+ "* - [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)
+ * - [__View Contract on Goerli Etherscan__](https://goerli.etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)
+ * - [__View Contract on Op Mainnet Optimism Explorer__](https://optimistic.etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)"
+ `)
+})
+
+test('multichain address with unknown chain id', async () => {
+ expect(
+ getAddressDocString({
+ address: {
+ 1: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ 2: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ },
+ }),
+ ).toMatchInlineSnapshot(
+ '"* [__View Contract on Ethereum Etherscan__](https://etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e)"',
+ )
+})
diff --git a/wagmi-project/packages/cli/src/utils/getAddressDocString.ts b/wagmi-project/packages/cli/src/utils/getAddressDocString.ts
new file mode 100644
index 000000000..d0e137928
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/getAddressDocString.ts
@@ -0,0 +1,53 @@
+import { capitalCase } from 'change-case'
+import dedent from 'dedent'
+import * as allChains from 'viem/chains'
+
+import type { Contract } from '../config.js'
+
+const chainMap: Record = {}
+for (const chain of Object.values(allChains)) {
+ if (typeof chain !== 'object') continue
+ if (!('id' in chain)) continue
+ chainMap[chain.id] = chain
+}
+
+export function getAddressDocString(parameters: {
+ address: Contract['address']
+}) {
+ const { address } = parameters
+ if (!address || typeof address === 'string') return ''
+
+ if (Object.keys(address).length === 1)
+ return `* ${getLink({
+ address: address[Number.parseInt(Object.keys(address)[0]!)]!,
+ chainId: Number.parseInt(Object.keys(address)[0]!),
+ })}`
+
+ const addresses = Object.entries(address).filter(
+ (x) => chainMap[Number.parseInt(x[0])],
+ )
+ if (addresses.length === 0) return ''
+ if (addresses.length === 1 && addresses[0])
+ return `* ${getLink({
+ address: addresses[0][1],
+ chainId: Number.parseInt(addresses[0][0])!,
+ })}`
+
+ return dedent`
+ ${addresses.reduce((prev, curr) => {
+ const chainId = Number.parseInt(curr[0])
+ const address = curr[1]
+ return `${prev}\n* - ${getLink({ address, chainId })}`
+ }, '')}
+ `
+}
+
+function getLink({ address, chainId }: { address: string; chainId: number }) {
+ const chain = chainMap[chainId]
+ if (!chain) return ''
+ const blockExplorer = chain.blockExplorers?.default
+ if (!blockExplorer) return ''
+ return `[__View Contract on ${capitalCase(chain.name)} ${capitalCase(
+ blockExplorer.name,
+ )}__](${blockExplorer.url}/address/${address})`
+}
diff --git a/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.test.ts b/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.test.ts
new file mode 100644
index 000000000..3ba7c86a6
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.test.ts
@@ -0,0 +1,43 @@
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { createFixture } from '../../test/utils.js'
+import { getIsUsingTypeScript } from './getIsUsingTypeScript.js'
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('true if has tsconfig', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'tsconfig.json': '',
+ },
+ })
+
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(getIsUsingTypeScript()).resolves.toBe(true)
+})
+
+test('true if has wagmi.config', async () => {
+ const { dir } = await createFixture({
+ files: {
+ 'wagmi.config.ts': '',
+ },
+ })
+
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(getIsUsingTypeScript()).resolves.toBe(true)
+})
+
+test('false', async () => {
+ const { dir } = await createFixture()
+
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ await expect(getIsUsingTypeScript()).resolves.toBe(false)
+})
diff --git a/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.ts b/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.ts
new file mode 100644
index 000000000..bd2383b0e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/getIsUsingTypeScript.ts
@@ -0,0 +1,33 @@
+import escalade from 'escalade'
+
+export async function getIsUsingTypeScript() {
+ try {
+ const cwd = process.cwd()
+ const tsconfig = await escalade(cwd, (_dir, names) => {
+ const files = [
+ 'tsconfig.json',
+ 'tsconfig.base.json',
+ 'tsconfig.lib.json',
+ 'tsconfig.node.json',
+ ]
+ for (const name of names) {
+ if (files.includes(name)) return name
+ }
+ return undefined
+ })
+ if (tsconfig) return true
+
+ const wagmiConfig = await escalade(cwd, (_dir, names) => {
+ const files = ['wagmi.config.ts', 'wagmi.config.mts']
+ for (const name of names) {
+ if (files.includes(name)) return name
+ }
+ return undefined
+ })
+ if (wagmiConfig) return true
+
+ return false
+ } catch {
+ return false
+ }
+}
diff --git a/wagmi-project/packages/cli/src/utils/loadEnv.test.ts b/wagmi-project/packages/cli/src/utils/loadEnv.test.ts
new file mode 100644
index 000000000..d577778eb
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/loadEnv.test.ts
@@ -0,0 +1,77 @@
+import { afterEach, expect, test, vi } from 'vitest'
+
+import { createFixture } from '../../test/utils.js'
+import { loadEnv } from './loadEnv.js'
+
+afterEach(() => {
+ vi.restoreAllMocks()
+})
+
+test('loads env', async () => {
+ const { dir } = await createFixture({
+ files: {
+ '.env': `
+ FOO=bar
+ SOME_ENV_VAR=1
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ expect(loadEnv()).toMatchInlineSnapshot(`
+ {
+ "FOO": "bar",
+ "SOME_ENV_VAR": "1",
+ }
+ `)
+})
+
+test('loads env from envDir', async () => {
+ const { dir } = await createFixture({
+ files: {
+ '.env': `
+ FOO=bar
+ SOME_ENV_VAR=1
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ expect(loadEnv({ envDir: dir })).toMatchInlineSnapshot(`
+ {
+ "FOO": "bar",
+ "SOME_ENV_VAR": "1",
+ }
+ `)
+})
+
+test('loads env with mode', async () => {
+ const mode = 'dev'
+ const { dir } = await createFixture({
+ files: {
+ [`.env.${mode}`]: `
+ FOO=bar
+ SOME_ENV_VAR=1
+ `,
+ },
+ })
+ const spy = vi.spyOn(process, 'cwd')
+ spy.mockImplementation(() => dir)
+
+ expect(loadEnv({ mode })).toMatchInlineSnapshot(`
+ {
+ "FOO": "bar",
+ "SOME_ENV_VAR": "1",
+ }
+ `)
+})
+
+test('throws error when mode is "local"', async () => {
+ expect(() => {
+ loadEnv({ mode: 'local' })
+ }).toThrowErrorMatchingInlineSnapshot(
+ `[Error: "local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.]`,
+ )
+})
diff --git a/wagmi-project/packages/cli/src/utils/loadEnv.ts b/wagmi-project/packages/cli/src/utils/loadEnv.ts
new file mode 100644
index 000000000..d7ffa9991
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/loadEnv.ts
@@ -0,0 +1,90 @@
+import { parse } from 'dotenv'
+import { expand } from 'dotenv-expand'
+
+import { existsSync, readFileSync, statSync } from 'node:fs'
+import { dirname, join } from 'node:path'
+
+// https://github.com/vitejs/vite/blob/main/packages/vite/src/node/env.ts#L7
+export function loadEnv(
+ config: {
+ mode?: string
+ envDir?: string
+ } = {},
+): Record {
+ const mode = config.mode
+ if (mode === 'local') {
+ throw new Error(
+ `"local" cannot be used as a mode name because it conflicts with the .local postfix for .env files.`,
+ )
+ }
+
+ const envFiles = [
+ /** default file */ '.env',
+ /** local file */ '.env.local',
+ ...(mode
+ ? [
+ /** mode file */ `.env.${mode}`,
+ /** mode local file */ `.env.${mode}.local`,
+ ]
+ : []),
+ ]
+
+ const envDir = config.envDir ?? process.cwd()
+ const parsed = Object.fromEntries(
+ envFiles.flatMap((file) => {
+ const path = lookupFile(envDir, [file], {
+ pathOnly: true,
+ rootDir: envDir,
+ })
+ if (!path) return []
+ return Object.entries(parse(readFileSync(path)))
+ }),
+ )
+
+ try {
+ // let environment variables use each other
+ expand({ parsed })
+ } catch (error) {
+ // custom error handling until https://github.com/motdotla/dotenv-expand/issues/65 is fixed upstream
+ // check for message "TypeError: Cannot read properties of undefined (reading 'split')"
+ if ((error as Error).message.includes('split')) {
+ throw new Error(
+ 'dotenv-expand failed to expand env vars. Maybe you need to escape `$`?',
+ )
+ }
+ throw error
+ }
+
+ return parsed
+}
+
+function lookupFile(
+ dir: string,
+ formats: string[],
+ options?: {
+ pathOnly?: boolean
+ rootDir?: string
+ predicate?: (file: string) => boolean
+ },
+): string | undefined {
+ for (const format of formats) {
+ const fullPath = join(dir, format)
+ if (existsSync(fullPath) && statSync(fullPath).isFile()) {
+ const result = options?.pathOnly
+ ? fullPath
+ : readFileSync(fullPath, 'utf-8')
+ if (!options?.predicate || options.predicate(result)) {
+ return result
+ }
+ }
+ }
+
+ const parentDir = dirname(dir)
+ if (
+ parentDir !== dir &&
+ (!options?.rootDir || parentDir.startsWith(options?.rootDir))
+ )
+ return lookupFile(parentDir, formats, options)
+
+ return undefined
+}
diff --git a/wagmi-project/packages/cli/src/utils/packages.test.ts b/wagmi-project/packages/cli/src/utils/packages.test.ts
new file mode 100644
index 000000000..96ea2e26e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/packages.test.ts
@@ -0,0 +1,19 @@
+import { expect, test } from 'vitest'
+
+import { getIsPackageInstalled, getPackageManager } from './packages.js'
+
+test('getIsPackageInstalled: true', async () => {
+ await expect(getIsPackageInstalled({ packageName: 'vitest' })).resolves.toBe(
+ true,
+ )
+})
+
+test('getIsPackageInstalled: false', async () => {
+ await expect(
+ getIsPackageInstalled({ packageName: 'vitest-unknown' }),
+ ).resolves.toBe(false)
+})
+
+test('getPackageManager', async () => {
+ await expect(getPackageManager()).resolves.toMatchInlineSnapshot('"pnpm"')
+})
diff --git a/wagmi-project/packages/cli/src/utils/packages.ts b/wagmi-project/packages/cli/src/utils/packages.ts
new file mode 100644
index 000000000..e55eeaf0e
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/packages.ts
@@ -0,0 +1,124 @@
+import { execSync } from 'node:child_process'
+import { promises as fs } from 'node:fs'
+import { resolve } from 'node:path'
+
+export async function getIsPackageInstalled(parameters: {
+ packageName: string
+ cwd?: string
+}) {
+ const { packageName, cwd = process.cwd() } = parameters
+ try {
+ const packageManager = await getPackageManager()
+ const command = (() => {
+ switch (packageManager) {
+ case 'yarn':
+ return ['why', packageName]
+ case 'bun':
+ return ['pm', 'ls', '--all']
+ default:
+ return ['ls', packageName]
+ }
+ })()
+
+ const result = execSync(`${packageManager} ${command.join(' ')}`, {
+ cwd,
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+
+ // For Bun, we need to check if the package name is in the output
+ if (packageManager === 'bun') return result.includes(packageName)
+
+ return result !== ''
+ } catch (_error) {
+ return false
+ }
+}
+
+export async function getPackageManager(executable?: boolean | undefined) {
+ const userAgent = process.env.npm_config_user_agent
+ if (userAgent) {
+ if (userAgent.includes('pnpm')) return 'pnpm'
+ // The yarn@^3 user agent includes npm, so yarn must be checked first.
+ if (userAgent.includes('yarn')) return 'yarn'
+ if (userAgent.includes('npm')) return executable ? 'npx' : 'npm'
+ if (userAgent.includes('bun')) return executable ? 'bunx' : 'bun'
+ }
+
+ const packageManager = await detect()
+ if (packageManager === 'npm' && executable) return 'npx'
+ return packageManager
+}
+
+type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'
+
+async function detect(
+ parameters: { cwd?: string; includeGlobalBun?: boolean } = {},
+) {
+ const { cwd, includeGlobalBun } = parameters
+ const type = await getTypeofLockFile(cwd)
+ if (type) {
+ return type
+ }
+ const [hasYarn, hasPnpm, hasBun] = await Promise.all([
+ hasGlobalInstallation('yarn'),
+ hasGlobalInstallation('pnpm'),
+ includeGlobalBun && hasGlobalInstallation('bun'),
+ ])
+ if (hasYarn) return 'yarn'
+ if (hasPnpm) return 'pnpm'
+ if (hasBun) return 'bun'
+ return 'npm'
+}
+
+const cache = new Map()
+
+function hasGlobalInstallation(pm: PackageManager): boolean {
+ const key = `has_global_${pm}`
+ if (cache.has(key)) return cache.get(key)
+
+ try {
+ const result = execSync(`${pm} --version`, {
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ })
+ const isGlobal = /^\d+.\d+.\d+$/.test(result)
+ cache.set(key, isGlobal)
+ return isGlobal
+ } catch {
+ return false
+ }
+}
+
+function getTypeofLockFile(cwd = '.'): Promise {
+ const key = `lockfile_${cwd}`
+ if (cache.has(key)) {
+ return Promise.resolve(cache.get(key))
+ }
+
+ return Promise.all([
+ pathExists(resolve(cwd, 'yarn.lock')),
+ pathExists(resolve(cwd, 'package-lock.json')),
+ pathExists(resolve(cwd, 'pnpm-lock.yaml')),
+ pathExists(resolve(cwd, 'bun.lockb')),
+ ]).then(([isYarn, isNpm, isPnpm, isBun]) => {
+ let value: PackageManager | null = null
+
+ if (isYarn) value = 'yarn'
+ else if (isPnpm) value = 'pnpm'
+ else if (isBun) value = 'bun'
+ else if (isNpm) value = 'npm'
+
+ cache.set(key, value)
+ return value
+ })
+}
+
+async function pathExists(p: string) {
+ try {
+ await fs.access(p)
+ return true
+ } catch {
+ return false
+ }
+}
diff --git a/wagmi-project/packages/cli/src/utils/resolveConfig.test.ts b/wagmi-project/packages/cli/src/utils/resolveConfig.test.ts
new file mode 100644
index 000000000..6669edc9b
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/resolveConfig.test.ts
@@ -0,0 +1,83 @@
+import { expect, test } from 'vitest'
+
+import { createFixture } from '../../test/utils.js'
+import { defaultConfig } from '../config.js'
+import { findConfig } from './findConfig.js'
+import { resolveConfig } from './resolveConfig.js'
+
+test.skip('resolves config', async () => {
+ const { paths } = await createFixture({
+ files: {
+ 'wagmi.config.ts': `
+ import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig(${JSON.stringify(defaultConfig)})
+ `,
+ },
+ })
+
+ const configPath = await findConfig({
+ config: paths['wagmi.config.ts'],
+ })
+ await expect(
+ resolveConfig({ configPath: configPath! }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "contracts": [],
+ "out": "src/generated.ts",
+ "plugins": [],
+ }
+ `)
+})
+
+test.skip('resolves function config', async () => {
+ const { paths } = await createFixture({
+ files: {
+ 'wagmi.config.ts': `
+ import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig(() => (${JSON.stringify(defaultConfig)}))
+ `,
+ },
+ })
+
+ const configPath = await findConfig({
+ config: paths['wagmi.config.ts'],
+ })
+ await expect(
+ resolveConfig({ configPath: configPath! }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "contracts": [],
+ "out": "src/generated.ts",
+ "plugins": [],
+ }
+ `)
+})
+
+test.skip('resolves array config', async () => {
+ const { paths } = await createFixture({
+ files: {
+ 'wagmi.config.ts': `
+ import { defineConfig } from '@wagmi/cli'
+
+ export default defineConfig([${JSON.stringify(defaultConfig)}])
+ `,
+ },
+ })
+
+ const configPath = await findConfig({
+ config: paths['wagmi.config.ts'],
+ })
+ await expect(
+ resolveConfig({ configPath: configPath! }),
+ ).resolves.toMatchInlineSnapshot(`
+ [
+ {
+ "contracts": [],
+ "out": "src/generated.ts",
+ "plugins": [],
+ },
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/cli/src/utils/resolveConfig.ts b/wagmi-project/packages/cli/src/utils/resolveConfig.ts
new file mode 100644
index 000000000..048b1c337
--- /dev/null
+++ b/wagmi-project/packages/cli/src/utils/resolveConfig.ts
@@ -0,0 +1,21 @@
+import { bundleRequire } from 'bundle-require'
+
+import type { Config } from '../config.js'
+import type { MaybeArray } from '../types.js'
+
+type ResolveConfigParameters = {
+ /** Path to config file */
+ configPath: string
+}
+
+/** Bundles and returns wagmi config object from path. */
+export async function resolveConfig(
+ parameters: ResolveConfigParameters,
+): Promise> {
+ const { configPath } = parameters
+ const res = await bundleRequire({ filepath: configPath })
+ let config = res.mod.default
+ if (config.default) config = config.default
+ if (typeof config !== 'function') return config
+ return await config()
+}
diff --git a/wagmi-project/packages/cli/src/version.ts b/wagmi-project/packages/cli/src/version.ts
new file mode 100644
index 000000000..166b988cc
--- /dev/null
+++ b/wagmi-project/packages/cli/src/version.ts
@@ -0,0 +1 @@
+export const version = '2.3.1'
diff --git a/wagmi-project/packages/cli/test/constants.ts b/wagmi-project/packages/cli/test/constants.ts
new file mode 100644
index 000000000..9b84c5bb1
--- /dev/null
+++ b/wagmi-project/packages/cli/test/constants.ts
@@ -0,0 +1,32 @@
+import { parseAbi } from 'viem'
+
+export const wagmiAbi = parseAbi([
+ 'constructor()',
+ 'event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)',
+ 'event ApprovalForAll(address indexed owner, address indexed operator, bool approved)',
+ 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',
+ 'function approve(address to, uint256 tokenId)',
+ 'function balanceOf(address owner) view returns (uint256)',
+ 'function getApproved(uint256 tokenId) view returns (address)',
+ 'function isApprovedForAll(address owner, address operator) view returns (bool)',
+ 'function mint()',
+ 'function name() view returns (string)',
+ 'function ownerOf(uint256 tokenId) view returns (address)',
+ 'function safeTransferFrom(address from, address to, uint256 tokenId)',
+ 'function safeTransferFrom(address from, address to, uint256 tokenId, bytes _data)',
+ 'function setApprovalForAll(address operator, bool approved)',
+ 'function supportsInterface(bytes4 interfaceId) view returns (bool)',
+ 'function symbol() view returns (string)',
+ 'function tokenURI(uint256 tokenId) pure returns (string)',
+ 'function totalSupply() view returns (uint256)',
+ 'function transferFrom(address from, address to, uint256 tokenId)',
+])
+
+export const depositAbi = parseAbi([
+ 'constructor()',
+ 'event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index)',
+ 'function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) payable',
+ 'function get_deposit_count() view returns (bytes)',
+ 'function get_deposit_root() view returns (bytes32)',
+ 'function supportsInterface(bytes4 interfaceId) pure returns (bool)',
+])
diff --git a/wagmi-project/packages/cli/test/setup.ts b/wagmi-project/packages/cli/test/setup.ts
new file mode 100644
index 000000000..d2eed4a5e
--- /dev/null
+++ b/wagmi-project/packages/cli/test/setup.ts
@@ -0,0 +1,57 @@
+import { mkdir } from 'node:fs/promises'
+import { homedir } from 'node:os'
+import type { createSpinner as nanospinner_createSpinner } from 'nanospinner'
+import { join } from 'pathe'
+import { vi } from 'vitest'
+
+const cacheDir = join(homedir(), '.wagmi-cli/plugins/fetch/cache')
+await mkdir(cacheDir, { recursive: true })
+
+vi.mock('nanospinner', async (importOriginal) => {
+ const mod = await importOriginal<{
+ createSpinner: typeof nanospinner_createSpinner
+ }>()
+
+ function createSpinner(
+ initialText: string,
+ opts: Parameters[1],
+ ) {
+ let currentText = ''
+ const spinner = mod.createSpinner(initialText, opts)
+ return {
+ ...spinner,
+ start(text = initialText) {
+ // biome-ignore lint/suspicious/noConsoleLog: console.log is used for logging
+ console.log(`- ${text}`)
+ spinner.start(text)
+ currentText = text
+ },
+ success(text = currentText) {
+ // biome-ignore lint/suspicious/noConsoleLog: console.log is used for logging
+ console.log(`ā ${text}`)
+ spinner.success(text)
+ },
+ error(text = currentText) {
+ console.error(`Ć ${text}`)
+ spinner.error(text)
+ },
+ }
+ }
+ return { createSpinner }
+})
+
+vi.mock('picocolors', async () => {
+ function pass(input: string | number | null | undefined) {
+ return input
+ }
+ return {
+ default: {
+ blue: pass,
+ gray: pass,
+ green: pass,
+ red: pass,
+ white: pass,
+ yellow: pass,
+ },
+ }
+})
diff --git a/wagmi-project/packages/cli/test/utils.ts b/wagmi-project/packages/cli/test/utils.ts
new file mode 100644
index 000000000..4ea6c6051
--- /dev/null
+++ b/wagmi-project/packages/cli/test/utils.ts
@@ -0,0 +1,292 @@
+import { spawnSync } from 'node:child_process'
+import { cp, mkdir, symlink, writeFile } from 'node:fs/promises'
+import fixtures from 'fixturez'
+import { http, HttpResponse } from 'msw'
+import * as path from 'pathe'
+import { vi } from 'vitest'
+
+const f = fixtures(__dirname)
+
+type Json =
+ | string
+ | number
+ | boolean
+ | null
+ | { [property: string]: Json }
+ | Json[]
+
+export async function createFixture<
+ TFiles extends { [filename: string]: string | Json } & {
+ tsconfig?: true
+ },
+>(
+ config: {
+ copyNodeModules?: boolean
+ dir?: string
+ files?: TFiles
+ } = {},
+) {
+ const dir = config.dir ?? f.temp()
+ await mkdir(dir, { recursive: true })
+
+ // Create test files
+ const paths: { [_ in keyof TFiles]: string } = {} as any
+ await Promise.all(
+ (Object.keys(config.files ?? {}) as (keyof TFiles)[]).map(
+ async (filename_) => {
+ let file: Json | true | undefined
+ let filename = filename_
+ if (filename === 'tsconfig') {
+ filename = 'tsconfig.json'
+ file = getTsConfig(dir)
+ } else file = config.files![filename]
+
+ const filePath = path.join(dir, filename.toString())
+ await mkdir(path.dirname(filePath), { recursive: true })
+
+ await writeFile(
+ filePath,
+ typeof file === 'string' ? file : JSON.stringify(file, null, 2),
+ )
+ paths[filename === 'tsconfig.json' ? 'tsconfig' : filename] = filePath
+ },
+ ),
+ )
+
+ if (config.copyNodeModules) {
+ await symlink(
+ path.join(__dirname, '../node_modules'),
+ path.join(dir, 'node_modules'),
+ 'dir',
+ )
+ await cp(
+ path.join(__dirname, '../package.json'),
+ path.join(dir, 'package.json'),
+ )
+ }
+
+ return {
+ dir,
+ paths: paths,
+ }
+}
+
+type TsConfig = {
+ compilerOptions: { [property: string]: any }
+ exclude: string[]
+ include: string[]
+}
+function getTsConfig(baseUrl: string) {
+ return {
+ compilerOptions: {
+ allowJs: true,
+ baseUrl: '.',
+ esModuleInterop: true,
+ forceConsistentCasingInFileNames: true,
+ incremental: true,
+ isolatedModules: true,
+ jsx: 'preserve',
+ lib: ['dom', 'dom.iterable', 'esnext'],
+ module: 'esnext',
+ moduleResolution: 'node',
+ noEmit: true,
+ paths: {
+ '@wagmi/cli': [path.relative(baseUrl, 'packages/cli/src')],
+ '@wagmi/cli/*': [path.relative(baseUrl, 'packages/cli/src/*')],
+ '@wagmi/connectors': [
+ path.relative(baseUrl, 'packages/connectors/src'),
+ ],
+ '@wagmi/connectors/*': [
+ path.relative(baseUrl, 'packages/connectors/src/*'),
+ ],
+ '@wagmi/core': [path.relative(baseUrl, 'packages/core/src')],
+ '@wagmi/core/*': [path.relative(baseUrl, 'packages/core/src/*')],
+ wagmi: [path.relative(baseUrl, 'packages/react/src')],
+ 'wagmi/*': [path.relative(baseUrl, 'packages/react/src/*')],
+ },
+ resolveJsonModule: true,
+ skipLibCheck: true,
+ strict: true,
+ target: 'es6',
+ },
+ include: [`${baseUrl}/**/*.ts`, `${baseUrl}/**/*.tsx`],
+ exclude: ['node_modules'],
+ } as TsConfig
+}
+
+export function watchConsole() {
+ type Console = 'info' | 'log' | 'warn' | 'error'
+ const output: { [_ in Console | 'all']: string[] } = {
+ info: [],
+ log: [],
+ warn: [],
+ error: [],
+ all: [],
+ }
+ function handleOutput(method: Console) {
+ return (message: string) => {
+ output[method].push(message)
+ output.all.push(message)
+ }
+ }
+ return {
+ debug: console.debug,
+ info: vi.spyOn(console, 'info').mockImplementation(handleOutput('info')),
+ log: vi.spyOn(console, 'log').mockImplementation(handleOutput('log')),
+ warn: vi.spyOn(console, 'warn').mockImplementation(handleOutput('warn')),
+ error: vi.spyOn(console, 'error').mockImplementation(handleOutput('error')),
+ output,
+ get formatted() {
+ return output.all.join('\n')
+ },
+ }
+}
+
+export async function typecheck(project: string) {
+ try {
+ const result = spawnSync(
+ 'tsc',
+ ['--noEmit', '--target', 'es2021', '--pretty', 'false', '-p', project],
+ {
+ encoding: 'utf-8',
+ stdio: 'pipe',
+ },
+ )
+ if (result.error) throw result.error
+ if (result.status !== 0)
+ throw new Error(`Failed with code ${result.status}`)
+ if (result.signal) throw new Error('Process terminated by signal')
+ return result.stdout
+ } catch (error) {
+ throw new Error(
+ (error as Error).message.replaceAll(
+ path.dirname(project),
+ '/path/to/project',
+ ),
+ )
+ }
+}
+
+export const baseUrl = 'https://api.etherscan.io/v2/api'
+export const apiKey = 'abc'
+export const invalidApiKey = 'xyz'
+export const address = '0xaf0326d92b97df1221759476b072abfd8084f9be'
+export const proxyAddress = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'
+export const implementationAddress =
+ '0x43506849d7c04f9138d1a2050bbf3a0c054402dd'
+export const unverifiedContractAddress =
+ '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'
+export const timeoutAddress = '0xecb504d39723b0be0e3a9aa33d646642d1051ee1'
+
+export const handlers = [
+ http.get(baseUrl, async ({ request }) => {
+ const url = new URL(request.url)
+ const search = url.search.replace(/^\?chainId=\d&/, '?')
+
+ if (
+ search ===
+ `?module=contract&action=getabi&address=${unverifiedContractAddress}&apikey=${apiKey}`
+ )
+ return HttpResponse.json({
+ status: '0',
+ message: 'NOTOK',
+ result: 'Contract source code not verified',
+ })
+
+ if (
+ search ===
+ `?module=contract&action=getabi&address=${timeoutAddress}&apikey=${invalidApiKey}`
+ )
+ return HttpResponse.json({
+ status: '0',
+ message: 'NOTOK',
+ result: 'Invalid API Key',
+ })
+
+ if (
+ search ===
+ `?module=contract&action=getabi&address=${address}&apikey=${apiKey}`
+ )
+ return HttpResponse.json({
+ status: '1',
+ message: 'OK',
+ result:
+ '[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]',
+ })
+
+ if (
+ search ===
+ `?module=contract&action=getabi&address=${timeoutAddress}&apikey=${apiKey}`
+ ) {
+ await new Promise((resolve) => setTimeout(resolve, 10_000))
+ return HttpResponse.json({})
+ }
+
+ if (
+ search ===
+ `?module=contract&action=getabi&address=${implementationAddress}&apikey=${apiKey}`
+ )
+ return HttpResponse.json({
+ status: '1',
+ message: 'OK',
+ result:
+ '[{"constant":false,"inputs":[{"name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newImplementation","type":"address"},{"name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_implementation","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousAdmin","type":"address"},{"indexed":false,"name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}]',
+ })
+
+ if (
+ search ===
+ `?module=contract&action=getsourcecode&address=${proxyAddress}&apikey=${apiKey}`
+ )
+ return HttpResponse.json({
+ status: '1',
+ message: 'OK',
+ result: [
+ {
+ SourceCode: '...',
+ ABI: '[{"constant":false,"inputs":[{"name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newImplementation","type":"address"},{"name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_implementation","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousAdmin","type":"address"},{"indexed":false,"name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"implementation","type":"address"}],"name":"Upgraded","type":"event"}]',
+ ContractName: 'FiatTokenProxy',
+ CompilerVersion: 'v0.4.24+commit.e67f0147',
+ OptimizationUsed: '0',
+ Runs: '200',
+ ConstructorArguments:
+ '0000000000000000000000000882477e7895bdc5cea7cb1552ed914ab157fe56',
+ EVMVersion: 'Default',
+ Library: '',
+ LicenseType: '',
+ Proxy: '1',
+ Implementation: '0x43506849d7c04f9138d1a2050bbf3a0c054402dd',
+ SwarmSource:
+ 'bzzr://a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed24',
+ },
+ ],
+ })
+
+ if (
+ search ===
+ `?module=contract&action=getsourcecode&address=${address}&apikey=${apiKey}`
+ )
+ return HttpResponse.json({
+ status: '1',
+ message: 'OK',
+ result: [
+ {
+ SourceCode: '...',
+ ABI: '[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]',
+ ContractName: 'WagmiMintExample',
+ CompilerVersion: 'v0.8.11+commit.d7f03943',
+ OptimizationUsed: '1',
+ Runs: '10000',
+ ConstructorArguments: '',
+ EVMVersion: 'Default',
+ Library: '',
+ LicenseType: '',
+ Proxy: '0',
+ Implementation: '',
+ SwarmSource: '',
+ },
+ ],
+ })
+
+ throw new Error(`Unhandled request: ${search}`)
+ }),
+]
diff --git a/wagmi-project/packages/cli/tsconfig.build.json b/wagmi-project/packages/cli/tsconfig.build.json
new file mode 100644
index 000000000..3a046d812
--- /dev/null
+++ b/wagmi-project/packages/cli/tsconfig.build.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "include": ["src/**/*.ts"],
+ "exclude": ["src/**/*.test.ts"],
+ "compilerOptions": {
+ "sourceMap": true,
+ "types": ["@types/node"]
+ }
+}
diff --git a/wagmi-project/packages/cli/tsconfig.json b/wagmi-project/packages/cli/tsconfig.json
new file mode 100644
index 000000000..4054dee11
--- /dev/null
+++ b/wagmi-project/packages/cli/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "./tsconfig.build.json",
+ "include": ["src/**/*.ts", "test/**/*.ts", "types/**/*.d.ts"],
+ "exclude": []
+}
diff --git a/wagmi-project/packages/cli/types/fixturez.d.ts b/wagmi-project/packages/cli/types/fixturez.d.ts
new file mode 100644
index 000000000..f96282756
--- /dev/null
+++ b/wagmi-project/packages/cli/types/fixturez.d.ts
@@ -0,0 +1,18 @@
+declare module 'fixturez' {
+ interface FixturezOpts {
+ glob?: string
+ cleanup?: boolean
+ root?: string
+ }
+
+ interface Fixturez {
+ find(basename: string): string
+ copy(basename: string): string
+ temp(): string
+ cleanup(): void
+ }
+
+ function fixturez(dirname: string, opts?: FixturezOpts): Fixturez
+
+ export = fixturez
+}
diff --git a/wagmi-project/packages/connectors/CHANGELOG.md b/wagmi-project/packages/connectors/CHANGELOG.md
new file mode 100644
index 000000000..c67e25dcb
--- /dev/null
+++ b/wagmi-project/packages/connectors/CHANGELOG.md
@@ -0,0 +1,1640 @@
+# @wagmi/connectors
+
+## 5.8.3
+
+### Patch Changes
+
+- [#4660](https://github.com/wevm/wagmi/pull/4660) [`42b1fed58e9ac09da0f8ebf3e9271f98a707aaac`](https://github.com/wevm/wagmi/commit/42b1fed58e9ac09da0f8ebf3e9271f98a707aaac) Thanks [@ganchoradkov](https://github.com/ganchoradkov)! - Updated `@walletconnect/ethereum-provider` version to `2.20.2`
+
+## 5.8.2
+
+### Patch Changes
+
+- Updated dependencies [[`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66), [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57)]:
+ - @wagmi/core@2.17.2
+
+## 5.8.1
+
+### Patch Changes
+
+- Updated dependencies [[`01f64e64fa4f85cdd30023903f972f4f9023681f`](https://github.com/wevm/wagmi/commit/01f64e64fa4f85cdd30023903f972f4f9023681f)]:
+ - @wagmi/core@2.17.1
+
+## 5.8.0
+
+### Minor Changes
+
+- [#4644](https://github.com/wevm/wagmi/pull/4644) [`cc5517ff6880bb630f1b201930acc20dd1a0b451`](https://github.com/wevm/wagmi/commit/cc5517ff6880bb630f1b201930acc20dd1a0b451) Thanks [@lukaisailovic](https://github.com/lukaisailovic)! - Updated `@walletconnect/etherereum-provider` to `2.20.0`.
+
+## 5.7.13
+
+### Patch Changes
+
+- [#4622](https://github.com/wevm/wagmi/pull/4622) [`88427b2bcd13ec375ef519e9ad1ccffef9f02a7b`](https://github.com/wevm/wagmi/commit/88427b2bcd13ec375ef519e9ad1ccffef9f02a7b) Thanks [@dan1kov](https://github.com/dan1kov)! - Added `rdns` property to Coinbase Wallet v3 connector
+
+- [#4605](https://github.com/wevm/wagmi/pull/4605) [`3f8b2edc4f237cccff1009bcef03d51ca27a7324`](https://github.com/wevm/wagmi/commit/3f8b2edc4f237cccff1009bcef03d51ca27a7324) Thanks [@chybisov](https://github.com/chybisov)! - Bumped `@safe-global/safe-apps-provider` version to `0.18.6`.
+
+- Updated dependencies [[`799ee4d4b23c2ecd64e3f3668e67634e81939719`](https://github.com/wevm/wagmi/commit/799ee4d4b23c2ecd64e3f3668e67634e81939719)]:
+ - @wagmi/core@2.17.0
+
+## 5.7.12
+
+### Patch Changes
+
+- [#4608](https://github.com/wevm/wagmi/pull/4608) [`b59c024b23c69f5459b17390531207cfdf126ce4`](https://github.com/wevm/wagmi/commit/b59c024b23c69f5459b17390531207cfdf126ce4) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.
+
+## 5.7.11
+
+### Patch Changes
+
+- Updated dependencies [[`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0)]:
+ - @wagmi/core@2.16.7
+
+## 5.7.10
+
+### Patch Changes
+
+- [#4573](https://github.com/wevm/wagmi/pull/4573) [`e944812ebc234a72c1417b77cff341166f5e0fef`](https://github.com/wevm/wagmi/commit/e944812ebc234a72c1417b77cff341166f5e0fef) Thanks [@ganchoradkov](https://github.com/ganchoradkov)! - updated `@walletconnect/ethereum-provider` to `2.19.1`
+
+- Updated dependencies [[`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b)]:
+ - @wagmi/core@2.16.6
+
+## 5.7.9
+
+### Patch Changes
+
+- [#4571](https://github.com/wevm/wagmi/pull/4571) [`5b7101fddb61df56e34b2e02b46bc409e496eaf9`](https://github.com/wevm/wagmi/commit/5b7101fddb61df56e34b2e02b46bc409e496eaf9) Thanks [@ganchoradkov](https://github.com/ganchoradkov)! - Updated `@walletconnect/ethereum-provider` to `2.19.0`
+
+## 5.7.8
+
+### Patch Changes
+
+- Updated dependencies [[`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c)]:
+ - @wagmi/core@2.16.5
+
+## 5.7.7
+
+### Patch Changes
+
+- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.
+
+- Updated dependencies [[`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec)]:
+ - @wagmi/core@2.16.4
+
+## 5.7.6
+
+### Patch Changes
+
+- [#4524](https://github.com/wevm/wagmi/pull/4524) [`639952c97f0fe3927106f42d3c9f7f366cdf7f7a`](https://github.com/wevm/wagmi/commit/639952c97f0fe3927106f42d3c9f7f366cdf7f7a) Thanks [@chakra-guy](https://github.com/chakra-guy)! - Updated MetaMask SDK.
+
+- [#4525](https://github.com/wevm/wagmi/pull/4525) [`5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766`](https://github.com/wevm/wagmi/commit/5aa2c095f7bfb6dfcf91c6945c3e1f9c9dd05766) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added Phantom flag to Injected Connector.
+
+## 5.7.5
+
+### Patch Changes
+
+- [#4512](https://github.com/wevm/wagmi/pull/4512) [`a257e8d4f97431a4af872cda1817b4ae17c7bbed`](https://github.com/wevm/wagmi/commit/a257e8d4f97431a4af872cda1817b4ae17c7bbed) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask switchChain/addChain handling.
+
+## 5.7.4
+
+### Patch Changes
+
+- [#4505](https://github.com/wevm/wagmi/pull/4505) [`c8a257e0f6d2ece013b873895c35769a8a804fdc`](https://github.com/wevm/wagmi/commit/c8a257e0f6d2ece013b873895c35769a8a804fdc) Thanks [@chakra-guy](https://github.com/chakra-guy)! - Bumped Metamask SDK Version (changes include [bug fixes and minor changes](https://github.com/MetaMask/metamask-sdk/pull/1194)).
+
+## 5.7.3
+
+### Patch Changes
+
+- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.
+
+- Updated dependencies [[`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8)]:
+ - @wagmi/core@2.16.3
+
+## 5.7.2
+
+### Patch Changes
+
+- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.
+
+- Updated dependencies [[`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6)]:
+ - @wagmi/core@2.16.2
+
+## 5.7.1
+
+### Patch Changes
+
+- [#4471](https://github.com/wevm/wagmi/pull/4471) [`9c8c35a3b829f2c58edcd3a29e2dcd99974d7470`](https://github.com/wevm/wagmi/commit/9c8c35a3b829f2c58edcd3a29e2dcd99974d7470) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Improved MetaMask chain switching behavior.
+
+- Updated dependencies [[`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f)]:
+ - @wagmi/core@2.16.1
+
+## 5.7.0
+
+### Minor Changes
+
+- [#4440](https://github.com/wevm/wagmi/pull/4440) [`e3f63a02c1f7d80481804584f262bc98dab0400d`](https://github.com/wevm/wagmi/commit/e3f63a02c1f7d80481804584f262bc98dab0400d) Thanks [@johanneskares](https://github.com/johanneskares)! - Added Coinbase Smart Wallet "Instant Onboarding" mode to `coinbaseWallet`.
+
+## 5.6.2
+
+### Patch Changes
+
+- [#4437](https://github.com/wevm/wagmi/pull/4437) [`adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85`](https://github.com/wevm/wagmi/commit/adf2253b10c6d4fc583e4bc9f01a8ef5ca267c85) Thanks [@chybisov](https://github.com/chybisov)! - Bumped `@safe-global/safe-apps-provider` version to `0.18.5`.
+
+## 5.6.1
+
+### Patch Changes
+
+- [#4458](https://github.com/wevm/wagmi/pull/4458) [`987404f590c1d29ebb3cb68928f5e54aa032793d`](https://github.com/wevm/wagmi/commit/987404f590c1d29ebb3cb68928f5e54aa032793d) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask internal metadata handling.
+
+## 5.6.0
+
+### Minor Changes
+
+- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added narrowing to `config.connectors`.
+
+### Patch Changes
+
+- [#4456](https://github.com/wevm/wagmi/pull/4456) [`8b0726c1106fce88b782e676498eabf0718b2619`](https://github.com/wevm/wagmi/commit/8b0726c1106fce88b782e676498eabf0718b2619) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Bumped MetaMask SDK and fixed internal metadata handling.
+- Updated dependencies [[`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52), [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227)]:
+ - @wagmi/core@2.16.0
+
+## 5.5.3
+
+### Patch Changes
+
+- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.
+
+- Updated dependencies [[`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc)]:
+ - @wagmi/core@2.15.2
+
+## 5.5.2
+
+### Patch Changes
+
+- [#4422](https://github.com/wevm/wagmi/pull/4422) [`e563ef69130a511fd6f3f72ed4cd4fbe1390541f`](https://github.com/wevm/wagmi/commit/e563ef69130a511fd6f3f72ed4cd4fbe1390541f) Thanks [@abretonc7s](https://github.com/abretonc7s)! - Bumped MetaMask SDK.
+
+## 5.5.1
+
+### Patch Changes
+
+- Updated dependencies [[`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693)]:
+ - @wagmi/core@2.15.1
+
+## 5.5.0
+
+### Minor Changes
+
+- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.
+
+### Patch Changes
+
+- Updated dependencies [[`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141)]:
+ - @wagmi/core@2.15.0
+
+## 5.4.0
+
+### Minor Changes
+
+- [#4409](https://github.com/wevm/wagmi/pull/4409) [`7ca62b44cd997d48f92c2b81343726a5908aa00b`](https://github.com/wevm/wagmi/commit/7ca62b44cd997d48f92c2b81343726a5908aa00b) Thanks [@fan-zhang-sv](https://github.com/fan-zhang-sv)! - Added `preference` object for Coinbase Wallet connector.
+
+## 5.3.10
+
+### Patch Changes
+
+- [#4406](https://github.com/wevm/wagmi/pull/4406) [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3) Thanks [@tmm](https://github.com/tmm)! - Added additional RDNS to MetaMask Connector.
+
+- Updated dependencies [[`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3)]:
+ - @wagmi/core@2.14.6
+
+## 5.3.9
+
+### Patch Changes
+
+- [`b12a04eeec985c48d2feac94b011d41fb29ca23e`](https://github.com/wevm/wagmi/commit/b12a04eeec985c48d2feac94b011d41fb29ca23e) Thanks [@tmm](https://github.com/tmm)! - Bumped Coinbase Wallet SDK version.
+
+## 5.3.8
+
+### Patch Changes
+
+- [#4390](https://github.com/wevm/wagmi/pull/4390) [`dac62dc99a0679fa632a0fae49873d6053d06b35`](https://github.com/wevm/wagmi/commit/dac62dc99a0679fa632a0fae49873d6053d06b35) Thanks [@chybisov](https://github.com/chybisov)! - Bumped Safe Apps Provider version.
+
+- Updated dependencies [[`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646)]:
+ - @wagmi/core@2.14.5
+
+## 5.3.7
+
+### Patch Changes
+
+- Updated dependencies [[`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743)]:
+ - @wagmi/core@2.14.4
+
+## 5.3.6
+
+### Patch Changes
+
+- [#4385](https://github.com/wevm/wagmi/pull/4385) [`7558ff3133c11bc4c49473d08ee9a47eaa12df5b`](https://github.com/wevm/wagmi/commit/7558ff3133c11bc4c49473d08ee9a47eaa12df5b) Thanks [@cb-jake](https://github.com/cb-jake)! - Bumped Coinbase Wallet SDK version.
+
+## 5.3.5
+
+### Patch Changes
+
+- [`7fe78f2d09778fc01fd0cffe85ba198e64999275`](https://github.com/wevm/wagmi/commit/7fe78f2d09778fc01fd0cffe85ba198e64999275) Thanks [@tmm](https://github.com/tmm)! - Fixed MetaMask connector not returning provider in some cases.
+
+- Updated dependencies [[`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7)]:
+ - @wagmi/core@2.14.3
+
+## 5.3.4
+
+### Patch Changes
+
+- [#4371](https://github.com/wevm/wagmi/pull/4371) [`b6861a4c378dab78d8751ae0ac2aa425f3c24b8f`](https://github.com/wevm/wagmi/commit/b6861a4c378dab78d8751ae0ac2aa425f3c24b8f) Thanks [@iceanddust](https://github.com/iceanddust)! - Fixed Safe connector not working in some Vite apps
+
+- Updated dependencies [[`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c), [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0)]:
+ - @wagmi/core@2.14.2
+
+## 5.3.3
+
+### Patch Changes
+
+- [#4362](https://github.com/wevm/wagmi/pull/4362) [`83c6d16b7d6dddfa6bda036e04f00ec313c6248c`](https://github.com/wevm/wagmi/commit/83c6d16b7d6dddfa6bda036e04f00ec313c6248c) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Fixed MetaMask connector internal logic.
+
+## 5.3.2
+
+### Patch Changes
+
+- [#4357](https://github.com/wevm/wagmi/pull/4357) [`8970cc51398e1ac713435533096215c6d31ffdf9`](https://github.com/wevm/wagmi/commit/8970cc51398e1ac713435533096215c6d31ffdf9) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.
+
+## 5.3.1
+
+### Patch Changes
+
+- Updated dependencies [[`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702), [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a)]:
+ - @wagmi/core@2.14.1
+
+## 5.3.0
+
+### Minor Changes
+
+- [#4343](https://github.com/wevm/wagmi/pull/4343) [`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d) Thanks [@tmm](https://github.com/tmm)! - Added `rdns` property to connector interface. This is used to filter out duplicate [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) injected providers when [`createConfig#multiInjectedProviderDiscovery`](https://wagmi.sh/core/api/createConfig#multiinjectedproviderdiscovery) is enabled and `createConfig#connectors` already matches EIP-6963 providers' `rdns` property.
+
+### Patch Changes
+
+- Updated dependencies [[`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d)]:
+ - @wagmi/core@2.14.0
+
+## 5.2.2
+
+### Patch Changes
+
+- [#4347](https://github.com/wevm/wagmi/pull/4347) [`5ae49af590ff168426c9c283d54c34ae5148fcd9`](https://github.com/wevm/wagmi/commit/5ae49af590ff168426c9c283d54c34ae5148fcd9) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added workaround for MetaMask mobile sometimes disconnecting.
+
+- [#4350](https://github.com/wevm/wagmi/pull/4350) [`f3182b22e6e454d9bd74f1b940ef34431fd9555d`](https://github.com/wevm/wagmi/commit/f3182b22e6e454d9bd74f1b940ef34431fd9555d) Thanks [@abretonc7s](https://github.com/abretonc7s)! - Updated MetaMask SDK.
+
+- Updated dependencies [[`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703)]:
+ - @wagmi/core@2.13.9
+
+## 5.2.1
+
+### Patch Changes
+
+- [#4345](https://github.com/wevm/wagmi/pull/4345) [`91a40f2db08e3a91db421b8732a5511a1e6c88fd`](https://github.com/wevm/wagmi/commit/91a40f2db08e3a91db421b8732a5511a1e6c88fd) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK.
+
+## 5.2.0
+
+### Minor Changes
+
+- [#4337](https://github.com/wevm/wagmi/pull/4337) [`34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4`](https://github.com/wevm/wagmi/commit/34a0c3b7eea778aee7c27f7ace5e4b2be4e8a0a4) Thanks [@tmm](https://github.com/tmm)! - Added "Connect and Sign" behavior to MetaMask Connector.
+
+## 5.1.15
+
+### Patch Changes
+
+- [`3b2123664b7ac66848390739e855c3b9702ab60c`](https://github.com/wevm/wagmi/commit/3b2123664b7ac66848390739e855c3b9702ab60c) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Provider.
+
+## 5.1.14
+
+### Patch Changes
+
+- [#4207](https://github.com/wevm/wagmi/pull/4207) [`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57) Thanks [@Smert](https://github.com/Smert)! - Updated chain switch listener for `injected` and `metaMask` to be more robust.
+
+- Updated dependencies [[`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57)]:
+ - @wagmi/core@2.13.8
+
+## 5.1.13
+
+### Patch Changes
+
+- Updated dependencies [[`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6)]:
+ - @wagmi/core@2.13.7
+
+## 5.1.12
+
+### Patch Changes
+
+- Updated dependencies [[`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1)]:
+ - @wagmi/core@2.13.6
+
+## 5.1.11
+
+### Patch Changes
+
+- [#4271](https://github.com/wevm/wagmi/pull/4271) [`82404c960e04c83e0bae6e1e12459ef9debf9554`](https://github.com/wevm/wagmi/commit/82404c960e04c83e0bae6e1e12459ef9debf9554) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK.
+
+- [#4227](https://github.com/wevm/wagmi/pull/4227) [`d07ad7f63a018256908a673d078aaf79e47ac703`](https://github.com/wevm/wagmi/commit/d07ad7f63a018256908a673d078aaf79e47ac703) Thanks [@xianchenxc](https://github.com/xianchenxc)! - Fixed MetaMask Connector throwing error after switching to a chain that was just added via `'wallet_addEthereumChain'`.
+
+## 5.1.10
+
+### Patch Changes
+
+- [#4255](https://github.com/wevm/wagmi/pull/4255) [`81de006e66121a18c61945c1f9b8426c83a5713c`](https://github.com/wevm/wagmi/commit/81de006e66121a18c61945c1f9b8426c83a5713c) Thanks [@tomiir](https://github.com/tomiir)! - Bumped `@walletconnect/ethereum-provider` from version `2.15.3` to version `2.16.1`.
+
+- Updated dependencies [[`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb)]:
+ - @wagmi/core@2.13.5
+
+## 5.1.9
+
+### Patch Changes
+
+- [#4243](https://github.com/wevm/wagmi/pull/4243) [`21bd0e473d374cbbd7a01bececa6022d529026ba`](https://github.com/wevm/wagmi/commit/21bd0e473d374cbbd7a01bececa6022d529026ba) Thanks [@tomiir](https://github.com/tomiir)! - Bumped `@walletconnect/ethereum-provider` from version `2.15.2` to version `2.15.3`
+
+- [#4251](https://github.com/wevm/wagmi/pull/4251) [`5c89c6853e616437a3be2b019db895451fecfb3c`](https://github.com/wevm/wagmi/commit/5c89c6853e616437a3be2b019db895451fecfb3c) Thanks [@tmm](https://github.com/tmm)! - Bumped MM SDK.
+
+## 5.1.8
+
+### Patch Changes
+
+- [`b580ad4edff1721e0b9d138cf5ae2ec74d2374c7`](https://github.com/wevm/wagmi/commit/b580ad4edff1721e0b9d138cf5ae2ec74d2374c7) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Provider.
+
+## 5.1.7
+
+### Patch Changes
+
+- [#4213](https://github.com/wevm/wagmi/pull/4213) [`91fd81a068789c5020e891f539bcad8f54a7a52f`](https://github.com/wevm/wagmi/commit/91fd81a068789c5020e891f539bcad8f54a7a52f) Thanks [@tomiir](https://github.com/tomiir)! - Updated `@walletconnect/ethereum-provider` from version `2.15.0` to version `2.15.1`.
+
+## 5.1.6
+
+### Patch Changes
+
+- [#4208](https://github.com/wevm/wagmi/pull/4208) [`3168616298cbb6135d0ffda771cba4126e83eba8`](https://github.com/wevm/wagmi/commit/3168616298cbb6135d0ffda771cba4126e83eba8) Thanks [@tomiir](https://github.com/tomiir)! - Updated WalletConnect Ethereum Provider version from `2.14.0` to `2.15.0`.
+
+- [#4211](https://github.com/wevm/wagmi/pull/4211) [`d7608ef9a79459465dc8c06a2ab740465c881907`](https://github.com/wevm/wagmi/commit/d7608ef9a79459465dc8c06a2ab740465c881907) Thanks [@tmm](https://github.com/tmm)! - Added default name for MetaMask Connector.
+
+## 5.1.5
+
+### Patch Changes
+
+- Updated dependencies [[`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953)]:
+ - @wagmi/core@2.13.4
+
+## 5.1.4
+
+### Patch Changes
+
+- Updated dependencies [[`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4)]:
+ - @wagmi/core@2.13.3
+
+## 5.1.3
+
+### Patch Changes
+
+- Updated dependencies [[`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594)]:
+ - @wagmi/core@2.13.2
+
+## 5.1.2
+
+### Patch Changes
+
+- [`abb490dac4f0f02f46cb0878e7ca9a0db6aada56`](https://github.com/wevm/wagmi/commit/abb490dac4f0f02f46cb0878e7ca9a0db6aada56) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK version.
+
+- [`28e0e5c9a4f856583f9d36a807502bd51a0c6ec2`](https://github.com/wevm/wagmi/commit/28e0e5c9a4f856583f9d36a807502bd51a0c6ec2) Thanks [@tmm](https://github.com/tmm)! - Bumped WalletConnect Ethereum Provider version.
+
+## 5.1.1
+
+### Patch Changes
+
+- Updated dependencies [[`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45)]:
+ - @wagmi/core@2.13.1
+
+## 5.1.0
+
+### Minor Changes
+
+- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.
+
+### Patch Changes
+
+- Updated dependencies [[`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0)]:
+ - @wagmi/core@2.13.0
+
+## 5.0.26
+
+### Patch Changes
+
+- [`8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5`](https://github.com/wevm/wagmi/commit/8d81df5cc884d0a210dedd3c1ea0e2e9e52b83c5) Thanks [@tmm](https://github.com/tmm)! - Fixed `metaMask` connector switch chain issue.
+
+- Updated dependencies [[`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20)]:
+ - @wagmi/core@2.12.2
+
+## 5.0.25
+
+### Patch Changes
+
+- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.
+
+- Updated dependencies [[`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b)]:
+ - @wagmi/core@2.12.1
+
+## 5.0.24
+
+### Patch Changes
+
+- Updated dependencies [[`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc)]:
+ - @wagmi/core@2.12.0
+
+## 5.0.23
+
+### Patch Changes
+
+- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.
+
+- Updated dependencies [[`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb), [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d)]:
+ - @wagmi/core@2.11.8
+
+## 5.0.22
+
+### Patch Changes
+
+- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.
+
+- Updated dependencies [[`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e)]:
+ - @wagmi/core@2.11.7
+
+## 5.0.21
+
+### Patch Changes
+
+- [#4094](https://github.com/wevm/wagmi/pull/4094) [`ff0760b5900114bcfdf420a9fba3cc278ac95afe`](https://github.com/wevm/wagmi/commit/ff0760b5900114bcfdf420a9fba3cc278ac95afe) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK to fix `metaMask` connector error bubbling.
+
+- Updated dependencies [[`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad)]:
+ - @wagmi/core@2.11.6
+
+## 5.0.20
+
+### Patch Changes
+
+- [`43fa971d34cac57fa5a2898ad4d839b95d7af37c`](https://github.com/wevm/wagmi/commit/43fa971d34cac57fa5a2898ad4d839b95d7af37c) Thanks [@tmm](https://github.com/tmm)! - Bumped Coinbase Wallet SDK and fixed `metaMask` connector hang on mobile.
+
+## 5.0.19
+
+### Patch Changes
+
+- [#4083](https://github.com/wevm/wagmi/pull/4083) [`b7ad208030d9f2e3f89912ff76b16cdbd848feda`](https://github.com/wevm/wagmi/commit/b7ad208030d9f2e3f89912ff76b16cdbd848feda) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK
+
+## 5.0.18
+
+### Patch Changes
+
+- [#4081](https://github.com/wevm/wagmi/pull/4081) [`44d24620c9e3957f3245d14d6a042736371df70b`](https://github.com/wevm/wagmi/commit/44d24620c9e3957f3245d14d6a042736371df70b) Thanks [@tmm](https://github.com/tmm)! - Bumped MetaMask SDK
+
+## 5.0.17
+
+### Patch Changes
+
+- Updated dependencies [[`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5)]:
+ - @wagmi/core@2.11.5
+
+## 5.0.16
+
+### Patch Changes
+
+- [#4071](https://github.com/wevm/wagmi/pull/4071) [`02c38c28d1aa0ad7a61c33775de603ed974c5c1b`](https://github.com/wevm/wagmi/commit/02c38c28d1aa0ad7a61c33775de603ed974c5c1b) Thanks [@omridan159](https://github.com/omridan159)! - Bumped MetaMask SDK
+
+- Updated dependencies [[`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6)]:
+ - @wagmi/core@2.11.4
+
+## 5.0.15
+
+### Patch Changes
+
+- Updated dependencies [[`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798)]:
+ - @wagmi/core@2.11.3
+
+## 5.0.14
+
+### Patch Changes
+
+- Updated dependencies [[`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522)]:
+ - @wagmi/core@2.11.2
+
+## 5.0.13
+
+### Patch Changes
+
+- [`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17) Thanks [@tmm](https://github.com/tmm)! - Reverted internal module loading utility.
+
+- Updated dependencies [[`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17)]:
+ - @wagmi/core@2.11.1
+
+## 5.0.12
+
+### Patch Changes
+
+- Updated dependencies [[`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14), [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822)]:
+ - @wagmi/core@2.11.0
+
+## 5.0.11
+
+### Patch Changes
+
+- [#4020](https://github.com/wevm/wagmi/pull/4020) [`e3b124ce414b8fd1b2214e2c5a28dc72158a13d1`](https://github.com/wevm/wagmi/commit/e3b124ce414b8fd1b2214e2c5a28dc72158a13d1) Thanks [@tmm](https://github.com/tmm)! - Added reconnection support to `metaMask` on mobile and use deeplinks by default.
+
+- Updated dependencies [[`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe), [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5)]:
+ - @wagmi/core@2.10.6
+
+## 5.0.10
+
+### Patch Changes
+
+- [`560952acd4bfe33db6c7c07b35c613cef278677c`](https://github.com/wevm/wagmi/commit/560952acd4bfe33db6c7c07b35c613cef278677c) Thanks [@tmm](https://github.com/tmm)! - Captured Coinbase Smart Wallet error when closing window as EIP-1193 `4001` error.
+
+## 5.0.9
+
+### Patch Changes
+
+- [`32cdd7b7dc5aff916c040628519562c3a99d418d`](https://github.com/wevm/wagmi/commit/32cdd7b7dc5aff916c040628519562c3a99d418d) Thanks [@tmm](https://github.com/tmm)! - Bumped `@metamask/sdk` to remove peer dependency install warning.
+
+## 5.0.8
+
+### Patch Changes
+
+- [#3997](https://github.com/wevm/wagmi/pull/3997) [`c1952d1ff7f0a491dc88595a49159451b07b5621`](https://github.com/wevm/wagmi/commit/c1952d1ff7f0a491dc88595a49159451b07b5621) Thanks [@nateReiners](https://github.com/nateReiners)! - Bumped Coinbase Wallet SDK.
+
+## 5.0.7
+
+### Patch Changes
+
+- Updated dependencies [[`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898)]:
+ - @wagmi/core@2.10.5
+
+## 5.0.6
+
+### Patch Changes
+
+- Updated dependencies [[`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968)]:
+ - @wagmi/core@2.10.4
+
+## 5.0.5
+
+### Patch Changes
+
+- [#3979](https://github.com/wevm/wagmi/pull/3979) [`70dd28669dd8d2ce08217cd02e29a8fbba7a08d4`](https://github.com/wevm/wagmi/commit/70dd28669dd8d2ce08217cd02e29a8fbba7a08d4) Thanks [@tmm](https://github.com/tmm)! - Fixed `walletConnect` connector.
+
+## 5.0.4
+
+### Patch Changes
+
+- [#3972](https://github.com/wevm/wagmi/pull/3972) [`be9e1b8a9818b92eb0654a20d9471e9e39329e7e`](https://github.com/wevm/wagmi/commit/be9e1b8a9818b92eb0654a20d9471e9e39329e7e) Thanks [@nateReiners](https://github.com/nateReiners)! - Bumped Coinbase Wallet SDK.
+
+## 5.0.3
+
+### Patch Changes
+
+- [#3962](https://github.com/wevm/wagmi/pull/3962) [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c) Thanks [@tmm](https://github.com/tmm)! - Added timeout to `getInfo` called in `safe` connector since [non-Safe App iFrames cause it to not resolve](https://github.com/safe-global/safe-apps-sdk/issues/263#issuecomment-1029835840).
+
+- Updated dependencies [[`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c)]:
+ - @wagmi/core@2.10.3
+
+## 5.0.2
+
+### Patch Changes
+
+- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.
+
+- Updated dependencies [[`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a)]:
+ - @wagmi/core@2.10.2
+
+## 5.0.1
+
+### Patch Changes
+
+- Bumped versions.
+
+- Updated dependencies []:
+ - @wagmi/core@2.10.1
+
+## 5.0.0
+
+### Major Changes
+
+- [#3928](https://github.com/wevm/wagmi/pull/3928) [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** Updated default Coinbase SDK in `coinbaseWallet` Connector to v4.x.
+
+ Added a `version` property (defaults to `'4'`) to the `coinbaseWallet` Connector to target a version of the Coinbase SDK:
+
+ ```diff
+ coinbaseWallet({
+ + version: '3' | '4',
+ })
+ ```
+
+ If `headlessMode` property is set to `true`, then the Connector will target v3 of the Coinbase SDK.
+
+ The following properties are removed in v4 of the `coinbaseWallet` Connector:
+
+ - `chainId`
+ - `darkMode`
+ - `diagnosticLogger`
+ - `enableMobileDeepLink`
+ - `jsonRpcUrl`
+ - `linkApiUrl`
+ - `overrideIsCoinbaseBrowser`
+ - `overrideIsCoinbaseWallet`
+ - `overrideIsMetaMask`
+ - `reloadOnDisconnect`
+ - `uiConstructor`
+
+ Consumers can still use the above properties in v3 by passing `version: '3'` to the Connector. However, please note that v3 of the Coinbase SDK is deprecated and will be removed in a future release.
+
+### Patch Changes
+
+- Updated dependencies [[`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1)]:
+ - @wagmi/core@2.10.0
+
+## 4.3.10
+
+### Patch Changes
+
+- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.
+
+- Updated dependencies [[`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67)]:
+ - @wagmi/core@2.9.8
+
+## 4.3.9
+
+### Patch Changes
+
+- [#3924](https://github.com/wevm/wagmi/pull/3924) [`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8) Thanks [@jxom](https://github.com/jxom)! - Refactored `isChainsStale` logic in `walletConnect` connector.
+
+- Updated dependencies [[`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8)]:
+ - @wagmi/core@2.9.7
+
+## 4.3.8
+
+### Patch Changes
+
+- [#3917](https://github.com/wevm/wagmi/pull/3917) [`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b) Thanks [@jxom](https://github.com/jxom)! - Updated `@metamask/sdk`.
+
+- Updated dependencies [[`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b)]:
+ - @wagmi/core@2.9.6
+
+## 4.3.7
+
+### Patch Changes
+
+- Updated dependencies [[`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85)]:
+ - @wagmi/core@2.9.5
+
+## 4.3.6
+
+### Patch Changes
+
+- Updated dependencies [[`e6139a97c4b8804d734b1547b5e3921ce01fbe24`](https://github.com/wevm/wagmi/commit/e6139a97c4b8804d734b1547b5e3921ce01fbe24)]:
+ - @wagmi/core@2.9.4
+
+## 4.3.5
+
+### Patch Changes
+
+- [#3904](https://github.com/wevm/wagmi/pull/3904) [`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.
+
+- Updated dependencies [[`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e)]:
+ - @wagmi/core@2.9.3
+
+## 4.3.4
+
+### Patch Changes
+
+- [#3902](https://github.com/wevm/wagmi/pull/3902) [`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4) Thanks [@jxom](https://github.com/jxom)! - Made third-party SDK imports type-only.
+
+- Updated dependencies [[`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4)]:
+ - @wagmi/core@2.9.2
+
+## 4.3.3
+
+### Patch Changes
+
+- Updated dependencies [[`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a)]:
+ - @wagmi/core@2.9.1
+
+## 4.3.2
+
+### Patch Changes
+
+- Updated dependencies [[`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2)]:
+ - @wagmi/core@2.9.0
+
+## 4.3.1
+
+### Patch Changes
+
+- Updated dependencies [[`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc)]:
+ - @wagmi/core@2.8.1
+
+## 4.3.0
+
+### Minor Changes
+
+- [#3868](https://github.com/wevm/wagmi/pull/3868) [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e) Thanks [@jxom](https://github.com/jxom)! - Added `supportsSimulation` property to connectors that indicates if the connector's wallet supports contract simulation.
+
+### Patch Changes
+
+- Updated dependencies [[`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de), [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e)]:
+ - @wagmi/core@2.8.0
+
+## 4.2.0
+
+### Minor Changes
+
+- [#3857](https://github.com/wevm/wagmi/pull/3857) [`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e) Thanks [@tmm](https://github.com/tmm)! - Added `addEthereumChainParameter` to `switchChain`-related methods.
+
+### Patch Changes
+
+- Updated dependencies [[`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e), [`4781a405`](https://github.com/wevm/wagmi/commit/4781a4056d4ffc2c74f96a75429e9b2cd2417ad8), [`400c960b`](https://github.com/wevm/wagmi/commit/400c960b30d701c134850c695ae903a382c29b5b)]:
+ - @wagmi/core@2.7.0
+
+## 4.1.28
+
+### Patch Changes
+
+- [`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2) Thanks [@jxom](https://github.com/jxom)! - Fixed undefined `navigator` issue in MetaMask connector.
+
+- Updated dependencies [[`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2)]:
+ - @wagmi/core@2.6.19
+
+## 4.1.27
+
+### Patch Changes
+
+- [#3848](https://github.com/wevm/wagmi/pull/3848) [`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16) Thanks [@jxom](https://github.com/jxom)! - Updated MetaMask SDK.
+
+- Updated dependencies [[`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16)]:
+ - @wagmi/core@2.6.18
+
+## 4.1.26
+
+### Patch Changes
+
+- Updated dependencies [[`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0)]:
+ - @wagmi/core@2.6.17
+
+## 4.1.25
+
+### Patch Changes
+
+- [#3788](https://github.com/wevm/wagmi/pull/3788) [`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e) Thanks [@tmm](https://github.com/tmm)! - Refactored connectors to remove unnecessarily event listeners.
+
+- Updated dependencies [[`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e)]:
+ - @wagmi/core@2.6.16
+
+## 4.1.24
+
+### Patch Changes
+
+- Updated dependencies [[`b907d5ac`](https://github.com/wevm/wagmi/commit/b907d5ac3a746bcbccc06d1fe78c5bd8f9a7d685)]:
+ - @wagmi/core@2.6.15
+
+## 4.1.23
+
+### Patch Changes
+
+- Updated dependencies [[`b3b54ef1`](https://github.com/wevm/wagmi/commit/b3b54ef179c5fa0d1694d38d4b808549a0550409), [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242), [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f)]:
+ - @wagmi/core@2.6.14
+
+## 4.1.22
+
+### Patch Changes
+
+- Updated dependencies [[`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b)]:
+ - @wagmi/core@2.6.13
+
+## 4.1.21
+
+### Patch Changes
+
+- Updated dependencies [[`a59069e9`](https://github.com/wevm/wagmi/commit/a59069e9fab45dd606bb89a7f829fe94c51a5494), [`0acd3132`](https://github.com/wevm/wagmi/commit/0acd31320f534993af566be5490c2978b6184f66)]:
+ - @wagmi/core@2.6.12
+
+## 4.1.20
+
+### Patch Changes
+
+- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Deprecated `normalizeChainId`. Use `Number` instead.
+
+- Updated dependencies [[`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d)]:
+ - @wagmi/core@2.6.11
+
+## 4.1.19
+
+### Patch Changes
+
+- Updated dependencies [[`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019)]:
+ - @wagmi/core@2.6.10
+
+## 4.1.18
+
+### Patch Changes
+
+- Updated dependencies [[`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6)]:
+ - @wagmi/core@2.6.9
+
+## 4.1.17
+
+### Patch Changes
+
+- Updated dependencies [[`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374)]:
+ - @wagmi/core@2.6.8
+
+## 4.1.16
+
+### Patch Changes
+
+- [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.
+
+- [#3653](https://github.com/wevm/wagmi/pull/3653) [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44) Thanks [@tash-2s](https://github.com/tash-2s)! - Fixed error occurring when adding chains without explorers to MetaMask.
+
+- Updated dependencies [[`b479b5e8`](https://github.com/wevm/wagmi/commit/b479b5e8a5866cba792862f22e6352c4fb566137), [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1), [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e), [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44)]:
+ - @wagmi/core@2.6.7
+
+## 4.1.15
+
+### Patch Changes
+
+- Updated dependencies [[`a91c0b64`](https://github.com/wevm/wagmi/commit/a91c0b64ba8b3e6537a560e69724eb601f26af27)]:
+ - @wagmi/core@2.6.6
+
+## 4.1.14
+
+### Patch Changes
+
+- [#3591](https://github.com/wevm/wagmi/pull/3591) [`ca5decdb`](https://github.com/wevm/wagmi/commit/ca5decdb712f81e3f5dab933a94b967bca5b6af4) Thanks [@tmm](https://github.com/tmm)! - Fixed Coinbase Wallet import.
+
+- Updated dependencies [[`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2)]:
+ - @wagmi/core@2.6.5
+
+## 4.1.13
+
+### Patch Changes
+
+- [#3569](https://github.com/wevm/wagmi/pull/3569) [`fa25b448`](https://github.com/wevm/wagmi/commit/fa25b4482504b4d9729a5687ea6d6dc959265bc0) Thanks [@svenvoskamp](https://github.com/svenvoskamp)! - Updated dependencies.
+
+- [#3558](https://github.com/wevm/wagmi/pull/3558) [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950) Thanks [@tmm](https://github.com/tmm)! - Fixed connector warnings.
+
+- Updated dependencies [[`7c6618e6`](https://github.com/wevm/wagmi/commit/7c6618e6a0eb1ff39cf8f66b34d3ddc14be538fe), [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950)]:
+ - @wagmi/core@2.6.4
+
+## 4.1.12
+
+### Patch Changes
+
+- Updated dependencies [[`9c3b85dd`](https://github.com/wevm/wagmi/commit/9c3b85dd0a9a4a593e1d7e029345275735330e32), [`2a72214a`](https://github.com/wevm/wagmi/commit/2a72214a2901d6b6ddd39f80238aa0bd4db670a7)]:
+ - @wagmi/core@2.6.3
+
+## 4.1.11
+
+### Patch Changes
+
+- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.
+
+- Updated dependencies [[`414eb048`](https://github.com/wevm/wagmi/commit/414eb048af492caac70c0e874dfc87c30702804a), [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d)]:
+ - @wagmi/core@2.6.2
+
+## 4.1.10
+
+### Patch Changes
+
+- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.
+
+- Updated dependencies [[`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d), [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b)]:
+ - @wagmi/core@2.6.1
+
+## 4.1.9
+
+### Patch Changes
+
+- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.
+
+- Updated dependencies [[`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b)]:
+ - @wagmi/core@2.6.0
+
+## 4.1.8
+
+### Patch Changes
+
+- Updated dependencies [[`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7)]:
+ - @wagmi/core@2.5.0
+
+## 4.1.7
+
+### Patch Changes
+
+- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies.
+
+- Updated dependencies [[`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4)]:
+ - @wagmi/core@2.4.0
+
+## 4.1.6
+
+### Patch Changes
+
+- Updated dependencies [[`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2)]:
+ - @wagmi/core@2.3.1
+
+## 4.1.5
+
+### Patch Changes
+
+- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Bumped dependencies
+
+- [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90) Thanks [@jxom](https://github.com/jxom)! - Bumped listener limit on WalletConnect connector.
+
+- Updated dependencies [[`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5), [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524), [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90)]:
+ - @wagmi/core@2.3.0
+
+## 4.1.4
+
+### Patch Changes
+
+- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Bumped dependencies.
+
+- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Bumped dependencies.
+
+- Updated dependencies [[`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a), [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb)]:
+ - @wagmi/core@2.2.1
+
+## 4.1.3
+
+### Patch Changes
+
+- Updated dependencies [[`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26), [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3), [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5)]:
+ - @wagmi/core@2.2.0
+
+## 4.1.2
+
+### Patch Changes
+
+- Updated dependencies [[`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7)]:
+ - @wagmi/core@2.1.2
+
+## 4.1.1
+
+### Patch Changes
+
+- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.
+
+- Updated dependencies [[`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4), [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37)]:
+ - @wagmi/core@2.1.1
+
+## 4.1.0
+
+### Minor Changes
+
+- Updated dependencies [[`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399)]:
+ - @wagmi/core@2.1.0
+
+## 4.0.2
+
+### Patch Changes
+
+- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.
+
+- Updated dependencies [[`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844)]:
+ - @wagmi/core@2.0.2
+
+## 4.0.1
+
+### Major Changes
+
+- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Added support for Wagmi 2.0.
+
+### Patch Changes
+
+- Updated dependencies [[`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a)]:
+ - @wagmi/core@2.0.0
+
+## 3.1.11
+
+### Patch Changes
+
+- [#3361](https://github.com/wevm/wagmi/pull/3361) [`bbbbf587`](https://github.com/wevm/wagmi/commit/bbbbf587e41bae12b072b7a7c897d580fc07cd2b) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated WalletConnect connector dependencies
+
+## 3.1.10
+
+### Patch Changes
+
+- [`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c) Thanks [@tmm](https://github.com/tmm)! - Removed LedgerConnector due to security vulnerability
+
+## 3.1.9
+
+### Patch Changes
+
+- [#3114](https://github.com/wevm/wagmi/pull/3114) [`51eca0fb`](https://github.com/wevm/wagmi/commit/51eca0fbaea6932f31a5b8b4213f0252280053e2) Thanks [@akathecoder](https://github.com/akathecoder)! - Added Okto Wallet to Injected Wallets Connector
+
+- [#3299](https://github.com/wevm/wagmi/pull/3299) [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e) Thanks [@dasanra](https://github.com/dasanra)! - Fixed issue with [Safe SDK](https://github.com/wevm/viem/issues/579) by bumping `@safe-global/safe-apps-provider@0.18.1`
+
+## 3.1.8
+
+### Patch Changes
+
+- [#3197](https://github.com/wevm/wagmi/pull/3197) [`e8f7bcbc`](https://github.com/wevm/wagmi/commit/e8f7bcbcd9c038a901c29e71769682c088efe2ac) Thanks [@ByteZhang1024](https://github.com/ByteZhang1024)! - Added OneKey Wallet to injected connector flags.
+
+## 3.1.7
+
+### Patch Changes
+
+- [#3276](https://github.com/wevm/wagmi/pull/3276) [`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf) Thanks [@glitch-txs](https://github.com/glitch-txs)! - Removed required namespaces from WalletConnect connector
+
+## 3.1.6
+
+### Patch Changes
+
+- [#3236](https://github.com/wevm/wagmi/pull/3236) [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated @walletconnect/ethereum-provider
+
+- [#3236](https://github.com/wevm/wagmi/pull/3236) [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Updated @walletconnect/ethereum-provider
+
+## 3.1.5
+
+### Patch Changes
+
+- [#3220](https://github.com/wagmi-dev/wagmi/pull/3220) [`a1950449`](https://github.com/wagmi-dev/wagmi/commit/a1950449127ddf72fff8ecd1fc34c3690befbb05) Thanks [@rkalis](https://github.com/rkalis)! - Fixed a bug where injected walets with an empty providers array could not connect
+
+## 3.1.4
+
+### Patch Changes
+
+- [#3115](https://github.com/wagmi-dev/wagmi/pull/3115) [`4e6ec415`](https://github.com/wagmi-dev/wagmi/commit/4e6ec4151baece94e940e227e0e3711c7f8534d9) Thanks [@bifot](https://github.com/bifot)! - Added SafePal injected name mapping.
+
+## 3.1.3
+
+### Patch Changes
+
+- [#3141](https://github.com/wagmi-dev/wagmi/pull/3141) [`e78aa337`](https://github.com/wagmi-dev/wagmi/commit/e78aa337c454f04b41a3cbd381d25270dd4a0afd) Thanks [@einaralex](https://github.com/einaralex)! - Updated WalletConnect libraries.
+
+## 3.1.2
+
+### Patch Changes
+
+- [#3009](https://github.com/wagmi-dev/wagmi/pull/3009) [`3aaba328`](https://github.com/wagmi-dev/wagmi/commit/3aaba32808ddb4035ec885f96992c91078056715) Thanks [@0xAsimetriq](https://github.com/0xAsimetriq)! - Update WalletConnect dependencies
+
+## 3.1.1
+
+### Patch Changes
+
+- [#2973](https://github.com/wevm/wagmi/pull/2973) [`bf831bb3`](https://github.com/wevm/wagmi/commit/bf831bb30df8037cc4312342d0fe3c045408c2fe) Thanks [@masm](https://github.com/masm)! - Added Zeal wallet
+
+## 3.1.0
+
+### Minor Changes
+
+- [#2956](https://github.com/wevm/wagmi/pull/2956) [`2abeb285`](https://github.com/wevm/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.
+
+## 3.0.0
+
+### Patch Changes
+
+- 0306383: Updated WalletConnect dependencies
+- Updated dependencies [d1ef9b4]
+- Updated dependencies [484c846]
+ - @wagmi/chains@1.8.0
+
+## 2.7.0
+
+### Minor Changes
+
+- a270cb9: Updated WalletConnect dependencies.
+
+### Patch Changes
+
+- 06cc1b4: Add SubWallet injected flags
+- 131a337: Added Desig Wallet name mapping.
+- e089d7d: Added Fordefi Wallet name mapping.
+- ce84d0a: Added Coin98 Wallet injected flags.
+- Updated dependencies [8fdacd8]
+- Updated dependencies [2e9283a]
+- Updated dependencies [a432a2b]
+- Updated dependencies [408740a]
+- Updated dependencies [6794a61]
+- Updated dependencies [0c5a32b]
+- Updated dependencies [ebc85ec]
+- Updated dependencies [5683df2]
+- Updated dependencies [414ff36]
+- Updated dependencies [4f514c6]
+- Updated dependencies [1cf72bc]
+- Updated dependencies [cd68471]
+- Updated dependencies [baf3143]
+- Updated dependencies [9737f24]
+- Updated dependencies [7797238]
+- Updated dependencies [3846811]
+- Updated dependencies [0ea344c]
+ - @wagmi/chains@1.7.0
+
+## 2.6.6
+
+### Patch Changes
+
+- 56c127d: Updated WalletConnect dependencies.
+- Updated dependencies [4b411d2]
+- Updated dependencies [df697ac]
+- Updated dependencies [186f5a7]
+- Updated dependencies [a96b514]
+- Updated dependencies [0a6e6da]
+ - @wagmi/chains@1.5.0
+
+## 2.6.5
+
+### Patch Changes
+
+- 51e346e: Updated WalletConnectConnector logic to handle individual namespaces like eip155:\*
+
+## 2.6.4
+
+### Patch Changes
+
+- 0a57de2: Added conditional for WalletConnectConnector optionalChains
+
+## 2.6.3
+
+### Patch Changes
+
+- f2d532d: Updated WalletConnect dependencies, exposed `relayUrl` option for `WalletConnectConnector`
+- ff53857: Fixed issue importing `EthereumProvider` in Vite environments.
+- Updated dependencies [d642e1d]
+- Updated dependencies [3027d7b]
+- Updated dependencies [97dbd44]
+ - @wagmi/chains@1.4.0
+
+## 2.6.2
+
+### Patch Changes
+
+- 27bb1b3: Added explicit type annotations for the `getWalletClient()` method.
+
+## 2.6.1
+
+### Patch Changes
+
+- a3507a9: Updated @walletconnect/ethereum-provider dependency
+
+## 2.6.0
+
+### Minor Changes
+
+- 32dc317: Updated @walletconnect/ethereum-provider and @walletconnect/modal dependencies
+
+## 2.5.0
+
+### Minor Changes
+
+- 57e674e: Updated `@safe-global/safe-apps-sdk` & `@safe-global/safe-apps-provider`
+
+## 2.4.0
+
+### Patch Changes
+
+- f21c8e0: Added WalletConnect v2 support to Ledger connector.
+- 27482bb: Add HAQQ Wallet detection
+- 7d6aa43: Exported `normalizeChainId`.
+- Updated dependencies [62b8209]
+- Updated dependencies [106ac13]
+- Updated dependencies [8b3f5e5]
+ - @wagmi/chains@1.3.0
+
+## 2.3.0
+
+### Minor Changes
+
+- 28219ae: Added metadata property to WalletConnect init function
+- 6fef949: Updated @walletconnect/modal and @walletconnect/ethereum-provider deps
+
+### Patch Changes
+
+- 72f6465: Added `TTWallet` to `getInjectedName` list
+- Updated dependencies [a7cbd04]
+- Updated dependencies [f6ee133]
+ - @wagmi/chains@1.2.0
+
+## 2.2.0
+
+### Minor Changes
+
+- 6c841d4: Changed `Address` type import from ABIType to viem.
+
+### Patch Changes
+
+- 09c83f8: Update @walletconnect/ethereum-provider, Replace @web3modal/standalone with @walletconnect/modal, Fix issue with wallet_addEthereumChain method in WalletConnectConnector
+
+## 2.1.1
+
+### Patch Changes
+
+- c24de75: Updated `@walletconnect/ethereum-provider` and `@web3modal/standalone` dependencies.
+- 605c422: Bumped `viem` peer dependency.
+- dc1c546: Throw ResourceUnavailableError on -30002 errors.
+
+## 2.1.0
+
+### Minor Changes
+
+- b001569: Bumped minimum TypeScript version to v5.0.4.
+
+### Patch Changes
+
+- 0f05b2b: Updated `abitype` to `0.8.7`.
+- 6aea7ee: Fixed internal types.
+- b187cb0: Added `isNovaWallet` injected flag.
+- 5e44429: Added Edgeware mainnet and testnet
+- b18b314: Updated @walletconnect/ethereum-provider and @web3modal/standalone dependencies
+- Updated dependencies [b62a199]
+- Updated dependencies [b001569]
+- Updated dependencies [260ab59]
+- Updated dependencies [6aea7ee]
+- Updated dependencies [5e44429]
+ - @wagmi/chains@1.0.0
+
+## 2.0.0
+
+### Patch Changes
+
+- Updated dependencies [36c14b2]
+ - @wagmi/chains@0.3.0
+
+## 1.0.5
+
+### Patch Changes
+
+- fa61dfe: Updated viem.
+- Updated dependencies [577d2a0]
+ - @wagmi/chains@0.2.25
+
+## 1.0.4
+
+### Patch Changes
+
+- bbbd11b: Corrected Rabby Wallet name
+- Updated dependencies [0639a1f]
+ - @wagmi/chains@0.2.24
+
+## 1.0.3
+
+### Patch Changes
+
+- 64dfe61: Update @web3modal/standalone to v2.4.1, Update @walletconnect/ethereum-provider to 2.7.4
+- bab7ad8: Added Defiant to injected connector flags
+- 44cde07: Added Talisman wallet flag
+
+## 1.0.2
+
+### Patch Changes
+
+- bce5a0c: Removed chain fallback when instantiating a Wallet Client.
+
+## 1.0.1
+
+### Patch Changes
+
+- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.
+
+## 1.0.0
+
+### Major Changes
+
+- 7e274f5: Released v1.
+
+### Patch Changes
+
+- 0966bf7: Changed Kucoin Wallet name mapping to Halo Wallet
+
+## 1.0.0-next.5
+
+### Major Changes
+
+- Updated references.
+
+## 1.0.0-next.4
+
+### Major Changes
+
+- Updated references.
+
+## 1.0.0-next.3
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/chains@1.0.0-next.0
+
+## 1.0.0-next.2
+
+### Major Changes
+
+- updated viem
+
+## 1.0.0-next.1
+
+### Major Changes
+
+- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.
+
+## 1.0.0-next.0
+
+### Major Changes
+
+- 33488cf: Released v1.
+
+## 0.3.19
+
+### Patch Changes
+
+- 274eef3: - Updated @web3modal/standalone to 2.3.7
+ - Updated @walletconnect/ethereum-provider to 2.7.1
+- 41697df: Updated @walletconnect/ethereum-provider version to 2.7.2
+- 82dcb72: Added Enkrypt extension detection
+
+## 0.3.18
+
+### Patch Changes
+
+- f66e065: Added BlockWallet to injected connector flags.
+
+## 0.3.17
+
+### Patch Changes
+
+- 12ab5d1: Updated @coinbase/wallet-sdk to 3.6.6
+
+## 0.3.16
+
+### Patch Changes
+
+- c1e3ddf: Reverted ABIType version change.
+
+## 0.3.15
+
+### Patch Changes
+
+- d4825e6: Fixed ABIType version to match downstream packages.
+
+## 0.3.14
+
+### Patch Changes
+
+- c25ac82: Added more flags to `MetaMaskConnector` `getProvider` check.
+- b19a932: Updated @web3modal/standalone to 2.3.0, @walletconnect/ethereum-provider to 2.7.0
+- cdc387e: Added `ImToken` to `getInjectedName` list
+
+## 0.3.13
+
+### Patch Changes
+
+- 2a21d27: Updated `@coinbase/wallet-sdk` to `3.6.4`
+
+## 0.3.12
+
+### Patch Changes
+
+- 9bb22b6: Updated `@walletconnect/ethereum-provider` to `2.6.2`, relaxed `@web3modal/standalone` version requirement
+- 0d7625b: Added Rabby to injected connector flags
+- f63d7fd: Added correct error to switch network cause.
+
+## 0.3.11
+
+### Patch Changes
+
+- 0778abc: Renamed `isTally` injected provider to `Taho`
+
+## 0.3.10
+
+### Patch Changes
+
+- 4267020: Added `qrModalOptions` option to `WalletConnectConnector`
+- e78fb0a: Pinned WalletConnect dependencies
+
+## 0.3.9
+
+### Patch Changes
+
+- 5cd0afc: Added `isZerion` to `InjectedProviderFlags` and `getInjectedName`
+- be4825e: Added GameStop Wallet to injected connector flags
+
+## 0.3.8
+
+### Patch Changes
+
+- 11f3fe2: Fixed issue where `UNSTABLE_shimOnConnectSelectAccount` would not bubble up error for MetaMask if request to connect was already active.
+
+## 0.3.7
+
+### Patch Changes
+
+- 04c0e47: Fixed issue switching chain after adding to MetaMask.
+
+## 0.3.6
+
+### Patch Changes
+
+- 85330c1: Removed `InjectedConnector` `shimChainChangedDisconnect` shim (no longer necessary).
+
+## 0.3.5
+
+### Patch Changes
+
+- 8b1a526: Added Dawn wallet flag
+
+## 0.3.4
+
+### Patch Changes
+
+- 6b15d6f: Updated `@walletconnect/ethereum-provider` to `2.5.1`.
+- 1f452e7: Added OKX Wallet to injected connector flags.
+- a4d9083: Added Backpack wallet to injected connector flags.
+- 6a4af48: Enabled support for programmatic chain switching on `LedgerConnector` & added `"ledger"` to the switch chain regex on `WalletConnectLegacyConnector`.
+
+## 0.3.3
+
+### Patch Changes
+
+- f24ce0c: Updated @walletconnect/ethereum-provider to 2.4.8
+- e3a3fee: Added "uniswap wallet" to the regex that determines wallets allowed to switch chains in the WalletConnect legacy connector
+- 641af48: Added name mapping for Bifrost Wallet
+- 4d2c90a: Added name mapping for Phantom
+- 3d276d0: Added Status as the name of the injected connector for the Status App
+
+## 0.3.2
+
+### Patch Changes
+
+- 13a6a07: Updated `@walletconnect/ethereum-provider` to `2.4.7`.
+
+## 0.3.1
+
+### Patch Changes
+
+- a23c40f: Added name mapping for [Frontier](https://frontier.xyz) Wallet
+- d779fb3: Added name mapping for HyperPay.
+
+## 0.3.0
+
+### Minor Changes
+
+- c4d5bb5: **Breaking:** Removed the `version` config option for `WalletConnectConnector`.
+
+ `WalletConnectConnector` now uses WalletConnect v2 by default. WalletConnect v1 is now `WalletConnectLegacyConnector`.
+
+ ### WalletConnect v2
+
+ ```diff
+ import { WalletConnectConnector } from '@wagmi/connectors/walletConnect'
+
+ const connector = new WalletConnectConnector({
+ options: {
+ - version: '2',
+ projectId: 'abc',
+ },
+ })
+ ```
+
+ ### WalletConnect v1
+
+ ```diff
+ -import { WalletConnectConnector } from '@wagmi/connectors/walletConnect'
+ +import { WalletConnectLegacyConnector } from '@wagmi/connectors/walletConnectLegacy'
+
+ -const connector = new WalletConnectConnector({
+ +const connector = new WalletConnectLegacyConnector({
+ options: {
+ qrcode: true,
+ },
+ })
+ ```
+
+## 0.2.7
+
+### Patch Changes
+
+- 57f1226: Added name mapping for XDEFI
+
+## 0.2.6
+
+### Patch Changes
+
+- bb1b88c: Added name mapping for Bitski injected wallet
+- fcb5595: Fixed shim disconnect key to read from defined Connector ID.
+- 49f8853: Fixed `SafeConnector` import type error that existed for specific build environments.
+
+## 0.2.5
+
+### Patch Changes
+
+- 5d121f2: Added `isApexWallet` to injected `window.ethereum` flags.
+- e3566eb: Updated `@web3modal/standalone` to `2.1.1` for WalletConnectConnector.
+
+## 0.2.4
+
+### Patch Changes
+
+- a4f31bc: Added Connector for [Safe](https://safe.global) wallet
+- d5e25d9: Locked ethers peer dependency version to >=5.5.1 <6
+
+## 0.2.3
+
+### Patch Changes
+
+- 6fa74dd: Updated `@walletconnect/universal-provider`
+ Added more signable methods to WC v2.
+
+## 0.2.2
+
+### Patch Changes
+
+- 6b0725b: Fixed race condition between `switchNetwork` and mutation Hooks that use `chainId` (e.g. `sendTransaction`).
+
+## 0.2.1
+
+### Patch Changes
+
+- 942fcde: Updated `@walletconnect/universal-provider` and `@web3modal/standalone` packages for WalletConnectConnector (v2).
+
+ Improved initialization flow for `@walletconnect/universal-provider` for WalletConnectConnector (v2).
+
+## 0.2.0
+
+### Minor Changes
+
+- be33c7d: Chains are now narrowed to their most specific type using the TypeScript [`satisfies`](https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/#the-satisfies-operator) operator.
+
+## 0.1.10
+
+### Patch Changes
+
+- d75e8d2: Fixed ABIType version mismatch between packages.
+
+## 0.1.9
+
+### Patch Changes
+
+- 8c3fc00: Added public RPC URL to Connector fallback chains
+
+## 0.1.8
+
+### Patch Changes
+
+- 5e6dc30: Replaced legacy qrcodemodal with web3modal for WalletConnect v2.
+
+## 0.1.7
+
+### Patch Changes
+
+- be4add2: Added `isRainbow` flag to `InjectedConnector`.
+
+## 0.1.6
+
+### Patch Changes
+
+- 3dfc558: Add `switchSigner` method to `MockProvider`.
+
+## 0.1.5
+
+### Patch Changes
+
+- 7dce4b5: Bumped WalletConnect Universal Provider version.
+
+## 0.1.4
+
+### Patch Changes
+
+- 4cec598: Added CJS escape hatch bundle under the "cjs" tag.
+
+## 0.1.3
+
+### Patch Changes
+
+- 822bc88: The `WalletConnectConnector` now supports WalletConnect v2.
+
+ It can be enabled by setting `version` to `'2'` and supplying a [WalletConnect Cloud `projectId`](https://cloud.walletconnect.com/sign-in).
+
+## 0.1.2
+
+### Patch Changes
+
+- 5e5f37f: Fixed issue where connecting to MetaMask may return with a stale address
+
+## 0.1.1
+
+### Patch Changes
+
+- 919790c: Updated `@ledgerhq/connect-kit-loader` to `1.0.1`
+
+## 0.1.0
+
+### Minor Changes
+
+- 5db7cba: Added `LedgerConnector`
+- 55a0ca2: Initial release of the `@wagmi/connectors` package ā a collection of Connectors for wagmi.
diff --git a/wagmi-project/packages/connectors/README.md b/wagmi-project/packages/connectors/README.md
new file mode 100644
index 000000000..05418ec15
--- /dev/null
+++ b/wagmi-project/packages/connectors/README.md
@@ -0,0 +1,13 @@
+# @wagmi/connectors
+
+Collection of connectors for Wagmi
+
+## Installation
+
+```bash
+pnpm add @wagmi/connectors @wagmi/core viem
+```
+
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
diff --git a/wagmi-project/packages/connectors/package.json b/wagmi-project/packages/connectors/package.json
new file mode 100644
index 000000000..5ddcfaa10
--- /dev/null
+++ b/wagmi-project/packages/connectors/package.json
@@ -0,0 +1,71 @@
+{
+ "name": "@wagmi/connectors",
+ "description": "Collection of connectors for Wagmi",
+ "version": "5.8.3",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/wevm/wagmi.git",
+ "directory": "packages/connectors"
+ },
+ "scripts": {
+ "build": "pnpm run clean && pnpm run build:esm+types",
+ "build:esm+types": "tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types",
+ "check:types": "tsc --noEmit",
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
+ "test:build": "publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm"
+ },
+ "files": [
+ "dist/**",
+ "!dist/**/*.tsbuildinfo",
+ "src/**/*.ts",
+ "!src/**/*.test.ts",
+ "!src/**/*.test-d.ts"
+ ],
+ "sideEffects": false,
+ "type": "module",
+ "main": "./dist/esm/exports/index.js",
+ "types": "./dist/types/exports/index.d.ts",
+ "typings": "./dist/types/exports/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/types/exports/index.d.ts",
+ "default": "./dist/esm/exports/index.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "peerDependencies": {
+ "@wagmi/core": "workspace:*",
+ "typescript": ">=5.0.4",
+ "viem": "2.x"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "@coinbase/wallet-sdk": "4.3.0",
+ "@metamask/sdk": "0.33.1",
+ "@safe-global/safe-apps-provider": "0.18.6",
+ "@safe-global/safe-apps-sdk": "9.1.0",
+ "@walletconnect/ethereum-provider": "2.20.2",
+ "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3"
+ },
+ "devDependencies": {
+ "@wagmi/core": "workspace:*",
+ "msw": "^2.4.9"
+ },
+ "contributors": ["awkweb.eth ", "jxom.eth "],
+ "funding": "https://github.com/sponsors/wevm",
+ "keywords": [
+ "react",
+ "hooks",
+ "eth",
+ "ethereum",
+ "dapps",
+ "wallet",
+ "web3",
+ "abi"
+ ]
+}
diff --git a/wagmi-project/packages/connectors/src/coinbaseWallet.test.ts b/wagmi-project/packages/connectors/src/coinbaseWallet.test.ts
new file mode 100644
index 000000000..99b141e49
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/coinbaseWallet.test.ts
@@ -0,0 +1,17 @@
+import { config } from '@wagmi/test'
+import { expect, expectTypeOf, test } from 'vitest'
+
+import { coinbaseWallet } from './coinbaseWallet.js'
+
+test('setup', () => {
+ const connectorFn = coinbaseWallet({ appName: 'wagmi', version: '4' })
+ const connector = config._internal.connectors.setup(connectorFn)
+ expect(connector.name).toEqual('Coinbase Wallet')
+
+ type ConnectFnParameters = NonNullable<
+ Parameters<(typeof connector)['connect']>[0]
+ >
+ expectTypeOf().toMatchTypeOf<
+ boolean | undefined
+ >()
+})
diff --git a/wagmi-project/packages/connectors/src/coinbaseWallet.ts b/wagmi-project/packages/connectors/src/coinbaseWallet.ts
new file mode 100644
index 000000000..630c91261
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/coinbaseWallet.ts
@@ -0,0 +1,546 @@
+import type {
+ Preference,
+ ProviderInterface,
+ createCoinbaseWalletSDK,
+} from '@coinbase/wallet-sdk'
+import {
+ ChainNotConfiguredError,
+ type Connector,
+ createConnector,
+} from '@wagmi/core'
+import type { Compute, Mutable, Omit } from '@wagmi/core/internal'
+import type {
+ CoinbaseWalletProvider as CBW_Provider,
+ CoinbaseWalletSDK as CBW_SDK,
+} from 'cbw-sdk'
+import {
+ type AddEthereumChainParameter,
+ type Address,
+ type Hex,
+ type ProviderRpcError,
+ SwitchChainError,
+ UserRejectedRequestError,
+ getAddress,
+ numberToHex,
+} from 'viem'
+
+type Version = '3' | '4'
+
+export type CoinbaseWalletParameters =
+ version extends '4'
+ ? Compute<
+ {
+ headlessMode?: false | undefined
+ /** Coinbase Wallet SDK version */
+ version?: version | '3' | undefined
+ } & Version4Parameters
+ >
+ : Compute<
+ {
+ /**
+ * @deprecated `headlessMode` will be removed in the next major version. Upgrade to `version: '4'`.
+ */
+ headlessMode?: true | undefined
+ /**
+ * Coinbase Wallet SDK version
+ * @deprecated Version 3 will be removed in the next major version. Upgrade to `version: '4'`.
+ * @default '4'
+ */
+ version?: version | '4' | undefined
+ } & Version3Parameters
+ >
+
+coinbaseWallet.type = 'coinbaseWallet' as const
+export function coinbaseWallet(
+ parameters: CoinbaseWalletParameters = {} as any,
+): version extends '4'
+ ? ReturnType
+ : ReturnType {
+ if (parameters.version === '3' || parameters.headlessMode)
+ return version3(parameters as Version3Parameters) as any
+ return version4(parameters as Version4Parameters) as any
+}
+
+type Version4Parameters = Mutable<
+ Omit<
+ Parameters[0],
+ | 'appChainIds' // set via wagmi config
+ | 'preference'
+ > & {
+ // TODO(v3): Remove `Preference['options']`
+ /**
+ * Preference for the type of wallet to display.
+ * @default 'all'
+ */
+ preference?: Preference['options'] | Compute | undefined
+ }
+>
+
+function version4(parameters: Version4Parameters) {
+ type Provider = ProviderInterface & {
+ // for backwards compatibility
+ close?(): void
+ }
+ type Properties = {
+ connect(parameters?: {
+ chainId?: number | undefined
+ instantOnboarding?: boolean | undefined
+ isReconnecting?: boolean | undefined
+ }): Promise<{
+ accounts: readonly Address[]
+ chainId: number
+ }>
+ }
+
+ let walletProvider: Provider | undefined
+
+ let accountsChanged: Connector['onAccountsChanged'] | undefined
+ let chainChanged: Connector['onChainChanged'] | undefined
+ let disconnect: Connector['onDisconnect'] | undefined
+
+ return createConnector((config) => ({
+ id: 'coinbaseWalletSDK',
+ name: 'Coinbase Wallet',
+ rdns: 'com.coinbase.wallet',
+ type: coinbaseWallet.type,
+ async connect({ chainId, ...rest } = {}) {
+ try {
+ const provider = await this.getProvider()
+ const accounts = (
+ (await provider.request({
+ method: 'eth_requestAccounts',
+ params:
+ 'instantOnboarding' in rest && rest.instantOnboarding
+ ? [{ onboarding: 'instant' }]
+ : [],
+ })) as string[]
+ ).map((x) => getAddress(x))
+
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged)
+ }
+ if (!chainChanged) {
+ chainChanged = this.onChainChanged.bind(this)
+ provider.on('chainChanged', chainChanged)
+ }
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect)
+ }
+
+ // Switch to chain if provided
+ let currentChainId = await this.getChainId()
+ if (chainId && currentChainId !== chainId) {
+ const chain = await this.switchChain!({ chainId }).catch((error) => {
+ if (error.code === UserRejectedRequestError.code) throw error
+ return { id: currentChainId }
+ })
+ currentChainId = chain?.id ?? currentChainId
+ }
+
+ return { accounts, chainId: currentChainId }
+ } catch (error) {
+ if (
+ /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test(
+ (error as Error).message,
+ )
+ )
+ throw new UserRejectedRequestError(error as Error)
+ throw error
+ }
+ },
+ async disconnect() {
+ const provider = await this.getProvider()
+
+ if (accountsChanged) {
+ provider.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+
+ provider.disconnect()
+ provider.close?.()
+ },
+ async getAccounts() {
+ const provider = await this.getProvider()
+ return (
+ (await provider.request({
+ method: 'eth_accounts',
+ })) as string[]
+ ).map((x) => getAddress(x))
+ },
+ async getChainId() {
+ const provider = await this.getProvider()
+ const chainId = (await provider.request({
+ method: 'eth_chainId',
+ })) as Hex
+ return Number(chainId)
+ },
+ async getProvider() {
+ if (!walletProvider) {
+ const preference = (() => {
+ if (typeof parameters.preference === 'string')
+ return { options: parameters.preference }
+ return {
+ ...parameters.preference,
+ options: parameters.preference?.options ?? 'all',
+ }
+ })()
+
+ const { createCoinbaseWalletSDK } = await import('@coinbase/wallet-sdk')
+ const sdk = createCoinbaseWalletSDK({
+ ...parameters,
+ appChainIds: config.chains.map((x) => x.id),
+ preference,
+ })
+
+ walletProvider = sdk.getProvider()
+ }
+
+ return walletProvider
+ },
+ async isAuthorized() {
+ try {
+ const accounts = await this.getAccounts()
+ return !!accounts.length
+ } catch {
+ return false
+ }
+ },
+ async switchChain({ addEthereumChainParameter, chainId }) {
+ const chain = config.chains.find((chain) => chain.id === chainId)
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
+
+ const provider = await this.getProvider()
+
+ try {
+ await provider.request({
+ method: 'wallet_switchEthereumChain',
+ params: [{ chainId: numberToHex(chain.id) }],
+ })
+ return chain
+ } catch (error) {
+ // Indicates chain is not added to provider
+ if ((error as ProviderRpcError).code === 4902) {
+ try {
+ let blockExplorerUrls: string[] | undefined
+ if (addEthereumChainParameter?.blockExplorerUrls)
+ blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls
+ else
+ blockExplorerUrls = chain.blockExplorers?.default.url
+ ? [chain.blockExplorers?.default.url]
+ : []
+
+ let rpcUrls: readonly string[]
+ if (addEthereumChainParameter?.rpcUrls?.length)
+ rpcUrls = addEthereumChainParameter.rpcUrls
+ else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']
+
+ const addEthereumChain = {
+ blockExplorerUrls,
+ chainId: numberToHex(chainId),
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
+ iconUrls: addEthereumChainParameter?.iconUrls,
+ nativeCurrency:
+ addEthereumChainParameter?.nativeCurrency ??
+ chain.nativeCurrency,
+ rpcUrls,
+ } satisfies AddEthereumChainParameter
+
+ await provider.request({
+ method: 'wallet_addEthereumChain',
+ params: [addEthereumChain],
+ })
+
+ return chain
+ } catch (error) {
+ throw new UserRejectedRequestError(error as Error)
+ }
+ }
+
+ throw new SwitchChainError(error as Error)
+ }
+ },
+ onAccountsChanged(accounts) {
+ if (accounts.length === 0) this.onDisconnect()
+ else
+ config.emitter.emit('change', {
+ accounts: accounts.map((x) => getAddress(x)),
+ })
+ },
+ onChainChanged(chain) {
+ const chainId = Number(chain)
+ config.emitter.emit('change', { chainId })
+ },
+ async onDisconnect(_error) {
+ config.emitter.emit('disconnect')
+
+ const provider = await this.getProvider()
+ if (accountsChanged) {
+ provider.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ },
+ }))
+}
+
+type Version3Parameters = Mutable<
+ Omit<
+ ConstructorParameters[0],
+ 'reloadOnDisconnect' // remove property since TSDoc says default is `true`
+ >
+> & {
+ /**
+ * Fallback Ethereum JSON RPC URL
+ * @default ""
+ */
+ jsonRpcUrl?: string | undefined
+ /**
+ * Fallback Ethereum Chain ID
+ * @default 1
+ */
+ chainId?: number | undefined
+ /**
+ * Whether or not to reload dapp automatically after disconnect.
+ * @default false
+ */
+ reloadOnDisconnect?: boolean | undefined
+}
+
+function version3(parameters: Version3Parameters) {
+ const reloadOnDisconnect = false
+
+ type Provider = CBW_Provider
+
+ let sdk: CBW_SDK | undefined
+ let walletProvider: Provider | undefined
+
+ let accountsChanged: Connector['onAccountsChanged'] | undefined
+ let chainChanged: Connector['onChainChanged'] | undefined
+ let disconnect: Connector['onDisconnect'] | undefined
+
+ return createConnector((config) => ({
+ id: 'coinbaseWalletSDK',
+ name: 'Coinbase Wallet',
+ rdns: 'com.coinbase.wallet',
+ type: coinbaseWallet.type,
+ async connect({ chainId } = {}) {
+ try {
+ const provider = await this.getProvider()
+ const accounts = (
+ (await provider.request({
+ method: 'eth_requestAccounts',
+ })) as string[]
+ ).map((x) => getAddress(x))
+
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged)
+ }
+ if (!chainChanged) {
+ chainChanged = this.onChainChanged.bind(this)
+ provider.on('chainChanged', chainChanged)
+ }
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect)
+ }
+
+ // Switch to chain if provided
+ let currentChainId = await this.getChainId()
+ if (chainId && currentChainId !== chainId) {
+ const chain = await this.switchChain!({ chainId }).catch((error) => {
+ if (error.code === UserRejectedRequestError.code) throw error
+ return { id: currentChainId }
+ })
+ currentChainId = chain?.id ?? currentChainId
+ }
+
+ return { accounts, chainId: currentChainId }
+ } catch (error) {
+ if (
+ /(user closed modal|accounts received is empty|user denied account)/i.test(
+ (error as Error).message,
+ )
+ )
+ throw new UserRejectedRequestError(error as Error)
+ throw error
+ }
+ },
+ async disconnect() {
+ const provider = await this.getProvider()
+
+ if (accountsChanged) {
+ provider.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+
+ provider.disconnect()
+ provider.close()
+ },
+ async getAccounts() {
+ const provider = await this.getProvider()
+ return (
+ await provider.request({
+ method: 'eth_accounts',
+ })
+ ).map((x) => getAddress(x))
+ },
+ async getChainId() {
+ const provider = await this.getProvider()
+ const chainId = await provider.request({
+ method: 'eth_chainId',
+ })
+ return Number(chainId)
+ },
+ async getProvider() {
+ if (!walletProvider) {
+ // Unwrapping import for Vite compatibility.
+ // See: https://github.com/vitejs/vite/issues/9703
+ const CoinbaseWalletSDK = await (async () => {
+ const { default: SDK } = await import('cbw-sdk')
+ if (typeof SDK !== 'function' && typeof SDK.default === 'function')
+ return SDK.default
+ return SDK as unknown as typeof SDK.default
+ })()
+
+ sdk = new CoinbaseWalletSDK({ ...parameters, reloadOnDisconnect })
+
+ // Force types to retrieve private `walletExtension` method from the Coinbase Wallet SDK.
+ const walletExtensionChainId = (
+ sdk as unknown as {
+ get walletExtension(): { getChainId(): number } | undefined
+ }
+ ).walletExtension?.getChainId()
+
+ const chain =
+ config.chains.find((chain) =>
+ parameters.chainId
+ ? chain.id === parameters.chainId
+ : chain.id === walletExtensionChainId,
+ ) || config.chains[0]
+ const chainId = parameters.chainId || chain?.id
+ const jsonRpcUrl =
+ parameters.jsonRpcUrl || chain?.rpcUrls.default.http[0]
+
+ walletProvider = sdk.makeWeb3Provider(jsonRpcUrl, chainId)
+ }
+
+ return walletProvider
+ },
+ async isAuthorized() {
+ try {
+ const accounts = await this.getAccounts()
+ return !!accounts.length
+ } catch {
+ return false
+ }
+ },
+ async switchChain({ addEthereumChainParameter, chainId }) {
+ const chain = config.chains.find((chain) => chain.id === chainId)
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
+
+ const provider = await this.getProvider()
+
+ try {
+ await provider.request({
+ method: 'wallet_switchEthereumChain',
+ params: [{ chainId: numberToHex(chain.id) }],
+ })
+ return chain
+ } catch (error) {
+ // Indicates chain is not added to provider
+ if ((error as ProviderRpcError).code === 4902) {
+ try {
+ let blockExplorerUrls: string[] | undefined
+ if (addEthereumChainParameter?.blockExplorerUrls)
+ blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls
+ else
+ blockExplorerUrls = chain.blockExplorers?.default.url
+ ? [chain.blockExplorers?.default.url]
+ : []
+
+ let rpcUrls: readonly string[]
+ if (addEthereumChainParameter?.rpcUrls?.length)
+ rpcUrls = addEthereumChainParameter.rpcUrls
+ else rpcUrls = [chain.rpcUrls.default?.http[0] ?? '']
+
+ const addEthereumChain = {
+ blockExplorerUrls,
+ chainId: numberToHex(chainId),
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
+ iconUrls: addEthereumChainParameter?.iconUrls,
+ nativeCurrency:
+ addEthereumChainParameter?.nativeCurrency ??
+ chain.nativeCurrency,
+ rpcUrls,
+ } satisfies AddEthereumChainParameter
+
+ await provider.request({
+ method: 'wallet_addEthereumChain',
+ params: [addEthereumChain],
+ })
+
+ return chain
+ } catch (error) {
+ throw new UserRejectedRequestError(error as Error)
+ }
+ }
+
+ throw new SwitchChainError(error as Error)
+ }
+ },
+ onAccountsChanged(accounts) {
+ if (accounts.length === 0) this.onDisconnect()
+ else
+ config.emitter.emit('change', {
+ accounts: accounts.map((x) => getAddress(x)),
+ })
+ },
+ onChainChanged(chain) {
+ const chainId = Number(chain)
+ config.emitter.emit('change', { chainId })
+ },
+ async onDisconnect(_error) {
+ config.emitter.emit('disconnect')
+
+ const provider = await this.getProvider()
+ if (accountsChanged) {
+ provider.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ },
+ }))
+}
diff --git a/wagmi-project/packages/connectors/src/exports/index.test.ts b/wagmi-project/packages/connectors/src/exports/index.test.ts
new file mode 100644
index 000000000..bcf100cb6
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/exports/index.test.ts
@@ -0,0 +1,17 @@
+import { expect, test } from 'vitest'
+
+import * as connectors from './index.js'
+
+test('exports', () => {
+ expect(Object.keys(connectors)).toMatchInlineSnapshot(`
+ [
+ "injected",
+ "mock",
+ "coinbaseWallet",
+ "metaMask",
+ "safe",
+ "walletConnect",
+ "version",
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/connectors/src/exports/index.ts b/wagmi-project/packages/connectors/src/exports/index.ts
new file mode 100644
index 000000000..bac097595
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/exports/index.ts
@@ -0,0 +1,23 @@
+// biome-ignore lint/performance/noBarrelFile: entrypoint module
+export {
+ type InjectedParameters,
+ injected,
+ type MockParameters,
+ mock,
+} from '@wagmi/core'
+
+export {
+ type CoinbaseWalletParameters,
+ coinbaseWallet,
+} from '../coinbaseWallet.js'
+
+export { type MetaMaskParameters, metaMask } from '../metaMask.js'
+
+export { type SafeParameters, safe } from '../safe.js'
+
+export {
+ type WalletConnectParameters,
+ walletConnect,
+} from '../walletConnect.js'
+
+export { version } from '../version.js'
diff --git a/wagmi-project/packages/connectors/src/metaMask.test.ts b/wagmi-project/packages/connectors/src/metaMask.test.ts
new file mode 100644
index 000000000..40c3f0f7f
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/metaMask.test.ts
@@ -0,0 +1,10 @@
+import { config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { metaMask } from './metaMask.js'
+
+test('setup', () => {
+ const connectorFn = metaMask()
+ const connector = config._internal.connectors.setup(connectorFn)
+ expect(connector.name).toEqual('MetaMask')
+})
diff --git a/wagmi-project/packages/connectors/src/metaMask.ts b/wagmi-project/packages/connectors/src/metaMask.ts
new file mode 100644
index 000000000..02ab4c3fb
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/metaMask.ts
@@ -0,0 +1,505 @@
+import type {
+ MetaMaskSDK,
+ MetaMaskSDKOptions,
+ RPC_URLS_MAP,
+ SDKProvider,
+} from '@metamask/sdk'
+import {
+ ChainNotConfiguredError,
+ type Connector,
+ ProviderNotFoundError,
+ createConnector,
+ extractRpcUrls,
+} from '@wagmi/core'
+import type {
+ Compute,
+ ExactPartial,
+ OneOf,
+ RemoveUndefined,
+ UnionCompute,
+} from '@wagmi/core/internal'
+import {
+ type AddEthereumChainParameter,
+ type Address,
+ type Hex,
+ type ProviderConnectInfo,
+ type ProviderRpcError,
+ ResourceUnavailableRpcError,
+ type RpcError,
+ SwitchChainError,
+ UserRejectedRequestError,
+ getAddress,
+ hexToNumber,
+ numberToHex,
+ withRetry,
+ withTimeout,
+} from 'viem'
+
+export type MetaMaskParameters = UnionCompute<
+ WagmiMetaMaskSDKOptions &
+ OneOf<
+ | {
+ /* Shortcut to connect and sign a message */
+ connectAndSign?: string | undefined
+ }
+ | {
+ // TODO: Strongly type `method` and `params`
+ /* Allow `connectWith` any rpc method */
+ connectWith?: { method: string; params: unknown[] } | undefined
+ }
+ >
+>
+
+type WagmiMetaMaskSDKOptions = Compute<
+ ExactPartial<
+ Omit<
+ MetaMaskSDKOptions,
+ | '_source'
+ | 'forceDeleteProvider'
+ | 'forceInjectProvider'
+ | 'injectProvider'
+ | 'useDeeplink'
+ | 'readonlyRPCMap'
+ >
+ > & {
+ /** @deprecated */
+ forceDeleteProvider?: MetaMaskSDKOptions['forceDeleteProvider']
+ /** @deprecated */
+ forceInjectProvider?: MetaMaskSDKOptions['forceInjectProvider']
+ /** @deprecated */
+ injectProvider?: MetaMaskSDKOptions['injectProvider']
+ /** @deprecated */
+ useDeeplink?: MetaMaskSDKOptions['useDeeplink']
+ }
+>
+
+metaMask.type = 'metaMask' as const
+export function metaMask(parameters: MetaMaskParameters = {}) {
+ type Provider = SDKProvider
+ type Properties = {
+ onConnect(connectInfo: ProviderConnectInfo): void
+ onDisplayUri(uri: string): void
+ }
+ type Listener = Parameters[1]
+
+ let sdk: MetaMaskSDK
+ let provider: Provider | undefined
+ let providerPromise: Promise
+
+ let accountsChanged: Connector['onAccountsChanged'] | undefined
+ let chainChanged: Connector['onChainChanged'] | undefined
+ let connect: Connector['onConnect'] | undefined
+ let displayUri: ((uri: string) => void) | undefined
+ let disconnect: Connector['onDisconnect'] | undefined
+
+ return createConnector((config) => ({
+ id: 'metaMaskSDK',
+ name: 'MetaMask',
+ rdns: ['io.metamask', 'io.metamask.mobile'],
+ type: metaMask.type,
+ async setup() {
+ const provider = await this.getProvider()
+ if (provider?.on) {
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider.on('connect', connect as Listener)
+ }
+
+ // We shouldn't need to listen for `'accountsChanged'` here since the `'connect'` event should suffice (and wallet shouldn't be connected yet).
+ // Some wallets, like MetaMask, do not implement the `'connect'` event and overload `'accountsChanged'` instead.
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged as Listener)
+ }
+ }
+ },
+ async connect({ chainId, isReconnecting } = {}) {
+ const provider = await this.getProvider()
+ if (!displayUri) {
+ displayUri = this.onDisplayUri
+ provider.on('display_uri', displayUri as Listener)
+ }
+
+ let accounts: readonly Address[] = []
+ if (isReconnecting) accounts = await this.getAccounts().catch(() => [])
+
+ try {
+ let signResponse: string | undefined
+ let connectWithResponse: unknown | undefined
+ if (!accounts?.length) {
+ if (parameters.connectAndSign || parameters.connectWith) {
+ if (parameters.connectAndSign)
+ signResponse = await sdk.connectAndSign({
+ msg: parameters.connectAndSign,
+ })
+ else if (parameters.connectWith)
+ connectWithResponse = await sdk.connectWith({
+ method: parameters.connectWith.method,
+ params: parameters.connectWith.params,
+ })
+
+ accounts = await this.getAccounts()
+ } else {
+ const requestedAccounts = (await sdk.connect()) as string[]
+ accounts = requestedAccounts.map((x) => getAddress(x))
+ }
+ }
+ // Switch to chain if provided
+ let currentChainId = (await this.getChainId()) as number
+ if (chainId && currentChainId !== chainId) {
+ const chain = await this.switchChain!({ chainId }).catch((error) => {
+ if (error.code === UserRejectedRequestError.code) throw error
+ return { id: currentChainId }
+ })
+ currentChainId = chain?.id ?? currentChainId
+ }
+
+ if (displayUri) {
+ provider.removeListener('display_uri', displayUri)
+ displayUri = undefined
+ }
+
+ if (signResponse)
+ provider.emit('connectAndSign', {
+ accounts,
+ chainId: currentChainId,
+ signResponse,
+ })
+ else if (connectWithResponse)
+ provider.emit('connectWith', {
+ accounts,
+ chainId: currentChainId,
+ connectWithResponse,
+ })
+
+ // Manage EIP-1193 event listeners
+ // https://eips.ethereum.org/EIPS/eip-1193#events
+ if (connect) {
+ provider.removeListener('connect', connect)
+ connect = undefined
+ }
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged as Listener)
+ }
+ if (!chainChanged) {
+ chainChanged = this.onChainChanged.bind(this)
+ provider.on('chainChanged', chainChanged as Listener)
+ }
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect as Listener)
+ }
+
+ return { accounts, chainId: currentChainId }
+ } catch (err) {
+ const error = err as RpcError
+ if (error.code === UserRejectedRequestError.code)
+ throw new UserRejectedRequestError(error)
+ if (error.code === ResourceUnavailableRpcError.code)
+ throw new ResourceUnavailableRpcError(error)
+ throw error
+ }
+ },
+ async disconnect() {
+ const provider = await this.getProvider()
+
+ // Manage EIP-1193 event listeners
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider.on('connect', connect as Listener)
+ }
+
+ await sdk.terminate()
+ },
+ async getAccounts() {
+ const provider = await this.getProvider()
+ const accounts = (await provider.request({
+ method: 'eth_accounts',
+ })) as string[]
+ return accounts.map((x) => getAddress(x))
+ },
+ async getChainId() {
+ const provider = await this.getProvider()
+ const chainId =
+ provider.getChainId() ||
+ (await provider?.request({ method: 'eth_chainId' }))
+ return Number(chainId)
+ },
+ async getProvider() {
+ async function initProvider() {
+ // Unwrapping import for Vite compatibility.
+ // See: https://github.com/vitejs/vite/issues/9703
+ const MetaMaskSDK = await (async () => {
+ const { default: SDK } = await import('@metamask/sdk')
+ if (typeof SDK !== 'function' && typeof SDK.default === 'function')
+ return SDK.default
+ return SDK as unknown as typeof SDK.default
+ })()
+
+ const readonlyRPCMap: RPC_URLS_MAP = {}
+ for (const chain of config.chains)
+ readonlyRPCMap[numberToHex(chain.id)] = extractRpcUrls({
+ chain,
+ transports: config.transports,
+ })?.[0]
+
+ sdk = new MetaMaskSDK({
+ _source: 'wagmi',
+ forceDeleteProvider: false,
+ forceInjectProvider: false,
+ injectProvider: false,
+ // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'`
+ ...(parameters as RemoveUndefined),
+ readonlyRPCMap,
+ dappMetadata: {
+ ...parameters.dappMetadata,
+ // Test if name and url are set AND not empty
+ name: parameters.dappMetadata?.name
+ ? parameters.dappMetadata?.name
+ : 'wagmi',
+ url: parameters.dappMetadata?.url
+ ? parameters.dappMetadata?.url
+ : typeof window !== 'undefined'
+ ? window.location.origin
+ : 'https://wagmi.sh',
+ },
+ useDeeplink: parameters.useDeeplink ?? true,
+ })
+ const result = await sdk.init()
+ // On initial load, sometimes `sdk.getProvider` does not return provider.
+ // https://github.com/wevm/wagmi/issues/4367
+ // Use result of `init` call if available.
+ const provider = (() => {
+ if (result?.activeProvider) return result.activeProvider
+ return sdk.getProvider()
+ })()
+ if (!provider) throw new ProviderNotFoundError()
+ return provider
+ }
+
+ if (!provider) {
+ if (!providerPromise) providerPromise = initProvider()
+ provider = await providerPromise
+ }
+ return provider!
+ },
+ async isAuthorized() {
+ try {
+ // MetaMask mobile provider sometimes fails to immediately resolve
+ // JSON-RPC requests on page load
+ const timeout = 200
+ const accounts = await withRetry(
+ () => withTimeout(() => this.getAccounts(), { timeout }),
+ {
+ delay: timeout + 1,
+ retryCount: 3,
+ },
+ )
+ return !!accounts.length
+ } catch {
+ return false
+ }
+ },
+ async switchChain({ addEthereumChainParameter, chainId }) {
+ const provider = await this.getProvider()
+
+ const chain = config.chains.find((x) => x.id === chainId)
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
+
+ try {
+ await provider.request({
+ method: 'wallet_switchEthereumChain',
+ params: [{ chainId: numberToHex(chainId) }],
+ })
+
+ // During `'wallet_switchEthereumChain'`, MetaMask makes a `'net_version'` RPC call to the target chain.
+ // If this request fails, MetaMask does not emit the `'chainChanged'` event, but will still switch the chain.
+ // To counter this behavior, we request and emit the current chain ID to confirm the chain switch either via
+ // this callback or an externally emitted `'chainChanged'` event.
+ // https://github.com/MetaMask/metamask-extension/issues/24247
+ await waitForChainIdToSync()
+ await sendAndWaitForChangeEvent(chainId)
+
+ return chain
+ } catch (err) {
+ const error = err as RpcError
+
+ if (error.code === UserRejectedRequestError.code)
+ throw new UserRejectedRequestError(error)
+
+ // Indicates chain is not added to provider
+ if (
+ error.code === 4902 ||
+ // Unwrapping for MetaMask Mobile
+ // https://github.com/MetaMask/metamask-mobile/issues/2944#issuecomment-976988719
+ (error as ProviderRpcError<{ originalError?: { code: number } }>)
+ ?.data?.originalError?.code === 4902
+ ) {
+ try {
+ await provider.request({
+ method: 'wallet_addEthereumChain',
+ params: [
+ {
+ blockExplorerUrls: (() => {
+ const { default: blockExplorer, ...blockExplorers } =
+ chain.blockExplorers ?? {}
+ if (addEthereumChainParameter?.blockExplorerUrls)
+ return addEthereumChainParameter.blockExplorerUrls
+ if (blockExplorer)
+ return [
+ blockExplorer.url,
+ ...Object.values(blockExplorers).map((x) => x.url),
+ ]
+ return
+ })(),
+ chainId: numberToHex(chainId),
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
+ iconUrls: addEthereumChainParameter?.iconUrls,
+ nativeCurrency:
+ addEthereumChainParameter?.nativeCurrency ??
+ chain.nativeCurrency,
+ rpcUrls: (() => {
+ if (addEthereumChainParameter?.rpcUrls?.length)
+ return addEthereumChainParameter.rpcUrls
+ return [chain.rpcUrls.default?.http[0] ?? '']
+ })(),
+ } satisfies AddEthereumChainParameter,
+ ],
+ })
+
+ await waitForChainIdToSync()
+ await sendAndWaitForChangeEvent(chainId)
+
+ return chain
+ } catch (err) {
+ const error = err as RpcError
+ if (error.code === UserRejectedRequestError.code)
+ throw new UserRejectedRequestError(error)
+ throw new SwitchChainError(error)
+ }
+ }
+
+ throw new SwitchChainError(error)
+ }
+
+ async function waitForChainIdToSync() {
+ // On mobile, there is a race condition between the result of `'wallet_addEthereumChain'` and `'eth_chainId'`.
+ // To avoid this, we wait for `'eth_chainId'` to return the expected chain ID with a retry loop.
+ await withRetry(
+ async () => {
+ const value = hexToNumber(
+ // `'eth_chainId'` is cached by the MetaMask SDK side to avoid unnecessary deeplinks
+ (await provider.request({ method: 'eth_chainId' })) as Hex,
+ )
+ // `value` doesn't match expected `chainId`, throw to trigger retry
+ if (value !== chainId)
+ throw new Error('User rejected switch after adding network.')
+ return value
+ },
+ {
+ delay: 50,
+ retryCount: 20, // android device encryption is slower
+ },
+ )
+ }
+
+ async function sendAndWaitForChangeEvent(chainId: number) {
+ await new Promise((resolve) => {
+ const listener = ((data) => {
+ if ('chainId' in data && data.chainId === chainId) {
+ config.emitter.off('change', listener)
+ resolve()
+ }
+ }) satisfies Parameters[1]
+ config.emitter.on('change', listener)
+ config.emitter.emit('change', { chainId })
+ })
+ }
+ },
+ async onAccountsChanged(accounts) {
+ // Disconnect if there are no accounts
+ if (accounts.length === 0) {
+ // ... and using browser extension
+ if (sdk.isExtensionActive()) this.onDisconnect()
+ // FIXME(upstream): Mobile app sometimes emits invalid `accountsChanged` event with empty accounts array
+ else return
+ }
+ // Connect if emitter is listening for connect event (e.g. is disconnected and connects through wallet interface)
+ else if (config.emitter.listenerCount('connect')) {
+ const chainId = (await this.getChainId()).toString()
+ this.onConnect({ chainId })
+ }
+ // Regular change event
+ else
+ config.emitter.emit('change', {
+ accounts: accounts.map((x) => getAddress(x)),
+ })
+ },
+ onChainChanged(chain) {
+ const chainId = Number(chain)
+ config.emitter.emit('change', { chainId })
+ },
+ async onConnect(connectInfo) {
+ const accounts = await this.getAccounts()
+ if (accounts.length === 0) return
+
+ const chainId = Number(connectInfo.chainId)
+ config.emitter.emit('connect', { accounts, chainId })
+
+ const provider = await this.getProvider()
+ if (connect) {
+ provider.removeListener('connect', connect)
+ connect = undefined
+ }
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged as Listener)
+ }
+ if (!chainChanged) {
+ chainChanged = this.onChainChanged.bind(this)
+ provider.on('chainChanged', chainChanged as Listener)
+ }
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect as Listener)
+ }
+ },
+ async onDisconnect(error) {
+ const provider = await this.getProvider()
+
+ // If MetaMask emits a `code: 1013` error, wait for reconnection before disconnecting
+ // https://github.com/MetaMask/providers/pull/120
+ if (error && (error as RpcError<1013>).code === 1013) {
+ if (provider && !!(await this.getAccounts()).length) return
+ }
+
+ config.emitter.emit('disconnect')
+
+ // Manage EIP-1193 event listeners
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider.on('connect', connect as Listener)
+ }
+ },
+ onDisplayUri(uri) {
+ config.emitter.emit('message', { type: 'display_uri', data: uri })
+ },
+ }))
+}
diff --git a/wagmi-project/packages/connectors/src/safe.test.ts b/wagmi-project/packages/connectors/src/safe.test.ts
new file mode 100644
index 000000000..0571115f3
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/safe.test.ts
@@ -0,0 +1,23 @@
+import { config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { safe } from './safe.js'
+
+/*
+ * To manually test the Safe connector:
+ *
+ * 1. Run the wagmi playground app (`pnpm dev`)
+ * 2. Add a custom Safe App with App URL set to `http://localhost:5173` (make sure there is a `manifest.json` file served by the playground)
+ * 3. Open the playground app at `https://app.safe.global/eth:0x4557B18E779944BFE9d78A672452331C186a9f48/apps?appUrl=http%3A%2F%2Flocalhost%3A5173`
+ *
+ * See https://docs.gnosis-safe.io/learn/safe-tools/sdks/safe-apps/releasing-your-safe-app for more info.
+ */
+
+test('setup', () => {
+ const connectorFn = safe({
+ allowedDomains: [/gnosis-safe.io$/, /app.safe.global$/],
+ debug: false,
+ })
+ const connector = config._internal.connectors.setup(connectorFn)
+ expect(connector.name).toEqual('Safe')
+})
diff --git a/wagmi-project/packages/connectors/src/safe.ts b/wagmi-project/packages/connectors/src/safe.ts
new file mode 100644
index 000000000..13153e106
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/safe.ts
@@ -0,0 +1,145 @@
+import type { SafeAppProvider } from '@safe-global/safe-apps-provider'
+import type { Opts } from '@safe-global/safe-apps-sdk'
+import {
+ type Connector,
+ ProviderNotFoundError,
+ createConnector,
+} from '@wagmi/core'
+import type { Compute } from '@wagmi/core/internal'
+import { getAddress, withTimeout } from 'viem'
+
+export type SafeParameters = Compute<
+ Opts & {
+ /**
+ * Connector automatically connects when used as Safe App.
+ *
+ * This flag simulates the disconnect behavior by keeping track of connection status in storage
+ * and only autoconnecting when previously connected by user action (e.g. explicitly choosing to connect).
+ *
+ * @default false
+ */
+ shimDisconnect?: boolean | undefined
+ /**
+ * Timeout in milliseconds for `getInfo` (from the Safe SDK) to resolve.
+ *
+ * `getInfo` does not resolve when not used in Safe App iFrame. This allows the connector to force a timeout.
+ * @default 10
+ */
+ unstable_getInfoTimeout?: number | undefined
+ }
+>
+
+safe.type = 'safe' as const
+export function safe(parameters: SafeParameters = {}) {
+ const { shimDisconnect = false } = parameters
+
+ type Provider = SafeAppProvider | undefined
+ type Properties = Record
+ type StorageItem = { 'safe.disconnected': true }
+
+ let provider_: Provider | undefined
+
+ let disconnect: Connector['onDisconnect'] | undefined
+
+ return createConnector((config) => ({
+ id: 'safe',
+ name: 'Safe',
+ type: safe.type,
+ async connect() {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+
+ const accounts = await this.getAccounts()
+ const chainId = await this.getChainId()
+
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect)
+ }
+
+ // Remove disconnected shim if it exists
+ if (shimDisconnect) await config.storage?.removeItem('safe.disconnected')
+
+ return { accounts, chainId }
+ },
+ async disconnect() {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+
+ // Add shim signalling connector is disconnected
+ if (shimDisconnect)
+ await config.storage?.setItem('safe.disconnected', true)
+ },
+ async getAccounts() {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+ return (await provider.request({ method: 'eth_accounts' })).map(
+ getAddress,
+ )
+ },
+ async getProvider() {
+ // Only allowed in iframe context
+ const isIframe =
+ typeof window !== 'undefined' && window?.parent !== window
+ if (!isIframe) return
+
+ if (!provider_) {
+ const { default: SDK } = await import('@safe-global/safe-apps-sdk')
+ const sdk = new SDK(parameters)
+
+ // `getInfo` hangs when not used in Safe App iFrame
+ // https://github.com/safe-global/safe-apps-sdk/issues/263#issuecomment-1029835840
+ const safe = await withTimeout(() => sdk.safe.getInfo(), {
+ timeout: parameters.unstable_getInfoTimeout ?? 10,
+ })
+ if (!safe) throw new Error('Could not load Safe information')
+ // Unwrapping import for Vite compatibility.
+ // See: https://github.com/vitejs/vite/issues/9703
+ const SafeAppProvider = await (async () => {
+ const Provider = await import('@safe-global/safe-apps-provider')
+ if (
+ typeof Provider.SafeAppProvider !== 'function' &&
+ typeof Provider.default.SafeAppProvider === 'function'
+ )
+ return Provider.default.SafeAppProvider
+ return Provider.SafeAppProvider
+ })()
+ provider_ = new SafeAppProvider(safe, sdk)
+ }
+ return provider_
+ },
+ async getChainId() {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+ return Number(provider.chainId)
+ },
+ async isAuthorized() {
+ try {
+ const isDisconnected =
+ shimDisconnect &&
+ // If shim exists in storage, connector is disconnected
+ (await config.storage?.getItem('safe.disconnected'))
+ if (isDisconnected) return false
+
+ const accounts = await this.getAccounts()
+ return !!accounts.length
+ } catch {
+ return false
+ }
+ },
+ onAccountsChanged() {
+ // Not relevant for Safe because changing account requires app reload.
+ },
+ onChainChanged() {
+ // Not relevant for Safe because Safe smart contract wallets only exist on single chain.
+ },
+ onDisconnect() {
+ config.emitter.emit('disconnect')
+ },
+ }))
+}
diff --git a/wagmi-project/packages/connectors/src/version.ts b/wagmi-project/packages/connectors/src/version.ts
new file mode 100644
index 000000000..11f81d1c3
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/version.ts
@@ -0,0 +1 @@
+export const version = '5.8.3'
diff --git a/wagmi-project/packages/connectors/src/walletConnect.test.ts b/wagmi-project/packages/connectors/src/walletConnect.test.ts
new file mode 100644
index 000000000..4e8a74ebf
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/walletConnect.test.ts
@@ -0,0 +1,67 @@
+import { config, walletConnectProjectId } from '@wagmi/test'
+import { http, HttpResponse } from 'msw'
+import { setupServer } from 'msw/node'
+import {
+ afterAll,
+ afterEach,
+ beforeAll,
+ expect,
+ expectTypeOf,
+ test,
+ vi,
+} from 'vitest'
+
+import { walletConnect } from './walletConnect.js'
+
+const handlers = [
+ http.get('https://relay.walletconnect.com', async () =>
+ HttpResponse.json(
+ {
+ topic: '222781e3-3fad-4184-acde-077796bf0d3d',
+ type: 'sub',
+ payload: '',
+ silent: true,
+ },
+ { status: 200 },
+ ),
+ ),
+]
+
+const server = setupServer(...handlers)
+
+beforeAll(() => {
+ server.listen({
+ onUnhandledRequest: 'warn',
+ })
+
+ const matchMedia = vi.fn().mockImplementation((query) => {
+ return {
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: vi.fn(), // deprecated
+ removeListener: vi.fn(), // deprecated
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ dispatchEvent: vi.fn(),
+ }
+ })
+ vi.stubGlobal('matchMedia', matchMedia)
+})
+
+afterEach(() => server.resetHandlers())
+
+afterAll(() => server.close())
+
+test('setup', () => {
+ const connectorFn = walletConnect({ projectId: walletConnectProjectId })
+ const connector = config._internal.connectors.setup(connectorFn)
+ expect(connector.name).toEqual('WalletConnect')
+
+ type ConnectFnParameters = NonNullable<
+ Parameters<(typeof connector)['connect']>[0]
+ >
+ expectTypeOf().toMatchTypeOf<
+ string | undefined
+ >()
+})
diff --git a/wagmi-project/packages/connectors/src/walletConnect.ts b/wagmi-project/packages/connectors/src/walletConnect.ts
new file mode 100644
index 000000000..fc4f794c1
--- /dev/null
+++ b/wagmi-project/packages/connectors/src/walletConnect.ts
@@ -0,0 +1,468 @@
+import {
+ ChainNotConfiguredError,
+ type Connector,
+ ProviderNotFoundError,
+ createConnector,
+ extractRpcUrls,
+} from '@wagmi/core'
+import type { Compute, ExactPartial, Omit } from '@wagmi/core/internal'
+import type { EthereumProvider } from '@walletconnect/ethereum-provider'
+import {
+ type AddEthereumChainParameter,
+ type Address,
+ type ProviderConnectInfo,
+ type ProviderRpcError,
+ type RpcError,
+ SwitchChainError,
+ UserRejectedRequestError,
+ getAddress,
+ numberToHex,
+} from 'viem'
+
+type WalletConnectConnector = Connector & {
+ onDisplayUri(uri: string): void
+ onSessionDelete(data: { topic: string }): void
+}
+
+type EthereumProviderOptions = Parameters<(typeof EthereumProvider)['init']>[0]
+
+export type WalletConnectParameters = Compute<
+ {
+ /**
+ * If a new chain is added to a previously existing configured connector `chains`, this flag
+ * will determine if that chain should be considered as stale. A stale chain is a chain that
+ * WalletConnect has yet to establish a relationship with (e.g. the user has not approved or
+ * rejected the chain).
+ *
+ * This flag mainly affects the behavior when a wallet does not support dynamic chain authorization
+ * with WalletConnect v2.
+ *
+ * If `true` (default), the new chain will be treated as a stale chain. If the user
+ * has yet to establish a relationship (approved/rejected) with this chain in their WalletConnect
+ * session, the connector will disconnect upon the dapp auto-connecting, and the user will have to
+ * reconnect to the dapp (revalidate the chain) in order to approve the newly added chain.
+ * This is the default behavior to avoid an unexpected error upon switching chains which may
+ * be a confusing user experience (e.g. the user will not know they have to reconnect
+ * unless the dapp handles these types of errors).
+ *
+ * If `false`, the new chain will be treated as a potentially valid chain. This means that if the user
+ * has yet to establish a relationship with the chain in their WalletConnect session, wagmi will successfully
+ * auto-connect the user. This comes with the trade-off that the connector will throw an error
+ * when attempting to switch to the unapproved chain if the wallet does not support dynamic session updates.
+ * This may be useful in cases where a dapp constantly
+ * modifies their configured chains, and they do not want to disconnect the user upon
+ * auto-connecting. If the user decides to switch to the unapproved chain, it is important that the
+ * dapp handles this error and prompts the user to reconnect to the dapp in order to approve
+ * the newly added chain.
+ *
+ * @default true
+ */
+ isNewChainsStale?: boolean
+ } & Omit<
+ EthereumProviderOptions,
+ | 'chains'
+ | 'events'
+ | 'optionalChains'
+ | 'optionalEvents'
+ | 'optionalMethods'
+ | 'methods'
+ | 'rpcMap'
+ | 'showQrModal'
+ > &
+ ExactPartial>
+>
+
+walletConnect.type = 'walletConnect' as const
+export function walletConnect(parameters: WalletConnectParameters) {
+ const isNewChainsStale = parameters.isNewChainsStale ?? true
+
+ type Provider = Awaited>
+ type Properties = {
+ connect(parameters?: {
+ chainId?: number | undefined
+ isReconnecting?: boolean | undefined
+ pairingTopic?: string | undefined
+ }): Promise<{
+ accounts: readonly Address[]
+ chainId: number
+ }>
+ getNamespaceChainsIds(): number[]
+ getRequestedChainsIds(): Promise
+ isChainsStale(): Promise
+ onConnect(connectInfo: ProviderConnectInfo): void
+ onDisplayUri(uri: string): void
+ onSessionDelete(data: { topic: string }): void
+ setRequestedChainsIds(chains: number[]): void
+ requestedChainsStorageKey: `${string}.requestedChains`
+ }
+ type StorageItem = {
+ [_ in Properties['requestedChainsStorageKey']]: number[]
+ }
+
+ let provider_: Provider | undefined
+ let providerPromise: Promise
+ const NAMESPACE = 'eip155'
+
+ let accountsChanged: WalletConnectConnector['onAccountsChanged'] | undefined
+ let chainChanged: WalletConnectConnector['onChainChanged'] | undefined
+ let connect: WalletConnectConnector['onConnect'] | undefined
+ let displayUri: WalletConnectConnector['onDisplayUri'] | undefined
+ let sessionDelete: WalletConnectConnector['onSessionDelete'] | undefined
+ let disconnect: WalletConnectConnector['onDisconnect'] | undefined
+
+ return createConnector((config) => ({
+ id: 'walletConnect',
+ name: 'WalletConnect',
+ type: walletConnect.type,
+ async setup() {
+ const provider = await this.getProvider().catch(() => null)
+ if (!provider) return
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider.on('connect', connect)
+ }
+ if (!sessionDelete) {
+ sessionDelete = this.onSessionDelete.bind(this)
+ provider.on('session_delete', sessionDelete)
+ }
+ },
+ async connect({ chainId, ...rest } = {}) {
+ try {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+ if (!displayUri) {
+ displayUri = this.onDisplayUri
+ provider.on('display_uri', displayUri)
+ }
+
+ let targetChainId = chainId
+ if (!targetChainId) {
+ const state = (await config.storage?.getItem('state')) ?? {}
+ const isChainSupported = config.chains.some(
+ (x) => x.id === state.chainId,
+ )
+ if (isChainSupported) targetChainId = state.chainId
+ else targetChainId = config.chains[0]?.id
+ }
+ if (!targetChainId) throw new Error('No chains found on connector.')
+
+ const isChainsStale = await this.isChainsStale()
+ // If there is an active session with stale chains, disconnect current session.
+ if (provider.session && isChainsStale) await provider.disconnect()
+
+ // If there isn't an active session or chains are stale, connect.
+ if (!provider.session || isChainsStale) {
+ const optionalChains = config.chains
+ .filter((chain) => chain.id !== targetChainId)
+ .map((optionalChain) => optionalChain.id)
+ await provider.connect({
+ optionalChains: [targetChainId, ...optionalChains],
+ ...('pairingTopic' in rest
+ ? { pairingTopic: rest.pairingTopic }
+ : {}),
+ })
+
+ this.setRequestedChainsIds(config.chains.map((x) => x.id))
+ }
+
+ // If session exists and chains are authorized, enable provider for required chain
+ const accounts = (await provider.enable()).map((x) => getAddress(x))
+ const currentChainId = await this.getChainId()
+
+ if (displayUri) {
+ provider.removeListener('display_uri', displayUri)
+ displayUri = undefined
+ }
+ if (connect) {
+ provider.removeListener('connect', connect)
+ connect = undefined
+ }
+ if (!accountsChanged) {
+ accountsChanged = this.onAccountsChanged.bind(this)
+ provider.on('accountsChanged', accountsChanged)
+ }
+ if (!chainChanged) {
+ chainChanged = this.onChainChanged.bind(this)
+ provider.on('chainChanged', chainChanged)
+ }
+ if (!disconnect) {
+ disconnect = this.onDisconnect.bind(this)
+ provider.on('disconnect', disconnect)
+ }
+ if (!sessionDelete) {
+ sessionDelete = this.onSessionDelete.bind(this)
+ provider.on('session_delete', sessionDelete)
+ }
+
+ return { accounts, chainId: currentChainId }
+ } catch (error) {
+ if (
+ /(user rejected|connection request reset)/i.test(
+ (error as ProviderRpcError)?.message,
+ )
+ ) {
+ throw new UserRejectedRequestError(error as Error)
+ }
+ throw error
+ }
+ },
+ async disconnect() {
+ const provider = await this.getProvider()
+ try {
+ await provider?.disconnect()
+ } catch (error) {
+ if (!/No matching key/i.test((error as Error).message)) throw error
+ } finally {
+ if (chainChanged) {
+ provider?.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider?.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider?.on('connect', connect)
+ }
+ if (accountsChanged) {
+ provider?.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (sessionDelete) {
+ provider?.removeListener('session_delete', sessionDelete)
+ sessionDelete = undefined
+ }
+
+ this.setRequestedChainsIds([])
+ }
+ },
+ async getAccounts() {
+ const provider = await this.getProvider()
+ return provider.accounts.map((x) => getAddress(x))
+ },
+ async getProvider({ chainId } = {}) {
+ async function initProvider() {
+ const optionalChains = config.chains.map((x) => x.id) as [number]
+ if (!optionalChains.length) return
+ const { EthereumProvider } = await import(
+ '@walletconnect/ethereum-provider'
+ )
+ return await EthereumProvider.init({
+ ...parameters,
+ disableProviderPing: true,
+ optionalChains,
+ projectId: parameters.projectId,
+ rpcMap: Object.fromEntries(
+ config.chains.map((chain) => {
+ const [url] = extractRpcUrls({
+ chain,
+ transports: config.transports,
+ })
+ return [chain.id, url]
+ }),
+ ),
+ showQrModal: parameters.showQrModal ?? true,
+ })
+ }
+
+ if (!provider_) {
+ if (!providerPromise) providerPromise = initProvider()
+ provider_ = await providerPromise
+ provider_?.events.setMaxListeners(Number.POSITIVE_INFINITY)
+ }
+ if (chainId) await this.switchChain?.({ chainId })
+ return provider_!
+ },
+ async getChainId() {
+ const provider = await this.getProvider()
+ return provider.chainId
+ },
+ async isAuthorized() {
+ try {
+ const [accounts, provider] = await Promise.all([
+ this.getAccounts(),
+ this.getProvider(),
+ ])
+
+ // If an account does not exist on the session, then the connector is unauthorized.
+ if (!accounts.length) return false
+
+ // If the chains are stale on the session, then the connector is unauthorized.
+ const isChainsStale = await this.isChainsStale()
+ if (isChainsStale && provider.session) {
+ await provider.disconnect().catch(() => {})
+ return false
+ }
+ return true
+ } catch {
+ return false
+ }
+ },
+ async switchChain({ addEthereumChainParameter, chainId }) {
+ const provider = await this.getProvider()
+ if (!provider) throw new ProviderNotFoundError()
+
+ const chain = config.chains.find((x) => x.id === chainId)
+ if (!chain) throw new SwitchChainError(new ChainNotConfiguredError())
+
+ try {
+ await Promise.all([
+ new Promise((resolve) => {
+ const listener = ({
+ chainId: currentChainId,
+ }: { chainId?: number | undefined }) => {
+ if (currentChainId === chainId) {
+ config.emitter.off('change', listener)
+ resolve()
+ }
+ }
+ config.emitter.on('change', listener)
+ }),
+ provider.request({
+ method: 'wallet_switchEthereumChain',
+ params: [{ chainId: numberToHex(chainId) }],
+ }),
+ ])
+
+ const requestedChains = await this.getRequestedChainsIds()
+ this.setRequestedChainsIds([...requestedChains, chainId])
+
+ return chain
+ } catch (err) {
+ const error = err as RpcError
+
+ if (/(user rejected)/i.test(error.message))
+ throw new UserRejectedRequestError(error)
+
+ // Indicates chain is not added to provider
+ try {
+ let blockExplorerUrls: string[] | undefined
+ if (addEthereumChainParameter?.blockExplorerUrls)
+ blockExplorerUrls = addEthereumChainParameter.blockExplorerUrls
+ else
+ blockExplorerUrls = chain.blockExplorers?.default.url
+ ? [chain.blockExplorers?.default.url]
+ : []
+
+ let rpcUrls: readonly string[]
+ if (addEthereumChainParameter?.rpcUrls?.length)
+ rpcUrls = addEthereumChainParameter.rpcUrls
+ else rpcUrls = [...chain.rpcUrls.default.http]
+
+ const addEthereumChain = {
+ blockExplorerUrls,
+ chainId: numberToHex(chainId),
+ chainName: addEthereumChainParameter?.chainName ?? chain.name,
+ iconUrls: addEthereumChainParameter?.iconUrls,
+ nativeCurrency:
+ addEthereumChainParameter?.nativeCurrency ?? chain.nativeCurrency,
+ rpcUrls,
+ } satisfies AddEthereumChainParameter
+
+ await provider.request({
+ method: 'wallet_addEthereumChain',
+ params: [addEthereumChain],
+ })
+
+ const requestedChains = await this.getRequestedChainsIds()
+ this.setRequestedChainsIds([...requestedChains, chainId])
+ return chain
+ } catch (error) {
+ throw new UserRejectedRequestError(error as Error)
+ }
+ }
+ },
+ onAccountsChanged(accounts) {
+ if (accounts.length === 0) this.onDisconnect()
+ else
+ config.emitter.emit('change', {
+ accounts: accounts.map((x) => getAddress(x)),
+ })
+ },
+ onChainChanged(chain) {
+ const chainId = Number(chain)
+ config.emitter.emit('change', { chainId })
+ },
+ async onConnect(connectInfo) {
+ const chainId = Number(connectInfo.chainId)
+ const accounts = await this.getAccounts()
+ config.emitter.emit('connect', { accounts, chainId })
+ },
+ async onDisconnect(_error) {
+ this.setRequestedChainsIds([])
+ config.emitter.emit('disconnect')
+
+ const provider = await this.getProvider()
+ if (accountsChanged) {
+ provider.removeListener('accountsChanged', accountsChanged)
+ accountsChanged = undefined
+ }
+ if (chainChanged) {
+ provider.removeListener('chainChanged', chainChanged)
+ chainChanged = undefined
+ }
+ if (disconnect) {
+ provider.removeListener('disconnect', disconnect)
+ disconnect = undefined
+ }
+ if (sessionDelete) {
+ provider.removeListener('session_delete', sessionDelete)
+ sessionDelete = undefined
+ }
+ if (!connect) {
+ connect = this.onConnect.bind(this)
+ provider.on('connect', connect)
+ }
+ },
+ onDisplayUri(uri) {
+ config.emitter.emit('message', { type: 'display_uri', data: uri })
+ },
+ onSessionDelete() {
+ this.onDisconnect()
+ },
+ getNamespaceChainsIds() {
+ if (!provider_) return []
+ const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map(
+ (account) => Number.parseInt(account.split(':')[1] || ''),
+ )
+ return chainIds ?? []
+ },
+ async getRequestedChainsIds() {
+ return (
+ (await config.storage?.getItem(this.requestedChainsStorageKey)) ?? []
+ )
+ },
+ /**
+ * Checks if the target chains match the chains that were
+ * initially requested by the connector for the WalletConnect session.
+ * If there is a mismatch, this means that the chains on the connector
+ * are considered stale, and need to be revalidated at a later point (via
+ * connection).
+ *
+ * There may be a scenario where a dapp adds a chain to the
+ * connector later on, however, this chain will not have been approved or rejected
+ * by the wallet. In this case, the chain is considered stale.
+ */
+ async isChainsStale() {
+ if (!isNewChainsStale) return false
+
+ const connectorChains = config.chains.map((x) => x.id)
+ const namespaceChains = this.getNamespaceChainsIds()
+ if (
+ namespaceChains.length &&
+ !namespaceChains.some((id) => connectorChains.includes(id))
+ )
+ return false
+
+ const requestedChains = await this.getRequestedChainsIds()
+ return !connectorChains.every((id) => requestedChains.includes(id))
+ },
+ async setRequestedChainsIds(chains) {
+ await config.storage?.setItem(this.requestedChainsStorageKey, chains)
+ },
+ get requestedChainsStorageKey() {
+ return `${this.id}.requestedChains` as Properties['requestedChainsStorageKey']
+ },
+ }))
+}
diff --git a/wagmi-project/packages/connectors/tsconfig.build.json b/wagmi-project/packages/connectors/tsconfig.build.json
new file mode 100644
index 000000000..fbed2b103
--- /dev/null
+++ b/wagmi-project/packages/connectors/tsconfig.build.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "include": ["src/**/*.ts"],
+ "exclude": ["src/**/*.test.ts", "src/**/*.test-d.ts"],
+ "compilerOptions": {
+ "sourceMap": true
+ }
+}
diff --git a/wagmi-project/packages/connectors/tsconfig.json b/wagmi-project/packages/connectors/tsconfig.json
new file mode 100644
index 000000000..bd33919ac
--- /dev/null
+++ b/wagmi-project/packages/connectors/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "./tsconfig.build.json",
+ "include": ["src/**/*.ts"],
+ "exclude": []
+}
diff --git a/wagmi-project/packages/core/CHANGELOG.md b/wagmi-project/packages/core/CHANGELOG.md
new file mode 100644
index 000000000..88b541e93
--- /dev/null
+++ b/wagmi-project/packages/core/CHANGELOG.md
@@ -0,0 +1,3365 @@
+# @wagmi/core
+
+## 2.17.2
+
+### Patch Changes
+
+- [`29297a48af72b537173d948ccd2fe37d39914c66`](https://github.com/wevm/wagmi/commit/29297a48af72b537173d948ccd2fe37d39914c66) Thanks [@jxom](https://github.com/jxom)! - Fixed `sendCalls` generics.
+
+- [`07370106d5fb6b8fe300992d93abf25b3d0eaf57`](https://github.com/wevm/wagmi/commit/07370106d5fb6b8fe300992d93abf25b3d0eaf57) Thanks [@jxom](https://github.com/jxom)! - Fixed propagation of `waitForCallsStatus` parameters.
+
+## 2.17.1
+
+### Patch Changes
+
+- [#4649](https://github.com/wevm/wagmi/pull/4649) [`01f64e64fa4f85cdd30023903f972f4f9023681f`](https://github.com/wevm/wagmi/commit/01f64e64fa4f85cdd30023903f972f4f9023681f) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` parameter to `getCapabilities`/`useCapabilities`.
+
+## 2.17.0
+
+### Minor Changes
+
+- [#4638](https://github.com/wevm/wagmi/pull/4638) [`799ee4d4b23c2ecd64e3f3668e67634e81939719`](https://github.com/wevm/wagmi/commit/799ee4d4b23c2ecd64e3f3668e67634e81939719) Thanks [@jxom](https://github.com/jxom)! - Stabilized EIP-5792 Actions & Hooks.
+
+## 2.16.7
+
+### Patch Changes
+
+- [`a4bd0623eed28e3761a27295831a60ad835f0ee0`](https://github.com/wevm/wagmi/commit/a4bd0623eed28e3761a27295831a60ad835f0ee0) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Updated `id` parameter to be optional on `useWaitForCallsStatus`.
+
+## 2.16.6
+
+### Patch Changes
+
+- [#4586](https://github.com/wevm/wagmi/pull/4586) [`edf47477b2f6385a1c3ae01d36a8498c47f30a0b`](https://github.com/wevm/wagmi/commit/edf47477b2f6385a1c3ae01d36a8498c47f30a0b) Thanks [@jxom](https://github.com/jxom)! - **Experimental (EIP-5792):** Added `waitForCallsStatus` + `useWaitForCallsStatus`.
+
+## 2.16.5
+
+### Patch Changes
+
+- [`d0c9a86921a4e939373cc6e763284e53f2a2e93c`](https://github.com/wevm/wagmi/commit/d0c9a86921a4e939373cc6e763284e53f2a2e93c) Thanks [@jxom](https://github.com/jxom)! - **Experimental (ERC-5792)**: Added support for `account: null` in `sendCalls` to cater for sending calls without a connected account (account will be filled by the wallet).
+
+## 2.16.4
+
+### Patch Changes
+
+- [`507f864d91238bfd423d0e36d3619eb9f6e52eec`](https://github.com/wevm/wagmi/commit/507f864d91238bfd423d0e36d3619eb9f6e52eec) Thanks [@jxom](https://github.com/jxom)! - Updated `@coinbase/wallet-sdk`.
+
+## 2.16.3
+
+### Patch Changes
+
+- [#4480](https://github.com/wevm/wagmi/pull/4480) [`384a1d91597622eb59e1c05dc13ce25017c5b6d8`](https://github.com/wevm/wagmi/commit/384a1d91597622eb59e1c05dc13ce25017c5b6d8) Thanks [@RodeRickIsWatching](https://github.com/RodeRickIsWatching)! - Fixed invocation of default storage.
+
+## 2.16.2
+
+### Patch Changes
+
+- [`012907032b532a438fce48f407470250cbc8f0c6`](https://github.com/wevm/wagmi/commit/012907032b532a438fce48f407470250cbc8f0c6) Thanks [@jxom](https://github.com/jxom)! - Fixed assignment in `getDefaultStorage`.
+
+## 2.16.1
+
+### Patch Changes
+
+- [#4472](https://github.com/wevm/wagmi/pull/4472) [`3892ebd21c06beef4b28ece4e70d2a38807bce6f`](https://github.com/wevm/wagmi/commit/3892ebd21c06beef4b28ece4e70d2a38807bce6f) Thanks [@tmm](https://github.com/tmm)! - Added handling to default storage for `setItem` errors, like `QuotaExceededError`, `SecurityError`, etc.
+
+## 2.16.0
+
+### Minor Changes
+
+- [#4453](https://github.com/wevm/wagmi/pull/4453) [`070e48480194c8d7f45bda1d7dd1346e6f5d7227`](https://github.com/wevm/wagmi/commit/070e48480194c8d7f45bda1d7dd1346e6f5d7227) Thanks [@tmm](https://github.com/tmm)! - Added narrowing to `config.connectors`.
+
+### Patch Changes
+
+- [`afea6b67822a7a2b96901ec851441d27ee0f7a52`](https://github.com/wevm/wagmi/commit/afea6b67822a7a2b96901ec851441d27ee0f7a52) Thanks [@tmm](https://github.com/tmm)! - Passed through parameters to `connector.connect` in `connect` action.
+
+## 2.15.2
+
+### Patch Changes
+
+- [#4433](https://github.com/wevm/wagmi/pull/4433) [`06e186cd679b27fe195309110e766fcf46d4efbc`](https://github.com/wevm/wagmi/commit/06e186cd679b27fe195309110e766fcf46d4efbc) Thanks [@Aerilym](https://github.com/Aerilym)! - Bumped Metamask SDK version to `0.31.1`.
+
+## 2.15.1
+
+### Patch Changes
+
+- [`b8bbb409f4934538e3dd6cac5aaf7346292d0693`](https://github.com/wevm/wagmi/commit/b8bbb409f4934538e3dd6cac5aaf7346292d0693) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `null` gas would accidentally pass through.
+
+## 2.15.0
+
+### Minor Changes
+
+- [#4417](https://github.com/wevm/wagmi/pull/4417) [`42e65ea4fea99c639817088bba915e0933d17141`](https://github.com/wevm/wagmi/commit/42e65ea4fea99c639817088bba915e0933d17141) Thanks [@jxom](https://github.com/jxom)! - Removed simulation in `writeContract` & `sendTransaction`.
+
+## 2.14.6
+
+### Patch Changes
+
+- [#4406](https://github.com/wevm/wagmi/pull/4406) [`a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3`](https://github.com/wevm/wagmi/commit/a13aa8d7c38eb3cc8171a02d6302e6d12cf6bcb3) Thanks [@tmm](https://github.com/tmm)! - Added support for multiple connector `rdns` entries.
+
+## 2.14.5
+
+### Patch Changes
+
+- [#4400](https://github.com/wevm/wagmi/pull/4400) [`6b9bbacdc7bffd44fc2165362a5e65fd434e7646`](https://github.com/wevm/wagmi/commit/6b9bbacdc7bffd44fc2165362a5e65fd434e7646) Thanks [@AzzouQ](https://github.com/AzzouQ)! - Fixed `createWatchContractEvent` internal wiring, where `eventName` was incorrectly `functionName`.
+
+## 2.14.4
+
+### Patch Changes
+
+- [#4311](https://github.com/wevm/wagmi/pull/4311) [`e08681c81fbdf475213e2d0f4c5517d0abf4e743`](https://github.com/wevm/wagmi/commit/e08681c81fbdf475213e2d0f4c5517d0abf4e743) Thanks [@chybisov](https://github.com/chybisov)! - Fixed `injected` connector race condition after calling `'wallet_addEthereumChain'` in `switchChain`.
+
+## 2.14.3
+
+### Patch Changes
+
+- [`cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7`](https://github.com/wevm/wagmi/commit/cb7dd2ebb871d0be8f1a11a8cd8ce592cd74b7c7) Thanks [@tmm](https://github.com/tmm)! - Removed unnecessary internal deep equal check in `structuralSharing`.
+
+## 2.14.2
+
+### Patch Changes
+
+- [#4339](https://github.com/wevm/wagmi/pull/4339) [`d0d0963bb5904a15cf0355862d62dd141ce0c31c`](https://github.com/wevm/wagmi/commit/d0d0963bb5904a15cf0355862d62dd141ce0c31c) Thanks [@AndriyAntonenko](https://github.com/AndriyAntonenko)! - Fixed bug in `waitForTransactionReceipt`, where transaction data wasn't passed to `'eth_call'` method as part of getting the revert reason.
+
+- [`ecac0ba36243d94c9199d0bd21937104c835d9a0`](https://github.com/wevm/wagmi/commit/ecac0ba36243d94c9199d0bd21937104c835d9a0) Thanks [@tmm](https://github.com/tmm)! - Fixed `getBalance` symbol error handling.
+
+## 2.14.1
+
+### Patch Changes
+
+- [`052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702`](https://github.com/wevm/wagmi/commit/052e72e1f8c1c14fcbdce04a9f8fa7ec28d83702) Thanks [@tmm](https://github.com/tmm)! - Added `defaultConnected` feature to `mock` connector.
+
+- [#4349](https://github.com/wevm/wagmi/pull/4349) [`b250fc21ee577b2a75c5a34ff684f62fb4ad771a`](https://github.com/wevm/wagmi/commit/b250fc21ee577b2a75c5a34ff684f62fb4ad771a) Thanks [@tmm](https://github.com/tmm)! - Bumped internal deps.
+
+## 2.14.0
+
+### Minor Changes
+
+- [#4343](https://github.com/wevm/wagmi/pull/4343) [`f43e074f473820b208a6295d7c97f847332f1a1d`](https://github.com/wevm/wagmi/commit/f43e074f473820b208a6295d7c97f847332f1a1d) Thanks [@tmm](https://github.com/tmm)! - Added `rdns` property to connector interface. This is used to filter out duplicate [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963) injected providers when [`createConfig#multiInjectedProviderDiscovery`](https://wagmi.sh/core/api/createConfig#multiinjectedproviderdiscovery) is enabled and `createConfig#connectors` already matches EIP-6963 providers' `rdns` property.
+
+## 2.13.9
+
+### Patch Changes
+
+- [#4336](https://github.com/wevm/wagmi/pull/4336) [`c05caabc20c3ced9682cfc7ba1f3f7dcfece0703`](https://github.com/wevm/wagmi/commit/c05caabc20c3ced9682cfc7ba1f3f7dcfece0703) Thanks [@EdouardBougon](https://github.com/EdouardBougon)! - Added deprecation notice to `injected` target flags.
+
+## 2.13.8
+
+### Patch Changes
+
+- [#4207](https://github.com/wevm/wagmi/pull/4207) [`56f2482508f2ba71bd6b0295c70c6abca7101e57`](https://github.com/wevm/wagmi/commit/56f2482508f2ba71bd6b0295c70c6abca7101e57) Thanks [@Smert](https://github.com/Smert)! - Updated chain switch listener for `injected` and `metaMask` to be more robust.
+
+## 2.13.7
+
+### Patch Changes
+
+- [`be75c2d4ef636d7362420ab0a106bfdf63f5d1e6`](https://github.com/wevm/wagmi/commit/be75c2d4ef636d7362420ab0a106bfdf63f5d1e6) Thanks [@tmm](https://github.com/tmm)! - Added guard for missing `provider.on` for `injected` connector.
+
+## 2.13.6
+
+### Patch Changes
+
+- [#4286](https://github.com/wevm/wagmi/pull/4286) [`edcbf5d6fbe92f639bead800502edda9e0aa39f1`](https://github.com/wevm/wagmi/commit/edcbf5d6fbe92f639bead800502edda9e0aa39f1) Thanks [@holic](https://github.com/holic)! - Removed duplicate code.
+
+## 2.13.5
+
+### Patch Changes
+
+- [#4259](https://github.com/wevm/wagmi/pull/4259) [`f47ce8f6d263e49fdff90b8edb3190142d2657bb`](https://github.com/wevm/wagmi/commit/f47ce8f6d263e49fdff90b8edb3190142d2657bb) Thanks [@tmm](https://github.com/tmm)! - Added guard to `getConnectorClient` when reconnecting to check if connector is fully restored.
+
+## 2.13.4
+
+### Patch Changes
+
+- [`b4c8971788c70b09479946ecfa998cff2f1b3953`](https://github.com/wevm/wagmi/commit/b4c8971788c70b09479946ecfa998cff2f1b3953) Thanks [@tmm](https://github.com/tmm)! - Made `serialize` and `deserialize` types more permissive.
+
+## 2.13.3
+
+### Patch Changes
+
+- [`871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4`](https://github.com/wevm/wagmi/commit/871dbdbfe59ac8ad01d1ec6150ea7b091b7b7de4) Thanks [@tmm](https://github.com/tmm)! - Added validation to internal state for persisted `chainId`.
+
+## 2.13.2
+
+### Patch Changes
+
+- [`1b9b523fa9b9dfe839aecdf4b40caa9547d7e594`](https://github.com/wevm/wagmi/commit/1b9b523fa9b9dfe839aecdf4b40caa9547d7e594) Thanks [@tmm](https://github.com/tmm)! - Fixed built-in cookie storage `removeItem` working for all paths.
+
+## 2.13.1
+
+### Patch Changes
+
+- [`07c1227f306d0efb9421d4bb77a774f92f5fcf45`](https://github.com/wevm/wagmi/commit/07c1227f306d0efb9421d4bb77a774f92f5fcf45) Thanks [@tmm](https://github.com/tmm)! - Fixed internal `extractRpcUrls` usage with `unstable_connector`.
+
+## 2.13.0
+
+### Minor Changes
+
+- [#4162](https://github.com/wevm/wagmi/pull/4162) [`a73a7737b756886b388f120ae423e72cca53e8a0`](https://github.com/wevm/wagmi/commit/a73a7737b756886b388f120ae423e72cca53e8a0) Thanks [@jxom](https://github.com/jxom)! - Added functionality for consumer-defined RPC URLs (`config.transports`) to be propagated to the WalletConnect & MetaMask Connectors.
+
+## 2.12.2
+
+### Patch Changes
+
+- [`5bc8c8877810b2eec24a829df87dce40a51e6f20`](https://github.com/wevm/wagmi/commit/5bc8c8877810b2eec24a829df87dce40a51e6f20) Thanks [@tmm](https://github.com/tmm)! - Fixed reconnection when `status` is defined.
+
+## 2.12.1
+
+### Patch Changes
+
+- [#4146](https://github.com/wevm/wagmi/pull/4146) [`cc996e08e930c9e88cf753a1e874652059e81a3b`](https://github.com/wevm/wagmi/commit/cc996e08e930c9e88cf753a1e874652059e81a3b) Thanks [@jxom](https://github.com/jxom)! - Updated `@safe-global/safe-apps-sdk` + `@safe-global/safe-apps-provider` dependencies.
+
+## 2.12.0
+
+### Minor Changes
+
+- [#4128](https://github.com/wevm/wagmi/pull/4128) [`5581a810ef70308e99c6f8b630cd4bca59f64afc`](https://github.com/wevm/wagmi/commit/5581a810ef70308e99c6f8b630cd4bca59f64afc) Thanks [@dalechyn](https://github.com/dalechyn)! - Added `watchAsset` action.
+
+## 2.11.8
+
+### Patch Changes
+
+- [`b08013eaa9ce97c02f8a7128ea400e3da7ef74bb`](https://github.com/wevm/wagmi/commit/b08013eaa9ce97c02f8a7128ea400e3da7ef74bb) Thanks [@tmm](https://github.com/tmm)! - Fixed injected accounts ordering for `'wallet_requestPermissions'`.
+
+- [`d3814ab4b88f9f0e052b53bc3d458df87b43f01d`](https://github.com/wevm/wagmi/commit/d3814ab4b88f9f0e052b53bc3d458df87b43f01d) Thanks [@jxom](https://github.com/jxom)! - Updated `mipd` dependency.
+
+## 2.11.7
+
+### Patch Changes
+
+- [`0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e`](https://github.com/wevm/wagmi/commit/0bb8b562ae04ecfeb2d6b2f1b980ebae31dc127e) Thanks [@tmm](https://github.com/tmm)! - Improved TypeScript `'exactOptionalPropertyTypes'` support.
+
+## 2.11.6
+
+### Patch Changes
+
+- [#4060](https://github.com/wevm/wagmi/pull/4060) [`95965c1f19d480b97f2b297a077a9e607dee32ad`](https://github.com/wevm/wagmi/commit/95965c1f19d480b97f2b297a077a9e607dee32ad) Thanks [@dalechyn](https://github.com/dalechyn)! - Bumped Tanstack Query dependencies to fix typing issues between exported Wagmi query options and TanStack Query suspense query methods (due to [`direction` property in `QueryFunctionContext` being deprecated](https://github.com/TanStack/query/pull/7410)).
+
+## 2.11.5
+
+### Patch Changes
+
+- [#4079](https://github.com/wevm/wagmi/pull/4079) [`04f2b846b113f3d300d82c9fa75212f1805817c5`](https://github.com/wevm/wagmi/commit/04f2b846b113f3d300d82c9fa75212f1805817c5) Thanks [@tmm](https://github.com/tmm)! - Added revalidation for config chain ID in SSR and migration.
+
+## 2.11.4
+
+### Patch Changes
+
+- [`9e8345cd56186b997b5e56deaa2cfc69b30d15f6`](https://github.com/wevm/wagmi/commit/9e8345cd56186b997b5e56deaa2cfc69b30d15f6) Thanks [@tmm](https://github.com/tmm)! - Switched `Register` to `interface` to fix declaration merging.
+
+## 2.11.3
+
+### Patch Changes
+
+- [#4065](https://github.com/wevm/wagmi/pull/4065) [`8974e6269bb5d7bfaa90db0246bc7d13e8bff798`](https://github.com/wevm/wagmi/commit/8974e6269bb5d7bfaa90db0246bc7d13e8bff798) Thanks [@alx-khramov](https://github.com/alx-khramov)! - Added timeout to internal call of `'wallet_revokePermissions'` request during `injected#disconnect` as some wallets that do not support this method hang.
+
+## 2.11.2
+
+### Patch Changes
+
+- [#4042](https://github.com/wevm/wagmi/pull/4042) [`b4d9ef79deb554ee20fed6666a474be5e7cdd522`](https://github.com/wevm/wagmi/commit/b4d9ef79deb554ee20fed6666a474be5e7cdd522) Thanks [@tmm](https://github.com/tmm)! - Removed `injected` connector `isAuthorized` timeout.
+
+## 2.11.1
+
+### Patch Changes
+
+- [`9c862d8d63e3d692a22cef2a90782b74a9103f17`](https://github.com/wevm/wagmi/commit/9c862d8d63e3d692a22cef2a90782b74a9103f17) Thanks [@tmm](https://github.com/tmm)! - Reverted internal module loading utility.
+
+## 2.11.0
+
+### Minor Changes
+
+- [#3816](https://github.com/wevm/wagmi/pull/3816) [`06bb598a7f04c7b167f5b7ff6d46bd15886a6a14`](https://github.com/wevm/wagmi/commit/06bb598a7f04c7b167f5b7ff6d46bd15886a6a14) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `deployContract` action.
+
+### Patch Changes
+
+- [`24a45b269bd0214a29d6f82a84ac66ef8c3f3822`](https://github.com/wevm/wagmi/commit/24a45b269bd0214a29d6f82a84ac66ef8c3f3822) Thanks [@tmm](https://github.com/tmm)! - Added `SameSite` default to `cookieStorage`
+
+## 2.10.6
+
+### Patch Changes
+
+- [#4009](https://github.com/wevm/wagmi/pull/4009) [`f2a7cefab96691ebed8b8e45ffde071c47b58dbe`](https://github.com/wevm/wagmi/commit/f2a7cefab96691ebed8b8e45ffde071c47b58dbe) Thanks [@roninjin10](https://github.com/roninjin10)! - Marked `to` as optional for `sendTransaction`.
+
+- [#4023](https://github.com/wevm/wagmi/pull/4023) [`f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5`](https://github.com/wevm/wagmi/commit/f0ea0b2a7fe193dadfeb49a4c8031ee451c638b5) Thanks [@jxom](https://github.com/jxom)! - Added chain check to `getConnectorClient` since it's possible for connection state chain ID to get out of sync with the connector (e.g. [wallet bug](https://github.com/MetaMask/metamask-extension/issues/25097)).
+
+## 2.10.5
+
+### Patch Changes
+
+- [#3970](https://github.com/wevm/wagmi/pull/3970) [`030c7c2cb380dfd67a2182f62e2aa7a6e1601898`](https://github.com/wevm/wagmi/commit/030c7c2cb380dfd67a2182f62e2aa7a6e1601898) Thanks [@nanxiaobei](https://github.com/nanxiaobei)! - Fixed `cookieStorage` not working across paths.
+
+## 2.10.4
+
+### Patch Changes
+
+- [#3984](https://github.com/wevm/wagmi/pull/3984) [`51fde8a0433b4fff357c1a8d7e08b41b4c86c968`](https://github.com/wevm/wagmi/commit/51fde8a0433b4fff357c1a8d7e08b41b4c86c968) Thanks [@tmm](https://github.com/tmm)! - Fixed `writeContract` query types for `value` property.
+
+## 2.10.3
+
+### Patch Changes
+
+- [#3962](https://github.com/wevm/wagmi/pull/3962) [`2804a8a583b1874271154898b4bae38756ef581c`](https://github.com/wevm/wagmi/commit/2804a8a583b1874271154898b4bae38756ef581c) Thanks [@tmm](https://github.com/tmm)! - Added catch to `reconnect`.
+
+## 2.10.2
+
+### Patch Changes
+
+- [#3940](https://github.com/wevm/wagmi/pull/3940) [`a5071f581dfdfb961718873643a2fc629101c72a`](https://github.com/wevm/wagmi/commit/a5071f581dfdfb961718873643a2fc629101c72a) Thanks [@jxom](https://github.com/jxom)! - Fixed usage of `metaMask` connector in Vite environments.
+
+## 2.10.1
+
+### Patch Changes
+
+- Bumped versions.
+
+## 2.10.0
+
+### Minor Changes
+
+- [#3928](https://github.com/wevm/wagmi/pull/3928) [`3117e71825f9c58a0d718f3d1686f1a191fa9cb1`](https://github.com/wevm/wagmi/commit/3117e71825f9c58a0d718f3d1686f1a191fa9cb1) Thanks [@tmm](https://github.com/tmm)! - Updated the default Coinbase SDK in `coinbaseWallet` Connector to v4.x.
+
+## 2.9.8
+
+### Patch Changes
+
+- [#3906](https://github.com/wevm/wagmi/pull/3906) [`32fcb4a31dde6b0206961d8ffe9c651f8a459c67`](https://github.com/wevm/wagmi/commit/32fcb4a31dde6b0206961d8ffe9c651f8a459c67) Thanks [@tmm](https://github.com/tmm)! - Added support for Vue.
+
+## 2.9.7
+
+### Patch Changes
+
+- [#3924](https://github.com/wevm/wagmi/pull/3924) [`1f58734f88458e0f6adb05c99f0c90f36ab286b8`](https://github.com/wevm/wagmi/commit/1f58734f88458e0f6adb05c99f0c90f36ab286b8) Thanks [@jxom](https://github.com/jxom)! - Refactored `isChainsStale` logic in `walletConnect` connector.
+
+## 2.9.6
+
+### Patch Changes
+
+- [#3917](https://github.com/wevm/wagmi/pull/3917) [`05948fdad5bb4a56b08916d45b3dec2cb1e5f55b`](https://github.com/wevm/wagmi/commit/05948fdad5bb4a56b08916d45b3dec2cb1e5f55b) Thanks [@jxom](https://github.com/jxom)! - Updated `@metamask/sdk`.
+
+## 2.9.5
+
+### Patch Changes
+
+- [`4fecbbb66d0aacd03b8c62a6455d11a33cde8f85`](https://github.com/wevm/wagmi/commit/4fecbbb66d0aacd03b8c62a6455d11a33cde8f85) Thanks [@jxom](https://github.com/jxom)! - Fixed address comparison in `getConnectorClient`.
+
+## 2.9.4
+
+### Patch Changes
+
+- [#3910](https://github.com/wevm/wagmi/pull/3910) [`e6139a97c4b8804d734b1547b5e3921ce01fbe24`](https://github.com/wevm/wagmi/commit/e6139a97c4b8804d734b1547b5e3921ce01fbe24) Thanks [@tmm](https://github.com/tmm)! - Added experimental `wallet_revokePermissions` support to `injected`.
+
+## 2.9.3
+
+### Patch Changes
+
+- [#3904](https://github.com/wevm/wagmi/pull/3904) [`addca28ebc20f1a4367c35fe9ef786decff9c87e`](https://github.com/wevm/wagmi/commit/addca28ebc20f1a4367c35fe9ef786decff9c87e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.
+
+## 2.9.2
+
+### Patch Changes
+
+- [#3902](https://github.com/wevm/wagmi/pull/3902) [`204b7b624612405500ec098fb9e35facd3f74ca4`](https://github.com/wevm/wagmi/commit/204b7b624612405500ec098fb9e35facd3f74ca4) Thanks [@jxom](https://github.com/jxom)! - Made third-party SDK imports type-only.
+
+## 2.9.1
+
+### Patch Changes
+
+- [`cda6a5d5`](https://github.com/wevm/wagmi/commit/cda6a5d56328330fbde050b4ef40b01c58d2519a) Thanks [@jxom](https://github.com/jxom)! - Updated packages.
+
+## 2.9.0
+
+### Minor Changes
+
+- [#3878](https://github.com/wevm/wagmi/pull/3878) [`017828fc`](https://github.com/wevm/wagmi/commit/017828fc027c7a84b54ea9d627e9389f4d60d6c2) Thanks [@jxom](https://github.com/jxom)! - Added experimental EIP-5792 Actions & Hooks.
+
+## 2.8.1
+
+### Patch Changes
+
+- [#3869](https://github.com/wevm/wagmi/pull/3869) [`d4a78eb0`](https://github.com/wevm/wagmi/commit/d4a78eb07119d2e5617e52481ac7d6c6d1583ddc) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `prepareTransactionRequest` would internally call unsupported wallet RPC methods.
+
+## 2.8.0
+
+### Minor Changes
+
+- [#3868](https://github.com/wevm/wagmi/pull/3868) [`c2af20b8`](https://github.com/wevm/wagmi/commit/c2af20b88cf16970d087faaec10b463357a5836e) Thanks [@jxom](https://github.com/jxom)! - Added `supportsSimulation` property to connectors that indicates if the connector's wallet supports contract simulation.
+
+### Patch Changes
+
+- [#3858](https://github.com/wevm/wagmi/pull/3858) [`0d141f17`](https://github.com/wevm/wagmi/commit/0d141f171d6ec44bcbfc9c876565b5e2fb8af6de) Thanks [@yulafezmesi](https://github.com/yulafezmesi)! - Fixed accessing reverted reason property inside `waitForTransactionReceipt`.
+
+## 2.7.0
+
+### Minor Changes
+
+- [#3857](https://github.com/wevm/wagmi/pull/3857) [`d4274c03`](https://github.com/wevm/wagmi/commit/d4274c03a6af5f2d26d31432016ebc14950a330e) Thanks [@tmm](https://github.com/tmm)! - Added `addEthereumChainParameter` to `switchChain`-related methods.
+
+### Patch Changes
+
+- [#3849](https://github.com/wevm/wagmi/pull/3849) [`4781a405`](https://github.com/wevm/wagmi/commit/4781a4056d4ffc2c74f96a75429e9b2cd2417ad8) Thanks [@tmm](https://github.com/tmm)! - Fixed `shimDisconnect: false` behavior.
+
+- [#3859](https://github.com/wevm/wagmi/pull/3859) [`400c960b`](https://github.com/wevm/wagmi/commit/400c960b30d701c134850c695ae903a382c29b5b) Thanks [@holic](https://github.com/holic)! - Added workaround to injected connector for MetaMask bug, where chain switching does not work if target chain RPC `'net_version'` request fails.
+
+## 2.6.19
+
+### Patch Changes
+
+- [`e3c832a1`](https://github.com/wevm/wagmi/commit/e3c832a12c301f9b0ee129d877b3101d220ba8b2) Thanks [@jxom](https://github.com/jxom)! - Fixed undefined `navigator` issue in MetaMask connector.
+
+## 2.6.18
+
+### Patch Changes
+
+- [#3848](https://github.com/wevm/wagmi/pull/3848) [`dd40a41c`](https://github.com/wevm/wagmi/commit/dd40a41c526ab60a288aff2250ed8dba92a27b16) Thanks [@jxom](https://github.com/jxom)! - Updated MetaMask SDK.
+
+## 2.6.17
+
+### Patch Changes
+
+- [#3822](https://github.com/wevm/wagmi/pull/3822) [`a97bfbae`](https://github.com/wevm/wagmi/commit/a97bfbaeb615cfef04665e5e7348d85d17f960f0) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where Wagmi would not correctly rehydrate the active chain when a persisted store was being used.
+
+## 2.6.16
+
+### Patch Changes
+
+- [#3788](https://github.com/wevm/wagmi/pull/3788) [`42ad380d`](https://github.com/wevm/wagmi/commit/42ad380d9a5d8bc0f61d73612142dea9d098de5e) Thanks [@tmm](https://github.com/tmm)! - Refactored connectors to remove unnecessarily event listeners.
+
+## 2.6.15
+
+### Patch Changes
+
+- [#3782](https://github.com/wevm/wagmi/pull/3782) [`b907d5ac`](https://github.com/wevm/wagmi/commit/b907d5ac3a746bcbccc06d1fe78c5bd8f9a7d685) Thanks [@jxom](https://github.com/jxom)! - Refactored injected connector connection logic.
+
+## 2.6.14
+
+### Patch Changes
+
+- [#3777](https://github.com/wevm/wagmi/pull/3777) [`b3b54ef1`](https://github.com/wevm/wagmi/commit/b3b54ef179c5fa0d1694d38d4b808549a0550409) Thanks [@desfero](https://github.com/desfero)! - Fixed `writeContract` to forward `chainIn` when simulating contract call
+
+- [#3779](https://github.com/wevm/wagmi/pull/3779) [`3da20bb8`](https://github.com/wevm/wagmi/commit/3da20bb80e7c3efeef8227ced66ad615370fc242) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `eth_requestAccounts` would be called upon reconnect instead of `eth_accounts`.
+
+- [`a3d1858f`](https://github.com/wevm/wagmi/commit/a3d1858fce448d2b70e36ee692ef1589b74e9d3f) Thanks [@jxom](https://github.com/jxom)! - Fixed hydration conditional in `createConfig`.
+
+## 2.6.13
+
+### Patch Changes
+
+- [`b80236dc`](https://github.com/wevm/wagmi/commit/b80236dc623095fe8f1e1d10957d7776fb6ab48b) Thanks [@jxom](https://github.com/jxom)! - Removed unneeded `uniqueBy` check on connectors state.
+
+## 2.6.12
+
+### Patch Changes
+
+- [#3763](https://github.com/wevm/wagmi/pull/3763) [`a59069e9`](https://github.com/wevm/wagmi/commit/a59069e9fab45dd606bb89a7f829fe94c51a5494) Thanks [@tmm](https://github.com/tmm)! - Fixed `getConnectorClient` internal address comparison.
+
+- [#3608](https://github.com/wevm/wagmi/pull/3608) [`0acd3132`](https://github.com/wevm/wagmi/commit/0acd31320f534993af566be5490c2978b6184f66) Thanks [@mqklin](https://github.com/mqklin)! - Disabled `wallet_requestPermissions` prompt when `shimDisconnect` is `false`.
+
+## 2.6.11
+
+### Patch Changes
+
+- [`e1ca4e63`](https://github.com/wevm/wagmi/commit/e1ca4e637ae6cec7f5902b0a2c0e0efc3b751a1d) Thanks [@tmm](https://github.com/tmm)! - Deprecated `normalizeChainId`. Use `Number` instead.
+
+## 2.6.10
+
+### Patch Changes
+
+- [`dbdca8fd`](https://github.com/wevm/wagmi/commit/dbdca8fd14b90c166222a66a373c1b33c06ce019) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where duplicate connectors could be instantiated if injected after page mount.
+
+## 2.6.9
+
+### Patch Changes
+
+- [#3715](https://github.com/wevm/wagmi/pull/3715) [`d56edf4f`](https://github.com/wevm/wagmi/commit/d56edf4f27c52acc7a0f57114454b0d3e22cacd6) Thanks [@jxom](https://github.com/jxom)! - Fixed SSR hydration issues.
+
+## 2.6.8
+
+### Patch Changes
+
+- [#3643](https://github.com/wevm/wagmi/pull/3643) [`e46bcd47`](https://github.com/wevm/wagmi/commit/e46bcd4738a18da15b53f6612b614379c1985374) Thanks [@TateB](https://github.com/TateB)! - Fixed race condition arising from `reconnect`.
+
+## 2.6.7
+
+### Patch Changes
+
+- [#3642](https://github.com/wevm/wagmi/pull/3642) [`b479b5e8`](https://github.com/wevm/wagmi/commit/b479b5e8a5866cba792862f22e6352c4fb566137) Thanks [@johanneskares](https://github.com/johanneskares)! - Fixed a bug where minification caused the wrong functions to be called on the client.
+
+- [`f5648dd2`](https://github.com/wevm/wagmi/commit/f5648dd28b3576b628f57732b89287f55acbb1c1) Thanks [@jxom](https://github.com/jxom)! - Updated `prepareTransactionRequest` types for `viem@2.8.0`.
+
+- [`1c1fee6a`](https://github.com/wevm/wagmi/commit/1c1fee6ab8f01f7734ac6ce05093fa8e388beb3e) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/ethereum-provider`.
+
+- [#3653](https://github.com/wevm/wagmi/pull/3653) [`88a2d744`](https://github.com/wevm/wagmi/commit/88a2d744a1315908c9e54156026df3ad2435ad44) Thanks [@tash-2s](https://github.com/tash-2s)! - Fixed error occurring when adding chains without explorers to MetaMask.
+
+## 2.6.6
+
+### Patch Changes
+
+- [#3644](https://github.com/wevm/wagmi/pull/3644) [`a91c0b64`](https://github.com/wevm/wagmi/commit/a91c0b64ba8b3e6537a560e69724eb601f26af27) Thanks [@nishuzumi](https://github.com/nishuzumi)! - Exported types
+
+## 2.6.5
+
+### Patch Changes
+
+- [#3580](https://github.com/wevm/wagmi/pull/3580) [`c677dcd2`](https://github.com/wevm/wagmi/commit/c677dcd245dccdf69289a3d66dded237b09570a2) Thanks [@tmm](https://github.com/tmm)! - Updated internals.
+
+## 2.6.4
+
+### Patch Changes
+
+- [#3571](https://github.com/wevm/wagmi/pull/3571) [`7c6618e6`](https://github.com/wevm/wagmi/commit/7c6618e6a0eb1ff39cf8f66b34d3ddc14be538fe) Thanks [@tmm](https://github.com/tmm)! - Fixed `getClient` passthrough properties from `createConfig`.
+
+- [#3558](https://github.com/wevm/wagmi/pull/3558) [`895f28e8`](https://github.com/wevm/wagmi/commit/895f28e873af7c8eda5ca85734ff67c8979fd950) Thanks [@tmm](https://github.com/tmm)! - Fixed connector warnings.
+
+## 2.6.3
+
+### Patch Changes
+
+- [#3533](https://github.com/wevm/wagmi/pull/3533) [`9c3b85dd`](https://github.com/wevm/wagmi/commit/9c3b85dd0a9a4a593e1d7e029345275735330e32) Thanks [@tmm](https://github.com/tmm)! - Fixed `account` property passthrough for actions.
+
+- [`2a72214a`](https://github.com/wevm/wagmi/commit/2a72214a2901d6b6ddd39f80238aa0bd4db670a7) Thanks [@tmm](https://github.com/tmm)! - Shimmed EIP-1193 `removeListener` for injected since some wallets do not follow spec.
+
+## 2.6.2
+
+### Patch Changes
+
+- [#3519](https://github.com/wevm/wagmi/pull/3519) [`414eb048`](https://github.com/wevm/wagmi/commit/414eb048af492caac70c0e874dfc87c30702804a) Thanks [@tmm](https://github.com/tmm)! - Fixed multicall passing through all properties to Viem method.
+
+- [#3518](https://github.com/wevm/wagmi/pull/3518) [`338e857d`](https://github.com/wevm/wagmi/commit/338e857d8cb2fe85e13d9207bef14cada1c1962d) Thanks [@tmm](https://github.com/tmm)! - Fixed internal store migration between versions.
+
+## 2.6.1
+
+### Patch Changes
+
+- [#3510](https://github.com/wevm/wagmi/pull/3510) [`660ff80d`](https://github.com/wevm/wagmi/commit/660ff80d5b046967a446eba43ee54b8359a37d0d) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where connectors returning multiple addresses didn't checksum correctly.
+
+- [#3433](https://github.com/wevm/wagmi/pull/3433) [`101a7dd1`](https://github.com/wevm/wagmi/commit/101a7dd131b0cae2dc25579ecab9044290efd37b) Thanks [@tmm](https://github.com/tmm)! - Fixed `getClient` and `getPublicClient` throwing when used with unconfigured `chainId`.
+
+## 2.6.0
+
+### Minor Changes
+
+- [#3496](https://github.com/wevm/wagmi/pull/3496) [`ba7f8a75`](https://github.com/wevm/wagmi/commit/ba7f8a758efb07664c6e401b5e7e325e7c62341b) Thanks [@tmm](https://github.com/tmm)! - Updated action internals to resolve Viem Client actions.
+
+## 2.5.0
+
+### Minor Changes
+
+- [#3461](https://github.com/wevm/wagmi/pull/3461) [`ca98041d`](https://github.com/wevm/wagmi/commit/ca98041d1b39893d90246929485f4db0d1c6f9f7) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getTransactionConfirmations` action.
+
+## 2.4.0
+
+### Minor Changes
+
+- [#3427](https://github.com/wevm/wagmi/pull/3427) [`370f1b4a`](https://github.com/wevm/wagmi/commit/370f1b4a3f154d181acf381c31c2e7862e22c0e4) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `prepareTransactionRequest` action.
+
+## 2.3.1
+
+### Patch Changes
+
+- [#3476](https://github.com/wevm/wagmi/pull/3476) [`3be5bb7b`](https://github.com/wevm/wagmi/commit/3be5bb7b0b38646e12e6da5c762ef74dff66bcc2) Thanks [@jxom](https://github.com/jxom)! - Modified persist strategy to only store "critical" properties that are needed before hydration.
+
+## 2.3.0
+
+### Minor Changes
+
+- [#3459](https://github.com/wevm/wagmi/pull/3459) [`d950b666`](https://github.com/wevm/wagmi/commit/d950b666b56700ca039ce16cdfdf34564991e7f5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getEnsText` action.
+
+### Patch Changes
+
+- [#3467](https://github.com/wevm/wagmi/pull/3467) [`90ef39bb`](https://github.com/wevm/wagmi/commit/90ef39bb0f4ecb3c914d317875348e35ba0f4524) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where connectors that share the same provider instance could reconnect when they have never been connected before.
+
+- [`1cfb6e5a`](https://github.com/wevm/wagmi/commit/1cfb6e5a875e707abcee00dd5739e87da05e8c90) Thanks [@jxom](https://github.com/jxom)! - Bumped listener limit on WalletConnect connector.
+
+## 2.2.1
+
+### Patch Changes
+
+- [#3447](https://github.com/wevm/wagmi/pull/3447) [`a02a26ad`](https://github.com/wevm/wagmi/commit/a02a26ad030d3afb78f744377d61b5c60b65d97a) Thanks [@tmm](https://github.com/tmm)! - Fixed account typing.
+
+- [#3443](https://github.com/wevm/wagmi/pull/3443) [`007024a6`](https://github.com/wevm/wagmi/commit/007024a684ddbecf924cdc06dd6a8854fc3d5eeb) Thanks [@jmrossy](https://github.com/jmrossy)! - Fixed invalid `chainId` parameter passed through actions to Viem.
+
+## 2.2.0
+
+### Minor Changes
+
+- [#3434](https://github.com/wevm/wagmi/pull/3434) [`00bf10a4`](https://github.com/wevm/wagmi/commit/00bf10a428b0d1c5dac35ebf25b19571e033ac26) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getBytecode` and `getStorageAt` actions.
+
+- [#3416](https://github.com/wevm/wagmi/pull/3416) [`64c073f6`](https://github.com/wevm/wagmi/commit/64c073f6c2720961e2d6aff986670b73dbfab9c3) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getTransactionReceipt` action.
+
+- [#3408](https://github.com/wevm/wagmi/pull/3408) [`fb6c4148`](https://github.com/wevm/wagmi/commit/fb6c4148d9e9e2fccfbe74c8f343b444dc68dec5) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `getProof` action.
+
+## 2.1.2
+
+### Patch Changes
+
+- [#3407](https://github.com/wevm/wagmi/pull/3407) [`e00b8205`](https://github.com/wevm/wagmi/commit/e00b82058685751637edfa9a6b2d196a12549fe7) Thanks [@jxom](https://github.com/jxom)! - Added a prelude gas estimate check to `sendTransaction`/`useSendTransaction`.
+
+## 2.1.1
+
+### Patch Changes
+
+- [#3402](https://github.com/wevm/wagmi/pull/3402) [`64b82282`](https://github.com/wevm/wagmi/commit/64b82282c1e57e77c25aa0814673780e4d11edd4) Thanks [@Songkeys](https://github.com/Songkeys)! - Fixed SSR cookie support for cookies that have special characters, e.g. `=`.
+
+- [`ec0d8b41`](https://github.com/wevm/wagmi/commit/ec0d8b4112181fefb11025e436a94a6114761d37) Thanks [@tmm](https://github.com/tmm)! - Added note to `metaMask` connector.
+
+## 2.1.0
+
+### Minor Changes
+
+- [#3387](https://github.com/wevm/wagmi/pull/3387) [`c9cd302e`](https://github.com/wevm/wagmi/commit/c9cd302e1c65c980deaee2e12567c2a8ec08b399) Thanks [@marthendalnunes](https://github.com/marthendalnunes)! - Added `call` action.
+
+## 2.0.2
+
+### Patch Changes
+
+- [#3384](https://github.com/wevm/wagmi/pull/3384) [`ee868c33`](https://github.com/wevm/wagmi/commit/ee868c3385dae511230b6ddcb5627c1293cc1844) Thanks [@tmm](https://github.com/tmm)! - Fixed connectors not bubbling error when connecting with `chainId` and subsequent user rejection.
+
+## 2.0.1
+
+### Major Changes
+
+- [#3333](https://github.com/wevm/wagmi/pull/3333) [`b3a0baaa`](https://github.com/wevm/wagmi/commit/b3a0baaaee7decf750d376aab2502cd33ca4825a) Thanks [@tmm](https://github.com/tmm)! - Wagmi Core 2.0 featuring:
+
+ - Full TanStack Query support + queryKeys
+ - Connect multiple connectors
+ - Switch chains while disconnected
+ - EIP-6963 enabled
+ - Strongly typed chainId and chain properties
+ - Smaller bundle size
+ - Miscellaneous improvements and bug fixes
+
+ [Breaking Changes & Migration Guide](https://wagmi.sh/core/guides/migrate-from-v1-to-v2)
+
+## 1.4.13
+
+### Patch Changes
+
+- Updated dependencies [[`bbbbf587`](https://github.com/wevm/wagmi/commit/bbbbf587e41bae12b072b7a7c897d580fc07cd2b)]:
+ - @wagmi/connectors@3.1.11
+
+## 1.4.12
+
+### Patch Changes
+
+- [`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c) Thanks [@tmm](https://github.com/tmm)! - Removed LedgerConnector due to security vulnerability
+
+- Updated dependencies [[`53ca1f7e`](https://github.com/wevm/wagmi/commit/53ca1f7eb411d912e11fcce7e03bd61ed067959c)]:
+ - @wagmi/connectors@3.1.10
+
+## 1.4.11
+
+### Patch Changes
+
+- [#3299](https://github.com/wevm/wagmi/pull/3299) [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e) Thanks [@dasanra](https://github.com/dasanra)! - Fixed issue with [Safe SDK](https://github.com/wevm/viem/issues/579) by bumping `@safe-global/safe-apps-provider@0.18.1`
+
+- Updated dependencies [[`51eca0fb`](https://github.com/wevm/wagmi/commit/51eca0fbaea6932f31a5b8b4213f0252280053e2), [`b02020b3`](https://github.com/wevm/wagmi/commit/b02020b3724e0228198f35817611bb063295906e)]:
+ - @wagmi/connectors@3.1.9
+
+## 1.4.10
+
+### Patch Changes
+
+- Updated dependencies [[`e8f7bcbc`](https://github.com/wevm/wagmi/commit/e8f7bcbcd9c038a901c29e71769682c088efe2ac)]:
+ - @wagmi/connectors@3.1.8
+
+## 1.4.9
+
+### Patch Changes
+
+- [#3276](https://github.com/wevm/wagmi/pull/3276) [`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf) Thanks [@glitch-txs](https://github.com/glitch-txs)! - Removed required namespaces from WalletConnect connector
+
+- Updated dependencies [[`83223a06`](https://github.com/wevm/wagmi/commit/83223a0659e2f675d897a1d3374c7af752c16abf)]:
+ - @wagmi/connectors@3.1.7
+
+## 1.4.8
+
+### Patch Changes
+
+- Updated dependencies [[`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975), [`cc7e18f2`](https://github.com/wevm/wagmi/commit/cc7e18f2e7f6b8b989f60f0b05aee70e996a9975)]:
+ - @wagmi/connectors@3.1.6
+
+## 1.4.7
+
+### Patch Changes
+
+- Updated dependencies [[`a1950449`](https://github.com/wagmi-dev/wagmi/commit/a1950449127ddf72fff8ecd1fc34c3690befbb05)]:
+ - @wagmi/connectors@3.1.5
+
+## 1.4.6
+
+### Patch Changes
+
+- Updated dependencies [[`4e6ec415`](https://github.com/wagmi-dev/wagmi/commit/4e6ec4151baece94e940e227e0e3711c7f8534d9)]:
+ - @wagmi/connectors@3.1.4
+
+## 1.4.5
+
+### Patch Changes
+
+- Updated dependencies [[`e78aa337`](https://github.com/wagmi-dev/wagmi/commit/e78aa337c454f04b41a3cbd381d25270dd4a0afd)]:
+ - @wagmi/connectors@3.1.3
+
+## 1.4.4
+
+### Patch Changes
+
+- [#3125](https://github.com/wagmi-dev/wagmi/pull/3125) [`725e73fe`](https://github.com/wagmi-dev/wagmi/commit/725e73feb9143dbaa6d540bb76d2009cef29da0b) Thanks [@lukasrosario](https://github.com/lukasrosario)! - Fixed an issue where `dataSuffix` was not being passed down into viem's `simulateContract`, causing the data to be omitted from requests.
+
+## 1.4.3
+
+### Patch Changes
+
+- [#3076](https://github.com/wagmi-dev/wagmi/pull/3076) [`4c36831b`](https://github.com/wagmi-dev/wagmi/commit/4c36831b7aa44d03b5c0decf64dcd20faae28a67) Thanks [@jxom](https://github.com/jxom)! - Pass `chain` to viem `sendTransaction`/`writeContract`.
+
+- [#3006](https://github.com/wagmi-dev/wagmi/pull/3006) [`f2ddce23`](https://github.com/wagmi-dev/wagmi/commit/f2ddce23324aff0a91e066100918dac552dc3b4a) Thanks [@jxom](https://github.com/jxom)! - Changed `normalize` to a dynamic import.
+
+## 1.4.2
+
+### Patch Changes
+
+- Updated dependencies [[`3aaba328`](https://github.com/wagmi-dev/wagmi/commit/3aaba32808ddb4035ec885f96992c91078056715)]:
+ - @wagmi/connectors@3.1.2
+
+## 1.4.1
+
+### Patch Changes
+
+- Updated dependencies [[`bf831bb3`](https://github.com/wagmi-dev/wagmi/commit/bf831bb30df8037cc4312342d0fe3c045408c2fe)]:
+ - @wagmi/connectors@3.1.1
+
+## 1.4.0
+
+### Minor Changes
+
+- [#2956](https://github.com/wagmi-dev/wagmi/pull/2956) [`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895) Thanks [@tmm](https://github.com/tmm)! - Replaced `@wagmi/chains` with `viem/chains`.
+
+### Patch Changes
+
+- Updated dependencies [[`2abeb285`](https://github.com/wagmi-dev/wagmi/commit/2abeb285674af3e539cc2550b1f5027b1eb0c895)]:
+ - @wagmi/connectors@3.1.0
+
+## 1.3.10
+
+### Patch Changes
+
+- [`557e6400`](https://github.com/wagmi-dev/wagmi/commit/557e6400b9cef3b2c5131739143956c37d7c934a) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.9
+
+### Patch Changes
+
+- [`247c5d11`](https://github.com/wagmi-dev/wagmi/commit/247c5d113e83acf3a6894264c00d4b125d455107) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.8
+
+### Patch Changes
+
+- [#2741](https://github.com/wagmi-dev/wagmi/pull/2741) [`5b1453d9`](https://github.com/wagmi-dev/wagmi/commit/5b1453d95973ed51f1c235a919fffb707eab9b70) Thanks [@jxom](https://github.com/jxom)! - Updated references
+
+## 1.3.7
+
+### Patch Changes
+
+- [#2700](https://github.com/wagmi-dev/wagmi/pull/2700) [`30118e97`](https://github.com/wagmi-dev/wagmi/commit/30118e979b1b00302e035f31f58c15d1aed911d5) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.6
+
+### Patch Changes
+
+- [`7ad2fdb8`](https://github.com/wagmi-dev/wagmi/commit/7ad2fdb81c7734d0c8107670800c68390e3bad99) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.5
+
+### Patch Changes
+
+- [`aab63fc1`](https://github.com/wagmi-dev/wagmi/commit/aab63fc1f8949004573978ecd8574fada3360758) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.4
+
+### Patch Changes
+
+- [`22246d98`](https://github.com/wagmi-dev/wagmi/commit/22246d9884277d28ccad6ca2d9529b96b67d47fc) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.3
+
+### Patch Changes
+
+- [`1946aa43`](https://github.com/wagmi-dev/wagmi/commit/1946aa43a65b684ef41b7b4c43c67bf29c13e854) Thanks [@jxom](https://github.com/jxom)! - Updated references
+
+## 1.3.2
+
+### Patch Changes
+
+- [`e86d0940`](https://github.com/wagmi-dev/wagmi/commit/e86d09409bb20b64d24e1263abcf0291314f03c7) Thanks [@jxom](https://github.com/jxom)! - Updated references
+
+## 1.3.1
+
+### Patch Changes
+
+- [`964042fa`](https://github.com/wagmi-dev/wagmi/commit/964042fa94d682977923c595820c58283fb9244a) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.3.0
+
+### Minor Changes
+
+- [#2619](https://github.com/wagmi-dev/wagmi/pull/2619) [`0d79748c`](https://github.com/wagmi-dev/wagmi/commit/0d79748cec2b6ac2410ad2c9816cc662f2b70962) Thanks [@jxom](https://github.com/jxom)! - Updated references:
+ - Updated `@safe-global/safe-apps-sdk` to `^8.0.0` (the one with `viem` support)
+
+## 1.2.2
+
+### Patch Changes
+
+- [#2611](https://github.com/wagmi-dev/wagmi/pull/2611) [`6d1ed7a1`](https://github.com/wagmi-dev/wagmi/commit/6d1ed7a156729b4df5d66fef3ae9a8b5762a2d34) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.2.1
+
+### Patch Changes
+
+- [#2589](https://github.com/wagmi-dev/wagmi/pull/2589) [`9680c347`](https://github.com/wagmi-dev/wagmi/commit/9680c347476500d28ceca20d23eeaed7931cb6e0) Thanks [@jxom](https://github.com/jxom)! - Fixed `writeContract` parameters to be compatible with `prepareWriteContract`.
+
+- [#2587](https://github.com/wagmi-dev/wagmi/pull/2587) [`cfff9994`](https://github.com/wagmi-dev/wagmi/commit/cfff999459384ac644ff7e62f53a7b787cf37507) Thanks [@jxom](https://github.com/jxom)! - Updated references
+
+## 1.2.0
+
+### Minor Changes
+
+- [#2536](https://github.com/wagmi-dev/wagmi/pull/2536) [`85e9760a`](https://github.com/wagmi-dev/wagmi/commit/85e9760a140cb169ac6236d9466b96e2105dd193) Thanks [@tmm](https://github.com/tmm)! - Changed `Address` type import from ABIType to viem.
+
+### Patch Changes
+
+- [#2539](https://github.com/wagmi-dev/wagmi/pull/2539) [`96319c64`](https://github.com/wagmi-dev/wagmi/commit/96319c640b9d07b375821c08a5c213355d8c290b) Thanks [@jxom](https://github.com/jxom)! - Updated references
+
+## 1.1.1
+
+### Patch Changes
+
+- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated `viem` peer dependency.
+
+- [`02b98a9f`](https://github.com/wagmi-dev/wagmi/commit/02b98a9f9b2c503a47af4a8967e0202b5db21787) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.1.0
+
+### Minor Changes
+
+- [#2482](https://github.com/wagmi-dev/wagmi/pull/2482) [`8764b54a`](https://github.com/wagmi-dev/wagmi/commit/8764b54aab68020063946112e8fe52aff650c99c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to v5.0.4.
+
+### Patch Changes
+
+- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated `abitype` to 0.8.7
+
+- [#2484](https://github.com/wagmi-dev/wagmi/pull/2484) [`3adf1f4f`](https://github.com/wagmi-dev/wagmi/commit/3adf1f4feab863cb7b5d52c81ad46f7e4eb56f09) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.0.8
+
+### Patch Changes
+
+- [#2441](https://github.com/wagmi-dev/wagmi/pull/2441) [`326edee4`](https://github.com/wagmi-dev/wagmi/commit/326edee4bc85db84a7a4e3768e33785849ab8d8e) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type issue
+
+## 1.0.7
+
+### Patch Changes
+
+- [#2433](https://github.com/wagmi-dev/wagmi/pull/2433) [`54fcff5f`](https://github.com/wagmi-dev/wagmi/commit/54fcff5f02f6933bbbe045ee0c83c5a78b6bba49) Thanks [@jxom](https://github.com/jxom)! - Added ability to pass an `account` to `writeContract`/`prepareWriteContract`.
+
+## 1.0.6
+
+### Patch Changes
+
+- [`ca2e1e96`](https://github.com/wagmi-dev/wagmi/commit/ca2e1e96149b87a7dc42c9db07e1f1ad2bb02c4a) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+- [#2401](https://github.com/wagmi-dev/wagmi/pull/2401) [`0f9dc875`](https://github.com/wagmi-dev/wagmi/commit/0f9dc875e90cfdd7a2028e04b7204caf9ea313b2) Thanks [@jxom](https://github.com/jxom)! - Exposed `account` on `readContract`/`useContractRead`.
+
+## 1.0.5
+
+### Patch Changes
+
+- [`90e2b3b3`](https://github.com/wagmi-dev/wagmi/commit/90e2b3b39efe0585fe28645ac2264109be17362a) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+## 1.0.4
+
+### Patch Changes
+
+- [#2344](https://github.com/wagmi-dev/wagmi/pull/2344) [`8a725458`](https://github.com/wagmi-dev/wagmi/commit/8a72545853ae1024acd9efd18c06142e8c6c5750) Thanks [@jxom](https://github.com/jxom)! - Added gas estimation back into `prepareSendTransaction`.
+
+## 1.0.3
+
+### Patch Changes
+
+- [#2338](https://github.com/wagmi-dev/wagmi/pull/2338) [`92bfdc2c`](https://github.com/wagmi-dev/wagmi/commit/92bfdc2c744539558ba93c95f140b46ad331cee4) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where synchronous switch chain behavior (WalletConnect v2) would encounter chain id race conditions in `watchWalletClient`.
+
+## 1.0.2
+
+### Patch Changes
+
+- [#2304](https://github.com/wevm/wagmi/pull/2304) [`09a4fd38`](https://github.com/wevm/wagmi/commit/09a4fd38f44eb176797925fd85314be17b610cd4) Thanks [@jxom](https://github.com/jxom)! - Removed assert chain workaround.
+
+## 1.0.1
+
+### Patch Changes
+
+- [`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af) Thanks [@jxom](https://github.com/jxom)! - Downgraded abitype.
+
+- Updated dependencies [[`ea651cd7`](https://github.com/wevm/wagmi/commit/ea651cd7fc75b7866272605467db11fd6e1d81af)]:
+ - @wagmi/connectors@1.0.1
+
+## 1.0.0
+
+### Major Changes
+
+- [#2235](https://github.com/wevm/wagmi/pull/2235) [`5be0655c`](https://github.com/wevm/wagmi/commit/5be0655c8e48b25d38009022461fbf611af54349) Thanks [@jxom](https://github.com/jxom)! - Released v1. Read [Migration Guide](https://next.wagmi.sh/react/migration-guide#1xx-breaking-changes).
+
+## 1.0.0-next.7
+
+### Major Changes
+
+- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`
+
+- Updated references.
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@1.0.0-next.5
+
+## 1.0.0-next.6
+
+### Major Changes
+
+- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`
+
+- Added `config.setConnectors`
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@1.0.0-next.6
+
+## 1.0.0-next.5
+
+### Major Changes
+
+- [#2235](https://github.com/wevm/wagmi/pull/2235) [`708b2ce2`](https://github.com/wevm/wagmi/commit/708b2ce26efa8d3d910806a97cea5171dabc65de) Thanks [@jxom](https://github.com/jxom)! - Added `config.setPublicClient` & `config.setWebSocketPublicClient`
+
+## 1.0.0-next.4
+
+### Major Changes
+
+- Updated viem.
+ Removed `goerli` export from main entrypoint.
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@1.0.0-next.5
+
+## 1.0.0-next.3
+
+### Major Changes
+
+- Updated references.
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@1.0.0-next.4
+
+## 1.0.0-next.2
+
+### Major Changes
+
+- **Breaking:** Renamed `createClient` to `createConfig`
+- **Breaking:** Renamed `getClient` to `getConfig`
+- **Breaking:** Removed `request` as an argument to `prepareSendTransaction` & `sendTransaction`. Arguments now belong on the root level of the Action.
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/chains@1.0.0-next.0
+ - @wagmi/connectors@1.0.0-next.3
+
+## 1.0.0-next.1
+
+### Major Changes
+
+- updated viem
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@1.0.0-next.2
+
+## 1.0.0-next.0
+
+### Major Changes
+
+- [`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb) Thanks [@jxom](https://github.com/jxom)! - Released v1.
+
+### Patch Changes
+
+- Updated dependencies [[`a7dda00c`](https://github.com/wevm/wagmi/commit/a7dda00c5b546f8b2c42b527e4d9ac1b9e9ab1fb)]:
+ - @wagmi/connectors@1.0.0-next.1
+
+## 0.10.11
+
+### Patch Changes
+
+- [#2270](https://github.com/wevm/wagmi/pull/2270) [`6d1fa9df`](https://github.com/wevm/wagmi/commit/6d1fa9df790287729c3b33d4f01fd23c2f8153f1) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.19
+
+## 0.10.10
+
+### Patch Changes
+
+- [#2208](https://github.com/wevm/wagmi/pull/2208) [`cfc696d8`](https://github.com/wevm/wagmi/commit/cfc696d83c6f768a2e1a29c5197efeed7f1d40a1) Thanks [@bangtoven](https://github.com/bangtoven)! - Bumped references to apply coinbase wallet sdk updates
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.16
+
+## 0.10.9
+
+### Patch Changes
+
+- [#2143](https://github.com/wevm/wagmi/pull/2143) [`26dc5326`](https://github.com/wevm/wagmi/commit/26dc53260fde1d3278018c0b20a6d48a093d9427) Thanks [@tmm](https://github.com/tmm)! - Exported Sepolia Chain.
+
+- [#2146](https://github.com/wevm/wagmi/pull/2146) [`21b6842e`](https://github.com/wevm/wagmi/commit/21b6842e8c296a0bbe71ebe0780d898abc4cf4a8) Thanks [@tmm](https://github.com/tmm)! - Bumped references
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.12
+
+## 0.10.8
+
+### Patch Changes
+
+- [#2099](https://github.com/wevm/wagmi/pull/2099) [`f1fee5b3`](https://github.com/wevm/wagmi/commit/f1fee5b30a1bd13b5e66118bf9cdc44b0dc003a1) Thanks [@jxom](https://github.com/jxom)! - Added chains:
+
+ - `nexi`
+ - `polygonZkEvm`
+ - `xdc`
+ - `xdcTestnet`
+
+- [#2085](https://github.com/wevm/wagmi/pull/2085) [`7d64e3f5`](https://github.com/wevm/wagmi/commit/7d64e3f538a6149777bfa84ea9435769b2a7db58) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where multicall would not throw if the target chain was not configured on the wagmi client.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.10
+
+## 0.10.7
+
+### Patch Changes
+
+- [#2082](https://github.com/wevm/wagmi/pull/2082) [`2ccc8a25`](https://github.com/wevm/wagmi/commit/2ccc8a255e93f0a2bb7b22101656b3905ec59abd) Thanks [@jxom](https://github.com/jxom)! - Updated references.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.10
+
+## 0.10.6
+
+### Patch Changes
+
+- [#2056](https://github.com/wevm/wagmi/pull/2056) [`944f6513`](https://github.com/wevm/wagmi/commit/944f6513adf09a6f0b3bd34f591d3bbd1f1ffd2e) Thanks [@tmm](https://github.com/tmm)! - Bumped references.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.8
+
+## 0.10.5
+
+### Patch Changes
+
+- [#2053](https://github.com/wevm/wagmi/pull/2053) [`665df1bf`](https://github.com/wevm/wagmi/commit/665df1bf2afccb533102069def395e19fb7194dd) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where you add a new chain to MetaMask, but the switch after is rejected.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.7
+
+## 0.10.4
+
+### Patch Changes
+
+- [#2046](https://github.com/wevm/wagmi/pull/2046) [`90d8e9b8`](https://github.com/wevm/wagmi/commit/90d8e9b87962b72c54311649537e91a953660f9b) Thanks [@tmm](https://github.com/tmm)! - Exported internal type.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.6
+
+## 0.10.3
+
+### Patch Changes
+
+- [#2039](https://github.com/wevm/wagmi/pull/2039) [`bac893ab`](https://github.com/wevm/wagmi/commit/bac893ab26012d4d8741c4f80e8b8813aee26f0c) Thanks [@tmm](https://github.com/tmm)! - Updated references.
+
+- [#2043](https://github.com/wevm/wagmi/pull/2043) [`49a58320`](https://github.com/wevm/wagmi/commit/49a58320ab5f1f13bc4de25abcc028c8335e98f0) Thanks [@tmm](https://github.com/tmm)! - Removed `InjectedConnector` `shimChainChangedDisconnect` shim (no longer necessary).
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.6
+
+## 0.10.2
+
+### Patch Changes
+
+- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Added chains:
+
+ - `boba`
+ - `chronos`
+ - `crossbell`
+ - `dfk`
+ - `dogechain`
+ - `flare`
+ - `flareTestnet`
+ - `klaytn`
+ - `scrollTestnet`
+ - `shardeumSphinx`
+ - `skaleCalypso`
+ - `skaleCalypsoTestnet`
+ - `skaleChaosTestnet`
+ - `skaleCryptoBlades`
+ - `skaleCryptoColosseum`
+ - `skaleEuropa`
+ - `skaleEuropaTestnet`
+ - `skaleExorde`
+ - `skaleHumanProtocol`
+ - `skaleNebula`
+ - `skaleNebulaTestnet`
+ - `skaleRazor`
+ - `skaleTitan`
+ - `skaleTitanTestnet`
+ - `songbird`
+ - `songbirdTestnet`
+ - `titan`
+ - `titanTestnet`
+ - `wanchain`
+ - `wanchainTestnet`
+
+- [#2016](https://github.com/wevm/wagmi/pull/2016) [`06bf61de`](https://github.com/wevm/wagmi/commit/06bf61dee6d2920777bd9392491e6b7aedebe7ab) Thanks [@jxom](https://github.com/jxom)! - Updated references/ submodule.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.4
+
+## 0.10.0
+
+### Minor Changes
+
+- [#1902](https://github.com/wevm/wagmi/pull/1902) [`0994e896`](https://github.com/wevm/wagmi/commit/0994e8966349b8811db0a5886db3831dafc99245) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `version` config option for `WalletConnectConnector`.
+
+ `WalletConnectConnector` now uses WalletConnect v2 by default. WalletConnect v1 is now `WalletConnectLegacyConnector`.
+
+ ### WalletConnect v2
+
+ ```diff
+ import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'
+
+ const connector = new WalletConnectConnector({
+ options: {
+ - version: '2',
+ projectId: 'abc',
+ },
+ })
+ ```
+
+ ### WalletConnect v1
+
+ ```diff
+ -import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'
+ +import { WalletConnectConnector } from 'wagmi/connectors/walletConnectLegacy'
+
+ -const connector = new WalletConnectConnector({
+ +const connector = new WalletConnectLegacyConnector({
+ options: {
+ qrcode: true,
+ },
+ })
+ ```
+
+### Patch Changes
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.3.2
+
+## 0.9.7
+
+### Patch Changes
+
+- [#1907](https://github.com/wevm/wagmi/pull/1907) [`cc4e74ee`](https://github.com/wevm/wagmi/commit/cc4e74ee19665eccb3767052dab6ab956ff4e676) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:
+
+ - `baseGoerli`
+ - `harmonyOne`
+ - `polygonZkEvmTestnet`
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.7
+
+## 0.9.6
+
+### Patch Changes
+
+- [#1882](https://github.com/wevm/wagmi/pull/1882) [`282cc1b0`](https://github.com/wevm/wagmi/commit/282cc1b02003684d582cea411b11792a59c26fd0) Thanks [@tmm](https://github.com/tmm)! - Updated references.
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.6
+
+## 0.9.5
+
+### Patch Changes
+
+- [#1812](https://github.com/wevm/wagmi/pull/1812) [`c7fd7fbd`](https://github.com/wevm/wagmi/commit/c7fd7fbde6f6c69a3a9a4f89d948c4dfb1d22679) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:
+
+ - `filecoinCalibration`
+ - `moonbaseAlpha`
+ - `moonbeam`
+ - `moonriver`
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.5
+
+## 0.9.4
+
+### Patch Changes
+
+- [#1786](https://github.com/wevm/wagmi/pull/1786) [`b173a431`](https://github.com/wevm/wagmi/commit/b173a43165c7925a4e56ce1e0327a31917e7edc5) Thanks [@tmm](https://github.com/tmm)! - Locked ethers peer dependency version to >=5.5.1 <6
+
+- [#1787](https://github.com/wevm/wagmi/pull/1787) [`f023fd8f`](https://github.com/wevm/wagmi/commit/f023fd8f66befb78b9a4df5ca971ceaa64e37ab4) Thanks [@tmm](https://github.com/tmm)! - Added `SafeConnector`
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.4
+
+## 0.9.3
+
+### Patch Changes
+
+- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Updated `@walletconnect/universal-provider` on `WalletConnectConnector` v2.
+ Added more signable methods to `WalletConnectConnector` v2.
+
+- [#1773](https://github.com/wevm/wagmi/pull/1773) [`9aaf1955`](https://github.com/wevm/wagmi/commit/9aaf195514d3b5f4d085c797fc5021d42a9efb6c) Thanks [@jxom](https://github.com/jxom)! - Added Telos to the `wagmi/chains` entrypoint. Thanks @donnyquixotic!
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.3
+
+## 0.9.2
+
+### Patch Changes
+
+- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Added OKC Chain. Thanks @clark-cui!
+
+- [#1756](https://github.com/wevm/wagmi/pull/1756) [`31d06b8c`](https://github.com/wevm/wagmi/commit/31d06b8ce1e7af5e9d1a7ba57f1743b2dff7a53d) Thanks [@jxom](https://github.com/jxom)! - Fixed race condition between `switchNetwork` and mutation Actions that use `chainId` (e.g. `sendTransaction`). Thanks @DanInTheD4rk!
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.2
+
+## 0.9.1
+
+### Patch Changes
+
+- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Improved `WalletConnectConnector` (v2) initialization & updated dependencies.
+
+- [#1752](https://github.com/wevm/wagmi/pull/1752) [`144a0e76`](https://github.com/wevm/wagmi/commit/144a0e76ef4bb9ba0650b5ffb9c63f95329819a4) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `wagmi/chains` entrypoint:
+
+ - Aurora ā thanks @salil-naik
+ - Bronos ā thanks @chedetinaveen
+ - Canto ā thanks @tster
+ - Celo ā thanks @aaronmgdr
+
+- Updated dependencies []:
+ - @wagmi/connectors@0.2.1
+
+## 0.9.0
+
+### Minor Changes
+
+- [#1732](https://github.com/wevm/wagmi/pull/1732) [`01e21897`](https://github.com/wevm/wagmi/commit/01e2189747a5c22dc758c6d719b4145adc2a643c) Thanks [@tmm](https://github.com/tmm)! - Bumped minimum TypeScript version to typescript@>=4.9.4. TypeScript 5.0 is coming soon and has some great features we are excited to bring into wagmi. To prepare for this, update your TypeScript version to 4.9.4 or higher. There are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#correctness-fixes-and-breaking-changes) if you are coming from typescript@4.7.x || typescript@4.8.x.
+
+## 0.8.19
+
+### Patch Changes
+
+- [#1718](https://github.com/wevm/wagmi/pull/1718) [`e62b5ef8`](https://github.com/wevm/wagmi/commit/e62b5ef8aaa8063abb5264790768899ea35bbd31) Thanks [@tmm](https://github.com/tmm)! - Updated references
+
+## 0.8.18
+
+### Patch Changes
+
+- [#1708](https://github.com/wevm/wagmi/pull/1708) [`07fc3801`](https://github.com/wevm/wagmi/commit/07fc3801fa13c2cb5f7cf9b86ba8320b05a6a135) Thanks [@jxom](https://github.com/jxom)! - Updated `references/` submodule.
+
+## 0.8.17
+
+### Patch Changes
+
+- [#1705](https://github.com/wevm/wagmi/pull/1705) [`9ff797dc`](https://github.com/wevm/wagmi/commit/9ff797dcb979dc86b798a432b74c98598165430d) Thanks [@jxom](https://github.com/jxom)! - Added the following chains to the `@wagmi/core/chains` entrypoint:
+
+ - `crossbell` (thanks @Songkeys)
+ - `filecoin` & `filecoinHyperspace` (thanks @neil0x46dc)
+ - `gnosisChiado` (thanks @theNvN)
+ - `metis` & `metisGoerli` (thanks @CookedCookee)
+
+## 0.8.16
+
+### Patch Changes
+
+- [#1699](https://github.com/wevm/wagmi/pull/1699) [`2f1e7950`](https://github.com/wevm/wagmi/commit/2f1e7950e55550d9b50ef5ccb97cb609f4af39b1) Thanks [@tmm](https://github.com/tmm)! - Added public RPC URL property to Chain
+
+## 0.8.15
+
+### Patch Changes
+
+- [#1685](https://github.com/wevm/wagmi/pull/1685) [`917f5bc1`](https://github.com/wevm/wagmi/commit/917f5bc1fad578e35a8c6ee787e339bfdc156bab) Thanks [@jxom](https://github.com/jxom)! - Replaced qrcodemodal with web3modal for the WalletConnect v2 Connector.
+
+## 0.8.14
+
+### Patch Changes
+
+- [#1646](https://github.com/wevm/wagmi/pull/1646) [`fcdbe353`](https://github.com/wevm/wagmi/commit/fcdbe3531e6d05cda4a4a511bae1ad4c9e426d88) Thanks [@jxom](https://github.com/jxom)! - Upgraded `zustand` to v4.3.1.
+
+## 0.8.13
+
+### Patch Changes
+
+- [#1639](https://github.com/wevm/wagmi/pull/1639) [`c6869f06`](https://github.com/wevm/wagmi/commit/c6869f0604fffb197752a08256f31db77f52e746) Thanks [@jxom](https://github.com/jxom)! - Added `isRainbow` flag to `InjectedConnector`.
+
+## 0.8.12
+
+### Patch Changes
+
+- [#1636](https://github.com/wevm/wagmi/pull/1636) [`025f6771`](https://github.com/wevm/wagmi/commit/025f6771b32ff7eed22f527be81c5141ddaf9c3d) Thanks [@DanielSinclair](https://github.com/DanielSinclair)! - Added `isRainbow` flag to injected `window.ethereum` types.
+
+## 0.8.11
+
+### Patch Changes
+
+- [#1621](https://github.com/wevm/wagmi/pull/1621) [`5812b590`](https://github.com/wevm/wagmi/commit/5812b5909277bf2862cb57a31d52465b47291410) Thanks [@tmm](https://github.com/tmm)! - Bumped @wagmi/connectors
+
+## 0.8.10
+
+### Patch Changes
+
+- [#1598](https://github.com/wevm/wagmi/pull/1598) [`fc10ebe6`](https://github.com/wevm/wagmi/commit/fc10ebe659dd5f3b7a8e00581f094652280a779b) Thanks [@jxom](https://github.com/jxom)! - Fixed CJS dependency version range
+
+## 0.8.9
+
+### Patch Changes
+
+- [#1593](https://github.com/wevm/wagmi/pull/1593) [`216d555c`](https://github.com/wevm/wagmi/commit/216d555c62bd95c3c7c8f8e20f7269f6c8504610) Thanks [@jxom](https://github.com/jxom)! - Added CJS escape hatch bundle under the "cjs" tag.
+
+## 0.8.8
+
+### Patch Changes
+
+- [#1573](https://github.com/wevm/wagmi/pull/1573) [`ef380d9c`](https://github.com/wevm/wagmi/commit/ef380d9c6d51ae0495b9c35925d2843c75d97fd4) Thanks [@tmm](https://github.com/tmm)! - Updated internal types.
+
+## 0.8.7
+
+### Patch Changes
+
+- [#1570](https://github.com/wevm/wagmi/pull/1570) [`216f585b`](https://github.com/wevm/wagmi/commit/216f585be8a9e3a56e3243f49ccd54d655b5a6dd) Thanks [@wslyvh](https://github.com/wslyvh)! - Added `watchPendingTransactions`
+
+- [#1470](https://github.com/wevm/wagmi/pull/1470) [`3a1a6c9f`](https://github.com/wevm/wagmi/commit/3a1a6c9fe5db5c360adfd116f9a03a1238b5720c) Thanks [@jxom](https://github.com/jxom)! - The `WalletConnectConnector` now supports WalletConnect v2.
+
+ It can be enabled by setting `version` to `'2'` and supplying a [WalletConnect Cloud `projectId`](https://cloud.walletconnect.com/sign-in).
+
+## 0.8.6
+
+### Patch Changes
+
+- [#1539](https://github.com/wevm/wagmi/pull/1539) [`732da004`](https://github.com/wevm/wagmi/commit/732da0042c7e28091b2e36a484ea8239971306f5) Thanks [@0xFlicker](https://github.com/0xFlicker)! - All Providers (ie. Alchemy, Infura, Public) now use the ENS Registry address on the wagmi `Chain` object (`chain.contracts.ensRegistry`).
+
+- [#1574](https://github.com/wevm/wagmi/pull/1574) [`ecde3d10`](https://github.com/wevm/wagmi/commit/ecde3d1029ccdf90e2853ba0e9ae4f5f4ebb9c4c) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:
+
+ - `iotex`
+ - `iotexTestnet`
+ - `zkSync`
+ - `zkSyncTestnet`
+
+## 0.8.5
+
+### Patch Changes
+
+- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Added the following chains:
+
+ - `evmos`
+ - `evmosTestnet`
+ - `gnosis`
+
+- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Goerli symbol to `"ETH"`.
+
+- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Updated Arbitrum Goerli RPC and Block Explorer.
+
+- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where connecting to MetaMask may return with a stale address.
+
+- [#1542](https://github.com/wevm/wagmi/pull/1542) [`731b3b73`](https://github.com/wevm/wagmi/commit/731b3b733c6a093d1693d49de601705b7c730549) Thanks [@jxom](https://github.com/jxom)! - Removed ENS registry for Sepolia.
+
+## 0.8.4
+
+### Patch Changes
+
+- [#1508](https://github.com/wevm/wagmi/pull/1508) [`0b50b62f`](https://github.com/wevm/wagmi/commit/0b50b62f7389619e429509a3e337e451e823b059) Thanks [@jxom](https://github.com/jxom)! - Updated `@wagmi/chains` to `0.1.3`.
+
+- [#1504](https://github.com/wevm/wagmi/pull/1504) [`11b8b794`](https://github.com/wevm/wagmi/commit/11b8b794fbfd4a2b40f39962e2758e9fbf48cb54) Thanks [@tmm](https://github.com/tmm)! - Converted ethers custom "ACTION_REJECTED" error to standard RPC Error.
+
+## 0.8.3
+
+### Patch Changes
+
+- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Re-export connectors from `@wagmi/connectors`
+
+- [#1431](https://github.com/wevm/wagmi/pull/1431) [`af28f8f9`](https://github.com/wevm/wagmi/commit/af28f8f9cfc227e7c391927fdb934183edb5c2dc) Thanks [@jxom](https://github.com/jxom)! - Added `LedgerConnector` connector
+
+## 0.8.2
+
+### Patch Changes
+
+- [#1442](https://github.com/wevm/wagmi/pull/1442) [`cde15289`](https://github.com/wevm/wagmi/commit/cde152899c758dea10787412b0aef669ed7202b2) Thanks [@0xproflupin](https://github.com/0xproflupin)! - Added Phantom wallet support to `InjectedConnector`
+
+- [#1448](https://github.com/wevm/wagmi/pull/1448) [`c6075f3a`](https://github.com/wevm/wagmi/commit/c6075f3a16885d850ad2656272351f9517c9f67b) Thanks [@tmm](https://github.com/tmm)! - Updated [ABIType](https://github.com/wevm/abitype) version.
+
+- [#1444](https://github.com/wevm/wagmi/pull/1444) [`310a8bc4`](https://github.com/wevm/wagmi/commit/310a8bc428ce4e7f68377f581b45dcdd64381cce) Thanks [@jxom](https://github.com/jxom)! - Assert that a `connector` exists before invoking the callback in `watchSigner`.
+
+- [#1434](https://github.com/wevm/wagmi/pull/1434) [`100e2a3b`](https://github.com/wevm/wagmi/commit/100e2a3b22f4602716554487b1d98738e053be76) Thanks [@tmm](https://github.com/tmm)! - Updated `MockConnector` `chainId` behavior to default to first chain from `chains` if not provided in `options`.
+
+## 0.8.1
+
+### Patch Changes
+
+- [#1437](https://github.com/wevm/wagmi/pull/1437) [`c34a3dc6`](https://github.com/wevm/wagmi/commit/c34a3dc6396e6473d9f0505fad88ec910f8f5275) Thanks [@jxom](https://github.com/jxom)! - Omitted `"EIP712Domain"` type from `signTypedData` `types` arg since ethers throws an [internal error](https://github.com/ethers-io/ethers.js/blob/c80fcddf50a9023486e9f9acb1848aba4c19f7b6/packages/hash/src.ts/typed-data.ts#L466) if you include it.
+
+- [#1445](https://github.com/wevm/wagmi/pull/1445) [`51dd53cb`](https://github.com/wevm/wagmi/commit/51dd53cba3fe0f79fa1393270b738194577ddf54) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the wagmi client wouldn't rehydrate the store in local storage when `autoConnect` is truthy.
+
+## 0.8.0
+
+### Minor Changes
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: the shape of the `Chain` type has been modified.
+
+ #### RPC URLs
+
+ The `rpcUrls` shape has changed to include an array of URLs, and also the transport method (`http` or `webSocket`):
+
+ ```diff
+ type Chain = {
+ ...
+ rpcUrls: {
+ - [key: string]: string
+ + [key: string]: {
+ + http: string[]
+ + webSocket: string[]
+ + }
+ }
+ ...
+ }
+ ```
+
+ Note that you will also need to ensure that usage is migrated:
+
+ ```diff
+ - const rpcUrl = mainnet.rpcUrls.alchemy
+ + const rpcUrl = mainnet.rpcUrls.alchemy.http[0]
+ ```
+
+ #### Contracts
+
+ The `multicall` and `ens` attributes have been moved into the `contracts` object:
+
+ ```diff
+ type Contract = {
+ address: Address
+ blockCreated?: number
+ }
+
+ type Chain = {
+ ...
+ - multicall: Contract
+ - ens: Contract
+ + contracts: {
+ + multicall3: Contract
+ + ensRegistry: Contract
+ + }
+ ...
+ }
+ ```
+
+ Note that you will also need to ensure that usage is migrated:
+
+ ```diff
+ - const multicallContract = mainnet.multicall
+ + const multicallContract = mainnet.contracts.multicall3
+ ```
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Upgraded `@coinbase/wallet-sdk` peer dependency to `3.6.0`.
+
+ **Migration steps**: Update `@coinbase/wallet-sdk` to `^3.6.0`.
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Removed the `wait` argument on `waitForTransaction`. Use the transaction `hash` instead.
+
+ ```diff
+ const data = await waitForTransaction({
+ - wait: transaction.wait
+ + hash: transaction.hash
+ })
+ ```
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: With the introduction of the [`@wagmi/core/chains` entrypoint](/core/chains), `@wagmi/core` no longer exports the following:
+
+ - `chain`
+ - `allChains`
+ - `defaultChains`
+ - `defaultL2Chains`
+ - `chainId`
+ - `etherscanBlockExplorers`
+ - `alchemyRpcUrls`, `infuraRpcUrls`, `publicRpcUrls`
+
+ Read below for migration steps.
+
+ #### Removed `chain`
+
+ The `chain` export has been removed. `@wagmi/core` now only exports the `mainnet` & `goerli` chains. If you need to use an alternative chain (`polygon`, `optimism`, etc), you will need to import it from the [`@wagmi/core/chains` entrypoint](/core/chains).
+
+ ```diff
+ import {
+ - chain
+ configureChains
+ } from '@wagmi/core'
+ + import { mainnet, polygon, optimism } from '@wagmi/core/chains'
+
+ const { ... } = configureChains(
+ - [chain.mainnet, chain.polygon, chain.optimism],
+ + [mainnet, polygon, optimism],
+ {
+ ...
+ }
+ )
+ ```
+
+ #### Removed `allChains`
+
+ The `allChains` export has been removed. If you need a list of all chains, you can utilize [`@wagmi/core/chains` entrypoint](/core/chains).
+
+ ```diff
+ - import { allChains } from '@wagmi/core'
+ + import * as allChains from '@wagmi/core/chains'
+
+ const { ... } = configureChains(allChains, ...)
+ ```
+
+ #### Removed `defaultChains` & `defaultL2Chains`
+
+ The `defaultChains` & `defaultL2Chains` exports have been removed. If you still need the `defaultChains` or `defaultL2Chains` exports, you can build them yourself:
+
+ ```diff
+ - import { defaultChains } from '@wagmi/core'
+ + import { mainnet, goerli } from '@wagmi/core/chains'
+
+ + const defaultChains = [mainnet, goerli]
+ ```
+
+ > The `defaultChains` export was previously populated with `mainnet` & `goerli`.
+
+ ```diff
+ - import { defaultL2Chains } from '@wagmi/core'
+ + import {
+ + arbitrum,
+ + arbitrumGoerli,
+ + polygon,
+ + polygonMumbai,
+ + optimism,
+ + optimismGoerli
+ + } from '@wagmi/core/chains'
+
+ + const defaultL2Chains = [
+ + arbitrum,
+ + arbitrumGoerli,
+ + polygon,
+ + polygonMumbai,
+ + optimism
+ + optimismGoerli
+ + ]
+ ```
+
+ > The `defaultL2Chains` export was previously populated with `arbitrum` & `optimism`.
+
+ #### Removed `chainId`
+
+ The `chainId` export has been removed. You can extract a chain ID from the chain itself.
+
+ ```diff
+ - import { chainId } from '@wagmi/core'
+ + import { mainnet, polygon, optimism } from '@wagmi/core/chains'
+
+ -const mainnetChainId = chainId.mainnet
+ -const polygonChainId = chainId.polygon
+ -const optimismChainId = chainId.optimism
+ +const mainnetChainId = mainnet.chainId
+ +const polygonChainId = polygon.chainId
+ +const optimismChainId = optimism.chainId
+ ```
+
+ #### Removed `etherscanBlockExplorers`
+
+ The `etherscanBlockExplorers` export has been removed. You can extract a block explorer from the chain itself.
+
+ ```diff
+ - import { etherscanBlockExplorers } from '@wagmi/core'
+ + import { mainnet, polygon, optimism } from '@wagmi/core/chains'
+
+ -const mainnetEtherscanBlockExplorer = etherscanBlockExplorers.mainnet
+ -const polygonEtherscanBlockExplorer = etherscanBlockExplorers.polygon
+ -const optimismEtherscanBlockExplorer = etherscanBlockExplorers.optimism
+ +const mainnetEtherscanBlockExplorer = mainnet.blockExplorer
+ +const polygonEtherscanBlockExplorer = polygon.blockExplorer
+ +const optimismEtherscanBlockExplorer = optimism.blockExplorer
+ ```
+
+ #### Removed `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls`
+
+ The `alchemyRpcUrls`, `infuraRpcUrls` & `publicRpcUrls` exports have been removed. You can extract a RPC URL from the chain itself.
+
+ ```diff
+ - import { alchemyRpcUrls, infuraRpcUrls, publicRpcUrls } from '@wagmi/core'
+ + import { mainnet } from '@wagmi/core/chains'
+
+ -const mainnetAlchemyRpcUrl = alchemyRpcUrls.mainnet
+ -const mainnetInfuraRpcUrl = infuraRpcUrls.mainnet
+ -const mainnetOptimismRpcUrl = publicRpcUrls.mainnet
+ +const mainnetAlchemyRpcUrl = mainnet.rpcUrls.alchemy
+ +const mainnetInfuraRpcUrl = mainnet.rpcUrls.infura
+ +const mainnetOptimismRpcUrl = mainnet.rpcUrls.optimism
+ ```
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: Changed `waitForTransaction` behavior to throw an error if the transaction reverted.
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Updated errors to use `cause` instead of `internal`
+
+### Patch Changes
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `waitForTransaction` now respects repriced (sped up) transactions.
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - Export `getClient`
+
+- [#1344](https://github.com/wevm/wagmi/pull/1344) [`57a19374`](https://github.com/wevm/wagmi/commit/57a1937464a4ccf72719fc86c38d1734f6306652) Thanks [@jxom](https://github.com/jxom)! - `waitForTransaction` now throws an error for cancelled or replaced transactions.
+
+## 0.7.9
+
+### Patch Changes
+
+- [#1411](https://github.com/wevm/wagmi/pull/1411) [`659be184`](https://github.com/wevm/wagmi/commit/659be1840c613ce9f7aca9ac96694c4f60da4a66) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where block invalidation was not properly disabled when setting `enabled: false`.
+
+## 0.7.8
+
+### Patch Changes
+
+- [#1406](https://github.com/wevm/wagmi/pull/1406) [`4f18c450`](https://github.com/wevm/wagmi/commit/4f18c450a4d7952bfcfa6c533348ffbe55893d3c) Thanks [@tmm](https://github.com/tmm)! - Function for selecting the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) Ethereum Provider to target. Defaults to `() => typeof window !== 'undefined' ? window.ethereum : undefined`.
+
+ ```ts
+ import { InjectedConnector } from "@wagmi/core/connectors/injected";
+
+ const connector = new InjectedConnector({
+ options: {
+ name: "My Injected Wallet",
+ getProvider: () =>
+ typeof window !== "undefined" ? window.myInjectedWallet : undefined,
+ },
+ });
+ ```
+
+## 0.7.7
+
+### Patch Changes
+
+- [#1386](https://github.com/wevm/wagmi/pull/1386) [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `persister` would still use `window.localStorage` instead of the wagmi `storage`.
+
+- [#1376](https://github.com/wevm/wagmi/pull/1376) [`a70a9528`](https://github.com/wevm/wagmi/commit/a70a9528f93f4d7fea28b7652751dfef2dcacf9b) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where `switchChain` on `WalletConnectConnector` would not resolve.
+
+- [#1386](https://github.com/wevm/wagmi/pull/1386) [`206a2adb`](https://github.com/wevm/wagmi/commit/206a2adbb4ee5149a364543b34612050ccf78c21) Thanks [@jxom](https://github.com/jxom)! - Added `serialize`/`deserialize` as config options to `createStorage`.
+
+- [#1392](https://github.com/wevm/wagmi/pull/1392) [`88afc849`](https://github.com/wevm/wagmi/commit/88afc84978afe9689ab7364633e4422ecd7699ea) Thanks [@tmm](https://github.com/tmm)! - Added check for active connector when connecting
+
+## 0.7.6
+
+### Patch Changes
+
+- [#1384](https://github.com/wevm/wagmi/pull/1384) [`027e88d6`](https://github.com/wevm/wagmi/commit/027e88d6e5f8d028d46ee78aec8500701e0173d9) Thanks [@tmm](https://github.com/tmm)! - Fixed issue reconnecting after disconnect with `MetaMaskConnector` in MetaMask mobile browser.
+
+## 0.7.5
+
+### Patch Changes
+
+- [`1169914a`](https://github.com/wevm/wagmi/commit/1169914a0f0ad2810ca1c536b1f1bc6c20f2c1be) Thanks [@jxom](https://github.com/jxom)! - Use `get_accounts` for `getSigner` in InjectedConnector
+
+## 0.7.4
+
+### Patch Changes
+
+- [#1309](https://github.com/wevm/wagmi/pull/1309) [`1f4a4261`](https://github.com/wevm/wagmi/commit/1f4a4261247b1d3a90e3123157bc851a35d49b9c) Thanks [@tmm](https://github.com/tmm)! - Fixed internal type
+
+## 0.7.3
+
+### Patch Changes
+
+- [#1294](https://github.com/wevm/wagmi/pull/1294) [`b2f88949`](https://github.com/wevm/wagmi/commit/b2f88949f32aabaf13f318472648cd51a8b7f2e7) Thanks [@tmm](https://github.com/tmm)! - Set `abi` return type value for `prepareContractWrite` as more permissive when not inferrable as `Abi`.
+
+## 0.7.2
+
+### Patch Changes
+
+- [`e9f806b6`](https://github.com/wevm/wagmi/commit/e9f806b652ba62effb3ddac464815e447fc287f6) Thanks [@tmm](https://github.com/tmm)! - Bumped abitype and zustand versions.
+
+## 0.7.1
+
+### Patch Changes
+
+- [#1272](https://github.com/wevm/wagmi/pull/1272) [`1f7fc41`](https://github.com/wevm/wagmi/commit/1f7fc419f7960bbdc51dfa85c2f33b89f1ecc1bf) Thanks [@tmm](https://github.com/tmm)! - Fixed ethers import path
+
+## 0.7.0
+
+### Minor Changes
+
+- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Removed the following deprecated chains:
+
+ - `ropsten`
+ - `rinkeby`
+ - `kovan`
+ - `optimismKovan`
+ - `arbitrumRinkeby`
+
+ If you feel you still need to include one of these testnets in your application, you will have to define it manually:
+
+ ```diff
+ -import { rinkeby } from 'wagmi'
+ +import { Chain } from 'wagmi'
+
+ +export const rinkeby: Chain = {
+ + id: 4,
+ + name: 'Rinkeby',
+ + network: 'rinkeby',
+ + nativeCurrency: { name: 'Rinkeby Ether', symbol: 'ETH', decimals: 18 },
+ + rpcUrls: {
+ + alchemy: 'https://eth-rinkeby.alchemyapi.io/v2',
+ + default: 'https://rpc.ankr.com/eth_rinkeby',
+ + infura: 'https://rinkeby.infura.io/v3',
+ + public: 'https://rpc.ankr.com/eth_rinkeby',
+ + },
+ + blockExplorers: {
+ + etherscan: 'https://rinkeby.etherscan.io',
+ + default: 'https://rinkeby.etherscan.io',
+ + },
+ + ens: {
+ + address: '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e',
+ + },
+ + multicall: {
+ + address: '0xca11bde05977b3631167028862be2a173976ca11',
+ + blockCreated: 10299530,
+ + },
+ + testnet: true,
+ }
+ ```
+
+ You can reference these removed chains [here](https://github.com/wevm/wagmi/blob/389765f7d9af063ab0df07389a2bbfbc10a41060/packages/core/src/constants/chains.ts).
+
+- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` renamed to `address` for `fetchBalance` and `fetchEnsAvatar`.
+
+ ```diff
+ const result = await fetchBalance({
+ - addressOrName: '0xā¦',
+ + address: '0xā¦',
+ })
+ ```
+
+ If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.
+
+ ```diff
+ + const { data: address } = await fetchEnsAddress({ name: 'example.eth' })
+ const result = await fetchBalance({
+ - addressOrName: 'example.eth',
+ + address,
+ })
+ ```
+
+- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Made `apiKey` required on `infuraProvider` and `alchemyProvider`.
+
+ ```diff
+ import { configureChains } from 'wagmi'
+
+ const config = configureChains(defaultChains, [
+ - alchemyProvider(),
+ + alchemyProvider({ apiKey: process.env.ALCHEMY_API_KEY })
+ ])
+ ```
+
+ You can find your Alchemy API key from the [Alchemy Dashboard](https://dashboard.alchemyapi.io/), or your Infura API key from the [Infura Dashboard](https://infura.io/login).
+
+- [#1202](https://github.com/wevm/wagmi/pull/1202) [`9bf56af`](https://github.com/wevm/wagmi/commit/9bf56af3c30bdb80abb1e785c002e00986fadfb2) Thanks [@tmm](https://github.com/tmm)! - Removed CommonJS support
+
+## 0.6.12
+
+### Patch Changes
+
+- [#1250](https://github.com/wevm/wagmi/pull/1250) [`ce2e0f4`](https://github.com/wevm/wagmi/commit/ce2e0f4a46b8fd1c509ead552012ef4c072a525b) Thanks [@tmm](https://github.com/tmm)! - Added support for Trust Wallet browser extension.
+
+## 0.6.11
+
+### Patch Changes
+
+- [#1234](https://github.com/wevm/wagmi/pull/1234) [`3ff9303`](https://github.com/wevm/wagmi/commit/3ff930349250f62137cca4ca3b382522882abf8a) Thanks [@tmm](https://github.com/tmm)! - Fixed issue with adding chain to wallet without block explorer URL.
+
+## 0.6.10
+
+### Patch Changes
+
+- [#1232](https://github.com/wevm/wagmi/pull/1232) [`c0ca509`](https://github.com/wevm/wagmi/commit/c0ca509506dcf6d98b058df549dc761c9a5f3d1c) Thanks [@tmm](https://github.com/tmm)! - Added validation to check that chain is configured for connector when accessing `Signer`.
+
+## 0.6.9
+
+### Patch Changes
+
+- [#1207](https://github.com/wevm/wagmi/pull/1207) [`c73d463`](https://github.com/wevm/wagmi/commit/c73d463d65c9dbfcfe709187e47323a769589741) Thanks [@lvshaoping007](https://github.com/lvshaoping007)! - Added Kucoin wallet support to `InjectedConnector`
+
+## 0.6.8
+
+### Patch Changes
+
+- [#1132](https://github.com/wevm/wagmi/pull/1132) [`d41c0d6`](https://github.com/wevm/wagmi/commit/d41c0d650f8c0e54145758685b7604b8909d7ae0) Thanks [@toniocodo](https://github.com/toniocodo)! - Added ERC-4626 ABI
+
+- [#1201](https://github.com/wevm/wagmi/pull/1201) [`9a07efa`](https://github.com/wevm/wagmi/commit/9a07efaa397d3ba03f2edbe527c359f21e22139a) Thanks [@jxom](https://github.com/jxom)! - Fixed issue where non-checksum addresses did not resolve with an ENS name
+
+## 0.6.7
+
+### Patch Changes
+
+- [#1174](https://github.com/wevm/wagmi/pull/1174) [`196a458`](https://github.com/wevm/wagmi/commit/196a458f64141e8a9f39c1b1e1af5937f692cb39) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `client.chains` (active connector chains) would be populated when there is no active connector (disconnected user).
+
+- [#1176](https://github.com/wevm/wagmi/pull/1176) [`389765f`](https://github.com/wevm/wagmi/commit/389765f7d9af063ab0df07389a2bbfbc10a41060) Thanks [@jxom](https://github.com/jxom)! - Migrate away from Alchemy RPC URLs in the public RPC URL list
+
+## 0.6.6
+
+### Patch Changes
+
+- [`81ce9e6`](https://github.com/wevm/wagmi/commit/81ce9e64d85f7d01370324c1a529988a0919894f) Thanks [@jxom](https://github.com/jxom)! - Add `isPortal` to injected MetaMask flags.
+
+- [`c2c0109`](https://github.com/wevm/wagmi/commit/c2c01096ef4cd0ffadbb49062969c208604c6194) Thanks [@jxom](https://github.com/jxom)! - Add etherscan block explorer to Optimism Goerli
+
+## 0.6.5
+
+### Patch Changes
+
+- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where non-indexed event parameter types were set to `null`.
+
+- [#1162](https://github.com/wevm/wagmi/pull/1162) [`30335b3`](https://github.com/wevm/wagmi/commit/30335b3199fb425e398e9c492b50c68d5e2ade7e) Thanks [@tmm](https://github.com/tmm)! - Fixed issue where `useContractReads` and `useContractInfiniteReads` types were slowing down TypeScript compiler.
+
+## 0.6.4
+
+### Patch Changes
+
+- [#1103](https://github.com/wevm/wagmi/pull/1103) [`651eda0`](https://github.com/wevm/wagmi/commit/651eda06384bd0955268427f898e9337b2dc5a31) Thanks [@tmm](https://github.com/tmm)! - Bumped `abitype` dependency.
+
+## 0.6.3
+
+### Patch Changes
+
+- [#1086](https://github.com/wevm/wagmi/pull/1086) [`4e28d2a`](https://github.com/wevm/wagmi/commit/4e28d2ad4c2e6b3479b728563040b9529463cbcf) Thanks [@tmm](https://github.com/tmm)! - Exposed module types.
+
+## 0.6.2
+
+### Patch Changes
+
+- [#1080](https://github.com/wevm/wagmi/pull/1080) [`3be5e8b`](https://github.com/wevm/wagmi/commit/3be5e8b01e58ed40cc9dab7ef9533c0197cb74d0) Thanks [@tmm](https://github.com/tmm)! - Added `abitype` to `dependencies` so types ship correctly.
+
+## 0.6.1
+
+### Patch Changes
+
+- [#1074](https://github.com/wevm/wagmi/pull/1074) [`8db807f`](https://github.com/wevm/wagmi/commit/8db807f16149aa278c2a7db9ee5245431db12173) Thanks [@IljaDaderko](https://github.com/IljaDaderko)! - Exported `EventListener` type
+
+## 0.6.0
+
+### Minor Changes
+
+- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `watchSigner` now requires an arguments object (that accepts an optional `chainId`) as it's first parameter.
+
+ ```diff
+ import { watchSigner } from `@wagmi/core`
+
+ -watchSigner(signer => {
+ +watchSigner({}, signer => {
+ console.log('new signer!', signer)
+ })
+ ```
+
+- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareSendTransaction` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).
+
+- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `addressOrName` and `contractInterface` renamed to `address` and `abi` respectively for contract actions: `getContract`, `multicall`, `prepareWriteContract`, `readContract`, `readContracts`, `watchContractEvent`, `watchMulticall`, `watchReadContract`, `watchReadContracts`, `writeContract`.
+
+ ```diff
+ import { readContract } from '@wagmi/core'
+
+ const result = await readContract({
+ - addressOrName: '0xā¦',
+ + address: '0xā¦',
+ - contractInterface: [ā¦] as const,
+ + abi: [ā¦] as const,
+ functionName: 'balanceOf',
+ args: ['0xā¦'],
+ })
+ ```
+
+ If you were using an ENS name instead of an address, you can resolve the name to an address before passing it to the action.
+
+ ```diff
+ - import { readContract } from '@wagmi/core'
+ + import { fetchEnsAddress, readContract } from '@wagmi/core'
+
+ + const address = await fetchEnsAddress('example.eth')
+ const result = await readContract({
+ - addressOrName: 'example.eth',
+ + address,
+ abi: [ā¦] as const,
+ functionName: 'balanceOf',
+ args: ['0xā¦'],
+ })
+ ```
+
+- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareWriteContract` now throws when a `chainId` is specified and the end-user is on a different chain id (the wrong network).
+
+- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: `prepareSendTransaction` now only accepts a `signer` instead of `signerOrProvider`.
+
+ This is to reach parity with `prepareWriteContract`.
+
+ If no `signer` is provided, wagmi will use the signer that is currently connected. If no user is connected, then `prepareWriteContract` will throw an error.
+
+- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `args` config option must now be an array for the following actions: `readContract`, `writeContract`, `prepareWriteContract`, `multicall`, `readContracts`, `watchMulticall`, and `watchReadContracts`.
+
+ ```diff
+ import { readContract } from '@wagmi/core'
+
+ const result = await readContract({
+ address: '0xā¦',
+ abi: [ā¦],
+ functionName: 'balanceOf',
+ - args: '0xā¦',
+ + args: ['0xā¦'],
+ })
+ ```
+
+- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `watchContractEvent` now accepts a configuration object and callback instead of positional arguments.
+
+ ```diff
+ import { watchContractEvent } from '@wagmi/core'
+
+ - const unsubscribe = watchContractEvent(
+ - {
+ - address: '0xā¦',
+ - abi: [ā¦],
+ - },
+ - 'Transfer',
+ - (from, to, tokenId) => {
+ - // ...
+ - },
+ - { once: true },
+ - )
+ + const unsubscribe = watchContractEvent(
+ + {
+ + address: '0xā¦',
+ + abi: [ā¦],
+ + eventName: 'Transfer',
+ + once: true,
+ + },
+ + (from, to, tokenId) => {
+ + // ...
+ + },
+ + )
+ ```
+
+- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript version to `typescript@>=4.7.4`.
+
+ `@wagmi/core` can now infer types based on [ABI](https://docs.soliditylang.org/en/v0.8.15/abi-spec.html#json) and [EIP-712](https://eips.ethereum.org/EIPS/eip-712) Typed Data definitions, giving you full end-to-end type-safety from your contracts to your frontend and incredible developer experience (e.g. autocomplete contract function names and catch misspellings, type contract function arguments, etc.).
+
+ For this to work, you must upgrade to `typescript@>=4.7.4`. Why is TypeScript v4.7.4 or greater necessary? TypeScript 4.7.4 introduced the ability to [extend constraints on inferred type variables](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/#extends-constraints-on-infer-type-variables), which is used extensively to help narrow types for ABIs. Good news! When upgrading TypeScript from 4.6 to 4.7 there are likely no [breaking changes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-7.html#breaking-changes) for your set up.
+
+- [#941](https://github.com/wevm/wagmi/pull/941) [`0c96009`](https://github.com/wevm/wagmi/commit/0c96009398647a515a57f72ef25c32724f7c978c) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Updated TypeScript generics for contract interaction and typed data actions.
+
+ Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `abi` allows TypeScript to infer `functionName`, `args`, `overrides`, and return types for functions, and `eventName` and `listener` types for events.
+
+ ```diff
+ import { readContract } from '@wagmi/core'
+
+ const result = await readContract({
+ address: '0xā¦',
+ - abi: [ā¦],
+ + abi: [ā¦] as const,
+ functionName: 'balanceOf', // will autocomplete and catch typos
+ args: ['0xā¦'], // inferred based on `functionName`
+ })
+ result // inferred based on `functionName`
+ ```
+
+ This works for the following actions: `readContract`, `writeContract`, `prepareWriteContract`, `multicall`, `readContracts`, `watchMulticall`, `watchReadContracts`, and `watchContractEvent`.
+
+ Adding a [const assertion](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions) to `signTypedData`'s config option, `types`, allows TypeScript to infer `value`.
+
+ ```diff
+ import { signTypedData } from '@wagmi/core'
+
+ const result = await signTypedData({
+ domain: {
+ name: 'Ether Mail',
+ version: '1',
+ chainId: 1,
+ verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
+ },
+ types: {
+ Person: [
+ { name: 'name', type: 'string' },
+ { name: 'wallet', type: 'address' },
+ ],
+ Mail: [
+ { name: 'from', type: 'Person' },
+ { name: 'to', type: 'Person' },
+ { name: 'contents', type: 'string' },
+ ],
+ - },
+ + } as const,
+ value: { // `value` is inferred based on `types`
+ from: {
+ name: 'Cow',
+ wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
+ },
+ to: {
+ name: 'Bob',
+ wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
+ },
+ contents: 'Hello, Bob!',
+ },
+ })
+ ```
+
+### Patch Changes
+
+- [#1061](https://github.com/wevm/wagmi/pull/1061) [`a4ffe8b`](https://github.com/wevm/wagmi/commit/a4ffe8b25516d5504685ae94579da4cd8c409329) Thanks [@alecananian](https://github.com/alecananian)! - Added Arbitrum Goerli Arbiscan block explorer
+
+- [#940](https://github.com/wevm/wagmi/pull/940) [`b6cb8f4`](https://github.com/wevm/wagmi/commit/b6cb8f4cd15eb13073bc7e9ecb4bfa2c261c0663) Thanks [@jxom](https://github.com/jxom)! - The `fetchSigner` action now accepts an optional `chainId` to use for signer initialization as an argument.
+
+ ```tsx
+ import { fetchSigner } from "@wagmi/core";
+ import { optimism } from "@wagmi/core/chains";
+
+ // ...
+
+ fetchSigner({ chainId: optimism.id });
+ ```
+
+- [#1048](https://github.com/wevm/wagmi/pull/1048) [`ed13074`](https://github.com/wevm/wagmi/commit/ed130747c0f28c1d9980a1328883e4000a60455e) Thanks [@Max-3-7](https://github.com/Max-3-7)! - Added support for Avalanche core wallet
+
+- [#1046](https://github.com/wevm/wagmi/pull/1046) [`ab9ecaa`](https://github.com/wevm/wagmi/commit/ab9ecaa74dfa4324279e167dd7e348319ef7d35d) Thanks [@jxom](https://github.com/jxom)! - make ethers block format validator compatible with Celo
+
+- [#1050](https://github.com/wevm/wagmi/pull/1050) [`73d4d47`](https://github.com/wevm/wagmi/commit/73d4d47bc679f4f9a1cf46010fe2bf858c9d0b5c) Thanks [@jxom](https://github.com/jxom)! - update dependencies
+
+ - `zustand@4.1.1`
+
+## 0.5.8
+
+### Patch Changes
+
+- [`8cb07462`](https://github.com/wevm/wagmi/commit/8cb07462acc3c5637398d11d2451f8b8e330d553) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` as an argument to `watchBlockNumber`.
+
+* [`53c1a474`](https://github.com/wevm/wagmi/commit/53c1a4747d03b685e8cfbf55361fc2a56777fb06) Thanks [@tmm](https://github.com/tmm)! - Added missing `decimals` option to `Connector` `watchAsset`
+
+- [`4d74dd4f`](https://github.com/wevm/wagmi/commit/4d74dd4ff827ba5c43c3546a218f38cee45ea76a) Thanks [@jxom](https://github.com/jxom)! - Support ERC20 contracts that represent strings as bytes32
+
+## 0.5.7
+
+### Patch Changes
+
+- [`aa51bc4d`](https://github.com/wevm/wagmi/commit/aa51bc4dc5683bf0178597d2fdb8f2e9d82e7970) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue in `CoinbaseWalletConnector` where the browser extension would unintendedly reset the network when the browser is refreshed.
+
+* [#955](https://github.com/wevm/wagmi/pull/955) [`e326cd80`](https://github.com/wevm/wagmi/commit/e326cd80fe65267db623eb6c80ccdd75572914cf) Thanks [@0xFlicker](https://github.com/0xFlicker)! - Added Infura RPC URL for Sepolia
+
+- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where `useProvider` & `getProvider` were not returning referentially equal providers.
+
+* [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the `watch` option was not respecting the neighboring `chainId` option in `useBlockNumber`.
+
+- [`cec14089`](https://github.com/wevm/wagmi/commit/cec14089500c86687226ab272b4c3fcb85ae3d69) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where block listeners (via `watch`) were firing excessively on L2 chains.
+
+## 0.5.6
+
+### Patch Changes
+
+- [#936](https://github.com/wevm/wagmi/pull/936) [`3329d1f`](https://github.com/wevm/wagmi/commit/3329d1f5880431566e14ac1640f48d0975aec4c2) Thanks [@jxom](https://github.com/jxom)! - Added the ability to provide a custom logger to override how logs are broadcasted to the consumer in wagmi.
+
+ A custom logger can be provided to the wagmi client via `logger`.
+
+ ### API
+
+ ```tsx
+ logger?: {
+ warn: typeof console.warn | null
+ }
+ ```
+
+ ### Examples
+
+ **Passing in a custom logger**
+
+ You can pass in a function to define your own custom logger.
+
+ ```diff
+ + import { logWarn } from './logger';
+
+ const client = createClient({
+ ...
+ + logger: {
+ + warn: message => logWarn(message)
+ + }
+ ...
+ })
+ ```
+
+ **Disabling a logger**
+
+ You can disable a logger by passing `null` as the value.
+
+ ```diff
+ const client = createClient({
+ ...
+ + logger: {
+ + warn: null
+ + }
+ ...
+ })
+ ```
+
+* [#889](https://github.com/wevm/wagmi/pull/889) [`27788ed`](https://github.com/wevm/wagmi/commit/27788ed989b5dc26849c7945fb91a92e56766018) Thanks [@jxom](https://github.com/jxom)! - Make multicall & readContracts more error robust
+
+## 0.5.5
+
+### Patch Changes
+
+- [#912](https://github.com/wevm/wagmi/pull/912) [`e529e12`](https://github.com/wevm/wagmi/commit/e529e125c713ed3ef24a59c6bf226fe4deee7ac9) Thanks [@zouhangwithsweet](https://github.com/zouhangwithsweet)! - Added BitKeep to injected flags
+
+- [#912](https://github.com/wevm/wagmi/pull/910) Thanks [@mytangying](https://github.com/zouhangwithsweet)! - Added MathWallet to injected flags
+
+- [#904](https://github.com/wevm/wagmi/pull/904) [`c231058`](https://github.com/wevm/wagmi/commit/c23105850f335f8798031e14c7098b7dee8c2975) Thanks [@jxom](https://github.com/jxom)! - Minimized contract interface returned from `prepareWriteContract`.
+
+## 0.5.4
+
+### Patch Changes
+
+- [#852](https://github.com/wevm/wagmi/pull/852) [`c3192d0`](https://github.com/wevm/wagmi/commit/c3192d0663aa332ae9edfd9dd49b333454013ab7) Thanks [@skeithc](https://github.com/skeithc)! - Added support for the Sepolia testnet
+
+## 0.5.3
+
+### Patch Changes
+
+- [#835](https://github.com/wevm/wagmi/pull/835) [`1b85e54`](https://github.com/wevm/wagmi/commit/1b85e54ae654e2564cf5bc2dae6411fe0a25875c) Thanks [@jxom](https://github.com/jxom)! - Update `@coinbase/wallet-sdk` to `3.4.1`
+
+* [#834](https://github.com/wevm/wagmi/pull/834) [`9655879`](https://github.com/wevm/wagmi/commit/96558793b0319df47aefafa6b7b9c959068d491b) Thanks [@jxom](https://github.com/jxom)! - Update zustand to `4.0.0`
+
+## 0.5.2
+
+### Patch Changes
+
+- [#823](https://github.com/wevm/wagmi/pull/823) [`10b8b78`](https://github.com/wevm/wagmi/commit/10b8b78605b7246b2c55b8d69f96663906e5cd20) Thanks [@tmm](https://github.com/tmm)! - Add Optimism Goerli to `chain` lookup.
+
+## 0.5.1
+
+### Patch Changes
+
+- [#767](https://github.com/wevm/wagmi/pull/767) [`e9392f3`](https://github.com/wevm/wagmi/commit/e9392f396e48e928bd9d2522e3ad671c589f08cb) Thanks [@klyap](https://github.com/klyap)! - Add Optimism Goerli chain ahead of [Kovan deprecation](https://dev.optimism.io/kovan-to-goerli).
+
+* [#817](https://github.com/wevm/wagmi/pull/817) [`7e5cac7`](https://github.com/wevm/wagmi/commit/7e5cac75815dcd8aa563462342a4853fc5207735) Thanks [@alecananian](https://github.com/alecananian)! - Added custom name mapping for 1inch Wallet injected provider
+
+- [#806](https://github.com/wevm/wagmi/pull/806) [`0b34e56`](https://github.com/wevm/wagmi/commit/0b34e56db97e6dcdb71088e0149b2d55ebc604a5) Thanks [@vmichalik](https://github.com/vmichalik)! - Fix canonical testnet native asset symbols by changing them to ETH
+
+* [#778](https://github.com/wevm/wagmi/pull/778) [`0892908`](https://github.com/wevm/wagmi/commit/08929084eeeba1a3a55aa098fa9d92a243685ad5) Thanks [@0xcadams](https://github.com/0xcadams)! - Add Arbitrum Goerli chain.
+
+## 0.5.0
+
+### Minor Changes
+
+- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `sendTransaction` action now needs to be:
+
+ - prepared with the `prepareSendTransaction` action **(new functionality)**, or
+ - recklessly unprepared **(previous functionality)**
+
+ > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)
+
+ ### Prepared usage
+
+ ```diff
+ import { prepareSendTransaction, sendTransaction } from '@wagmi/core'
+
+ +const config = await prepareSendTransaction({
+ + request: {
+ + to: 'moxey.eth',
+ + value: parseEther('1'),
+ + }
+ +})
+
+ const result = await sendTransaction({
+ - request: {
+ - to: 'moxey.eth',
+ - value: parseEther('1')
+ - }
+ + ...config
+ })
+ ```
+
+ ### Recklessly unprepared usage
+
+ It is possible to use `sendTransaction` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.
+
+ ```diff
+ import { sendTransaction } from '@wagmi/core'
+
+ const result = await sendTransaction({
+ + mode: 'recklesslyUnprepared',
+ request: {
+ to: 'moxey.eth',
+ value: parseEther('1'),
+ }
+ })
+ ```
+
+* [#760](https://github.com/wevm/wagmi/pull/760) [`d8af6bf`](https://github.com/wevm/wagmi/commit/d8af6bf50885aec110ae4d64716642453aa27896) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** `alchemyProvider` and `infuraProvider` now use a generic `apiKey` configuration option instead of `alchemyId` and `infuraId`.
+
+ ```diff
+ import { alchemyProvider } from '@wagmi/core/providers/alchemy'
+ import { infuraProvider } from '@wagmi/core/providers/infura'
+
+ alchemyProvider({
+ - alchemyId: 'yourAlchemyApiKey',
+ + apiKey: 'yourAlchemyApiKey',
+ })
+
+ infuraProvider({
+ - infuraId: 'yourInfuraApiKey',
+ + apiKey: 'yourInfuraApiKey',
+ })
+ ```
+
+- [#727](https://github.com/wevm/wagmi/pull/727) [`ac3b9b8`](https://github.com/wevm/wagmi/commit/ac3b9b87f80cb45b65d003f09d916d7d1427a62e) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: Moved the `pollingInterval` config option from the chain provider config to `configureChains` config.
+
+ ```diff
+ const { chains, provider } = configureChains(
+ [chain.mainnet, chain.polygon],
+ [
+ - alchemyProvider({ apiKey, pollingInterval: 5000 }),
+ - publicProvider({ pollingInterval: 5000 })
+ + alchemyProvider({ apiKey }),
+ + publicProvider()
+ ],
+ + { pollingInterval: 5000 }
+ )
+ ```
+
+* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `sendTransaction` action now returns an object only consisting of `hash` & `wait`, and not the full [`TransactionResponse`](https://docs.ethers.io/v5/api/providers/types/#providers-TransactionResponse).
+
+ If you require the full `TransactionResponse`, you can use `fetchTransaction`:
+
+ ```diff
+ import { sendTransaction, fetchTransaction } from '@wagmi/core'
+
+ const {
+ hash,
+ wait,
+ - ...transaction
+ } = sendTransaction(...)
+
+ +const transaction = fetchTransaction({ hash })
+ ```
+
+ > Why? The old implementation of `sendTransaction` created a long-running async task, causing [UX pitfalls](https://wagmi.sh/docs/prepare-hooks#ux-pitfalls-without-prepare-hooks) when invoked in a click handler.
+
+- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: If a `chainId` is passed to `writeContract` or `sendTransaction`, it will no longer attempt to switch chain before sending the transaction. Instead, it will throw an error if the user is on the wrong chain.
+
+ > Why?
+ >
+ > - Eagerly prompting to switch chain in these actions created a long-running async task that that makes [iOS App Links](https://wagmi.sh/docs/prepare-hooks#ios-app-link-constraints) vulnerable.
+ > - Not all wallets support programmatic chain switching.
+
+### Patch Changes
+
+- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The configuration passed to the `writeContract` action now needs to be:
+
+ - prepared with the `prepareWriteContract` action **(new functionality)**, or
+ - recklessly unprepared **(previous functionality)**
+
+ > Why? [Read here](https://wagmi.sh/docs/prepare-hooks)
+
+ ### Prepared usage
+
+ ```diff
+ import { prepareWriteContract, writeContract } from '@wagmi/core'
+
+ const tokenId = 69
+
+ +const config = await prepareWriteContract({
+ + addressOrName: '0x...',
+ + contractInterface: wagmiAbi,
+ + functionName: 'mint',
+ + args: [tokenId]
+ +})
+
+ const result = await writeContract({
+ - addressOrName: '0x...',
+ - contractInterface: wagmiAbi,
+ - functionName: 'mint',
+ - args: [tokenId],
+ + ...config
+ })
+ ```
+
+ ### Recklessly unprepared usage
+
+ It is possible to use `writeContract` without preparing the configuration first by passing `mode: 'recklesslyUnprepared'`.
+
+ ```diff
+ import { writeContract } from '@wagmi/core'
+
+ const tokenId = 69
+
+ const result = await writeContract({
+ + mode: 'recklesslyUnprepared',
+ addressOrName: '0x...',
+ contractInterface: wagmiAbi,
+ functionName: 'mint',
+ args: [tokenId],
+ })
+ ```
+
+* [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `prepareSendTransaction` hook that prepares the parameters required for sending a transaction.
+
+ It returns config to be passed through to `sendTransaction`.
+
+ ```ts
+ import { prepareSendTransaction, sendTransaction } from "@wagmi/core";
+
+ const config = await prepareSendTransaction({
+ request: {
+ to: "moxey.eth",
+ value: parseEther("1"),
+ },
+ });
+ const result = await sendTransaction(config);
+ ```
+
+- [#658](https://github.com/wevm/wagmi/pull/658) [`d70c115`](https://github.com/wevm/wagmi/commit/d70c115131f299fb61f87867b6ac4218e0bcf432) Thanks [@jxom](https://github.com/jxom)! - Added the `prepareWriteContract` hook that prepares the parameters required for a contract write transaction.
+
+ It returns config to be passed through to `writeContract`.
+
+ Example:
+
+ ```tsx
+ import { prepareWriteContract, writeContract } from "@wagmi/core";
+
+ const config = await prepareWriteContract({
+ addressOrName: "0x...",
+ contractInterface: wagmiAbi,
+ functionName: "mint",
+ });
+ const result = await writeContract(config);
+ ```
+
+* [#739](https://github.com/wevm/wagmi/pull/739) [`c2295a5`](https://github.com/wevm/wagmi/commit/c2295a56cc86d02cc6602e2b4557b8ab9a091a3f) Thanks [@tmm](https://github.com/tmm)! - Fix balance formatting for tokens that do not have 18 decimals.
+
+- [#759](https://github.com/wevm/wagmi/pull/759) [`959953d`](https://github.com/wevm/wagmi/commit/959953d1f5b3e8189bac56de245c62333470d18e) Thanks [@tmm](https://github.com/tmm)! - Added `fetchTransaction` action:
+
+ ```ts
+ import { fetchTransaction } from "@wagmi/core";
+
+ const transaction = await fetchTransaction({
+ hash: "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",
+ });
+ ```
+
+## 0.4.9
+
+### Patch Changes
+
+- [#721](https://github.com/tmm/wagmi/pull/721) [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6) Thanks [@tmm](https://github.com/tmm)! - Stay connected to existing `client.connector` when `connect` action fails to connect to new connector.
+
+* [#721](https://github.com/tmm/wagmi/pull/721) [`abea25f`](https://github.com/tmm/wagmi/commit/abea25fd15d81d1ecaec9d3fbd687042ab29b1e6) Thanks [@tmm](https://github.com/tmm)! - Switch `fetchToken` action to multicall and add `name` output property.
+
+## 0.4.8
+
+### Patch Changes
+
+- [#693](https://github.com/tmm/wagmi/pull/693) [`56e468c`](https://github.com/tmm/wagmi/commit/56e468c3617ec222527bb3c02eadec3ebeff923a) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Fix import errors with Coinbase Wallet SDK in Vite
+
+## 0.4.7
+
+### Patch Changes
+
+- [#677](https://github.com/tmm/wagmi/pull/677) [`35e4219`](https://github.com/tmm/wagmi/commit/35e42199af9dd346549c1718e144728f55b8d7dd) Thanks [@jxom](https://github.com/jxom)! - Move `parseContractResult` to `@wagmi/core`
+
+## 0.4.6
+
+### Patch Changes
+
+- [#670](https://github.com/tmm/wagmi/pull/670) [`29a0d21`](https://github.com/tmm/wagmi/commit/29a0d21ee83995559f63542778dfa805f15e7441) Thanks [@tmm](https://github.com/tmm)! - Added ethers-compatible `deepEqual` function.
+
+## 0.4.5
+
+### Patch Changes
+
+- [#654](https://github.com/tmm/wagmi/pull/654) [`e66530b`](https://github.com/tmm/wagmi/commit/e66530bf4881b3533c528f8c5a5f41be0eab0a64) Thanks [@jxom](https://github.com/jxom)! - fix `multicall` returning nullish data for all calls unexpectedly
+
+## 0.4.4
+
+### Patch Changes
+
+- [#616](https://github.com/tmm/wagmi/pull/616) [`7a7a17a`](https://github.com/tmm/wagmi/commit/7a7a17a46d4c9e6465cc46a111b5fe8a56109f1b) Thanks [@tmm](https://github.com/tmm)! - Adds `UNSTABLE_shimOnConnectSelectAccount` flag. With this flag and "disconnected" with `shimDisconnect` enabled, the user is prompted to select a different MetaMask account (than the currently connected account) when trying to connect (e.g. `useConnect`/`connect` action).
+
+## 0.4.3
+
+### Patch Changes
+
+- [#631](https://github.com/tmm/wagmi/pull/631) [`a780e32`](https://github.com/tmm/wagmi/commit/a780e32e91a0072c795fa0b5a6111302768e2a01) Thanks [@tmm](https://github.com/tmm)! - Fix WalletConnect stale session
+
+## 0.4.2
+
+### Patch Changes
+
+- [#624](https://github.com/tmm/wagmi/pull/624) [`416fa7e`](https://github.com/tmm/wagmi/commit/416fa7ee1f8019ab86e33fb93783ffddecc02c49) Thanks [@jxom](https://github.com/jxom)! - Fix broken `WebSocketProvider` type defs
+
+## 0.4.1
+
+### Patch Changes
+
+- [#622](https://github.com/tmm/wagmi/pull/622) [`d171581`](https://github.com/tmm/wagmi/commit/d171581464891dd870d97b6232205da0cb152d9b) Thanks [@tmm](https://github.com/tmm)! - Use `domain.chainId` to validate and switch chain before signing in `signTypedData`.
+
+* [#618](https://github.com/tmm/wagmi/pull/618) [`a5138e8`](https://github.com/tmm/wagmi/commit/a5138e82a00e4d9469ad78c97b2d34200d7f1fbe) Thanks [@tmm](https://github.com/tmm)! - Fix adding chains when using MetaMask mobile app, add `publicRpcUrls` constant, and default to public endpoint when adding chain.
+
+## 0.4.0
+
+### Minor Changes
+
+- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `provider` config option is now required on `createClient`. It is recommended to pass the [`provider` given from `configureChains`](https://wagmi.sh/docs/providers/configuring-chains).
+
+ ```diff
+ import {
+ createClient,
+ + defaultChains,
+ + configureChains
+ } from 'wagmi'
+ +import { publicProvider } from 'wagmi/providers/publicProvider'
+
+ +const { provider } = configureChains(defaultChains, [
+ + publicProvider
+ +])
+
+ const client = createClient({
+ + provider
+ })
+ ```
+
+ If you previously used an ethers.js Provider, you now need to provide your `chains` on the Provider instance:
+
+ ```diff
+ import {
+ createClient,
+ + defaultChains
+ } from 'wagmi'
+ import ethers from 'ethers'
+
+ const client = createClient({
+ - provider: getDefaultProvider()
+ + provider: Object.assign(getDefaultProvider(), { chains: defaultChains })
+ })
+ ```
+
+* [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Use ethereum-lists chains symbols
+
+- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** Removed the `chainId` parameter from `connectors` function on `createClient`.
+
+ ```diff
+ const client = createClient({
+ - connectors({ chainId }) {
+ + connectors() {
+ ...
+ }
+ })
+ ```
+
+ If you previously derived RPC URLs from the `chainId` on `connectors`, you can now remove that logic as `wagmi` now handles RPC URLs internally when used with `configureChains`.
+
+ ```diff
+ import {
+ chain,
+ + configureChains,
+ createClient
+ } from 'wagmi';
+
+ +import { publicProvider } from 'wagmi/providers/public'
+
+ import { CoinbaseWalletConnector } from 'wagmi/connectors/coinbaseWallet'
+ import { InjectedConnector } from 'wagmi/connectors/injected'
+ import { MetaMaskConnector } from 'wagmi/connectors/metaMask'
+ import { WalletConnectConnector } from 'wagmi/connectors/walletConnect'
+
+ +const { chains } = configureChains(
+ + [chain.mainnet],
+ + [publicProvider()]
+ +);
+
+ const client = createClient({
+ - connectors({ chainId }) {
+ - const chain = chains.find((x) => x.id === chainId) ?? defaultChain
+ - const rpcUrl = chain.rpcUrls.alchemy
+ - ? `${chain.rpcUrls.alchemy}/${alchemyId}`
+ - : chain.rpcUrls.default
+ - return [
+ + connectors: [
+ new MetaMaskConnector({ chains }),
+ new CoinbaseWalletConnector({
+ chains,
+ options: {
+ appName: 'wagmi',
+ - chainId: chain.id,
+ - jsonRpcUrl: rpcUrl,
+ },
+ }),
+ new WalletConnectConnector({
+ chains,
+ options: {
+ qrcode: true,
+ - rpc: { [chain.id]: rpcUrl },
+ },
+ }),
+ new InjectedConnector({
+ chains,
+ options: { name: 'Injected' },
+ }),
+ ]
+ - },
+ })
+ ```
+
+* [#611](https://github.com/tmm/wagmi/pull/611) [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `Connector`s `getProvider` method no longer supports the `create` config parameter. Use the `chainId` config option instead.
+
+- [#596](https://github.com/tmm/wagmi/pull/596) [`a770af7`](https://github.com/tmm/wagmi/commit/a770af7d2cb214b6620d5341115f1e938e1e77ff) Thanks [@tmm](https://github.com/tmm)! - **Breaking**: `TypedDataDomain` and `TypedDataField` types were removed and incorporated into `SignTypedDataArgs`.
+
+* [`4f8f3c0`](https://github.com/tmm/wagmi/commit/4f8f3c0d65383bd8bbdfc3f1033adfdb11d80ebb) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Update symbols to match ethereum-lists/chains
+
+- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `writeContract` function parameters have been consolidated into a singular config parameter.
+
+ Before:
+
+ ```tsx
+ writeContract(
+ {
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ },
+ "feed",
+ );
+ ```
+
+ After:
+
+ ```tsx
+ readContract({
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ functionName: "feed",
+ });
+ ```
+
+### Patch Changes
+
+- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - **Breaking**: The `readContract` & `watchReadContract` function parameters have been consolidated into a singular config parameter.
+
+ Before:
+
+ ```tsx
+ readContract(
+ {
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ },
+ "getHunger",
+ { args: [0] },
+ );
+
+ watchReadContract(
+ {
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ },
+ "getHunger",
+ { args: [0] },
+ (result) => {},
+ );
+ ```
+
+ After:
+
+ ```tsx
+ readContract({
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ functionName: "getHunger",
+ args: [0],
+ });
+
+ watchReadContract(
+ {
+ addressOrName: "0xecb504d39723b0be0e3a9aa33d646642d1051ee1",
+ contractInterface: wagmigotchiABI,
+ functionName: "getHunger",
+ args: [0],
+ },
+ (result) => {},
+ );
+ ```
+
+* [#598](https://github.com/tmm/wagmi/pull/598) [`fef26bf`](https://github.com/tmm/wagmi/commit/fef26bf8aef76fc9621e3cd54d4e0ca8f69abb38) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Update `@coinbase/wallet-sdk` peer dependency to `>=3.3.0` to fix errors when connecting with older versions of the Coinbase Wallet extension and mobile app.
+
+- [#611](https://github.com/tmm/wagmi/pull/611) [`3089c34`](https://github.com/tmm/wagmi/commit/3089c34196d4034acabac031e0a2f7ee63ae30cc) Thanks [@tmm](https://github.com/tmm)! - Added `chainId` config parameter for `writeContract` and `sendTransaction`.
+
+ If `chainId` is provided, the connector will validate that `chainId` is the active chain before sending a transaction (and switch to `chainId` if necessary).
+
+* [#582](https://github.com/tmm/wagmi/pull/582) [`b03830a`](https://github.com/tmm/wagmi/commit/b03830a54465215c2526f9509543fe2c978bfe70) Thanks [@jxom](https://github.com/jxom)! - Fixed an issue where the wagmi client's `status` would not update from `"disconnected"` to `"connecting" -> "connected"` when the `connect` action is invoked.
+
+- [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `multicall` & `watchMulticall` action that provides multicall support.
+
+ Internally uses the [`multicall3` contract](https://github.com/mds1/multicall).
+
+ [See example usage](https://github.com/tmm/wagmi/blob/194866032985fdd3f49bc46bf1b14181d7cb61d1/packages/core/src/actions/contracts/multicall.test.ts)
+
+* [`fc94210`](https://github.com/tmm/wagmi/commit/fc94210b67daa91aa164625dfe189d5b6c2f92d4) Thanks [@jxom](https://github.com/jxom)! - Added a `readContracts` & `watchReadContracts` action that provides the ability to batch up multiple ethers Contract read-only methods.
+
+## 0.3.8
+
+### Patch Changes
+
+- [#570](https://github.com/tmm/wagmi/pull/570) [`0e3fe15`](https://github.com/tmm/wagmi/commit/0e3fe15445377f35d6f4142b49bf1c96bfeb62cd) Thanks [@tmm](https://github.com/tmm)! - adds chain for [Foundry](https://github.com/foundry-rs)
+
+## 0.3.7
+
+### Patch Changes
+
+- [#550](https://github.com/tmm/wagmi/pull/550) [`2a5313e`](https://github.com/tmm/wagmi/commit/2a5313e8cbc9ba6335e8e4b85e43862c9b711bd3) Thanks [@tmm](https://github.com/tmm)! - fix `CoinbaseWalletConnector` possible type error
+
+* [#548](https://github.com/tmm/wagmi/pull/548) [`0c48719`](https://github.com/tmm/wagmi/commit/0c487199f2421f042abc1f1d139468ccbbc5646a) Thanks [@dohaki](https://github.com/dohaki)! - add ensAddress to Chain type
+
+- [#549](https://github.com/tmm/wagmi/pull/549) [`89b3a74`](https://github.com/tmm/wagmi/commit/89b3a74ead4234daacd0dcf8506659887ebf0553) Thanks [@tmm](https://github.com/tmm)! - Turns on [`noUncheckedIndexedAccess`](https://www.typescriptlang.org/tsconfig#noUncheckedIndexedAccess=) and [`strictNullChecks`](https://www.typescriptlang.org/tsconfig#strictNullChecks=) for better runtime safety.
+
+## 0.3.6
+
+### Patch Changes
+
+- [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `shimChainChangedDisconnect` option to `InjectedConnector`. Defaults to `true` for `MetaMaskConnector`.
+
+* [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `lastUsedChainId` property to the wagmi `Client`.
+
+- [#526](https://github.com/tmm/wagmi/pull/526) [`e95c5f9`](https://github.com/tmm/wagmi/commit/e95c5f91859e57d079b962a72d06b93dce004d2f) Thanks [@jxom](https://github.com/jxom)! - Added `chainId` config option to the `connect` action.
+
+ Example:
+
+ ```tsx
+ import { connect } from "@wagmi/core";
+
+ await connect({ chainId: 69 });
+ ```
+
+## 0.3.5
+
+### Patch Changes
+
+- [#543](https://github.com/tmm/wagmi/pull/543) [`4d489fd`](https://github.com/tmm/wagmi/commit/4d489fd630dd8c00440bdaf4d646de662c41ff52) Thanks [@tmm](https://github.com/tmm)! - fix fee data formatting for null values
+
+## 0.3.4
+
+### Patch Changes
+
+- [`c4deb66`](https://github.com/tmm/wagmi/commit/c4deb6655a52e4cc4e5b3fd82202db11d6106848) Thanks [@jxom](https://github.com/jxom)! - infer `options.chainId` config from `chains` on WalletConnectConnector
+
+## 0.3.3
+
+### Patch Changes
+
+- [#486](https://github.com/tmm/wagmi/pull/486) [`dbfe3dd`](https://github.com/tmm/wagmi/commit/dbfe3dd320d178d6854a8096101200c1508786bb) Thanks [@tmm](https://github.com/tmm)! - add chains entrypoint
+
+## 0.3.2
+
+### Patch Changes
+
+- [`17212da`](https://github.com/tmm/wagmi/commit/17212da601640110d2835300e6433d1433db212e) Thanks [@jxom](https://github.com/jxom)! - Made the `defaultChains` type generic in `configureChains`.
+
+## 0.3.1
+
+### Patch Changes
+
+- [#484](https://github.com/tmm/wagmi/pull/484) [`1b9a503`](https://github.com/tmm/wagmi/commit/1b9a5033d51c6655b4f6570c490da6e0e9a29da9) Thanks [@tmm](https://github.com/tmm)! - export React Context
+
+## 0.3.0
+
+### Minor Changes
+
+- [#408](https://github.com/tmm/wagmi/pull/408) [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a) Thanks [@jxom](https://github.com/jxom)! - **Breaking:** The `connectors` option on `createClient` no longer reacts to chain switching.
+
+ **Passing a function to `connectors` has been deprecated.**
+
+ If you previously derived an RPC URL from the `chainId` in `connectors`, you will need to migrate to use the [`configureChains` API](https://wagmi.sh/docs/providers/configuring-chains).
+
+ ### Before
+
+ ```tsx
+ import { providers } from "ethers";
+ import { chain, createClient, defaultChains } from "wagmi";
+ import { CoinbaseWalletConnector } from "wagmi/connectors/coinbaseWallet";
+ import { InjectedConnector } from "wagmi/connectors/injected";
+ import { MetaMaskConnector } from "wagmi/connectors/metaMask";
+ import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
+
+ const alchemyId = process.env.ALCHEMY_ID;
+
+ const chains = defaultChains;
+ const defaultChain = chain.mainnet;
+
+ const client = createClient({
+ autoConnect: true,
+ connectors({ chainId }) {
+ const chain = chains.find((x) => x.id === chainId) ?? defaultChain;
+ const rpcUrl = chain.rpcUrls.alchemy
+ ? `${chain.rpcUrls.alchemy}/${alchemyId}`
+ : chain.rpcUrls.default;
+ return [
+ new MetaMaskConnector({ chains }),
+ new CoinbaseWalletConnector({
+ chains,
+ options: {
+ appName: "wagmi",
+ chainId: chain.id,
+ jsonRpcUrl: rpcUrl,
+ },
+ }),
+ new WalletConnectConnector({
+ chains,
+ options: {
+ qrcode: true,
+ rpc: { [chain.id]: rpcUrl },
+ },
+ }),
+ new InjectedConnector({
+ chains,
+ options: {
+ name: "Injected",
+ shimDisconnect: true,
+ },
+ }),
+ ];
+ },
+ });
+ ```
+
+ ### After
+
+ ```tsx
+ import { chain, createClient, defaultChains } from "wagmi";
+
+ import { alchemyProvider } from "wagmi/providers/alchemy";
+ import { publicProvider } from "wagmi/providers/public";
+
+ import { CoinbaseWalletConnector } from "wagmi/connectors/coinbaseWallet";
+ import { InjectedConnector } from "wagmi/connectors/injected";
+ import { MetaMaskConnector } from "wagmi/connectors/metaMask";
+ import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
+
+ const alchemyId = process.env.ALCHEMY_ID;
+
+ const { chains } = configureChains(defaultChains, [
+ alchemyProvider({ alchemyId }),
+ publicProvider(),
+ ]);
+
+ const client = createClient({
+ autoConnect: true,
+ connectors: [
+ new MetaMaskConnector({ chains }),
+ new CoinbaseWalletConnector({
+ chains,
+ options: {
+ appName: "wagmi",
+ },
+ }),
+ new WalletConnectConnector({
+ chains,
+ options: {
+ qrcode: true,
+ },
+ }),
+ new InjectedConnector({
+ chains,
+ options: {
+ name: "Injected",
+ shimDisconnect: true,
+ },
+ }),
+ ],
+ });
+ ```
+
+* [#468](https://github.com/tmm/wagmi/pull/468) [`44a884b`](https://github.com/tmm/wagmi/commit/44a884b84171c418f57701e80ef8de972948ef0b) Thanks [@tmm](https://github.com/tmm)! - **Breaking:** Duplicate exports with different names and the same functionality were removed to simplify the public API. In addition, confusing exports were renamed to be more descriptive.
+
+ - `createWagmiClient` alias was removed. Use `createClient` instead.
+ - `useWagmiClient` alias was removed. Use `useClient` instead.
+ - `WagmiClient` alias was removed. Use `Client` instead.
+ - `createWagmiStorage` alias was removed. Use `createStorage` instead.
+ - `Provider` was renamed and `WagmiProvider` alias was removed. Use `WagmiConfig` instead.
+
+- [#408](https://github.com/tmm/wagmi/pull/408) [`bfcc3a5`](https://github.com/tmm/wagmi/commit/bfcc3a51bbb1551753e3ccde6af134e9fd4fec9a) Thanks [@jxom](https://github.com/jxom)! - Add `configureChains` API.
+
+ The `configureChains` function allows you to configure your chains with a selected provider (Alchemy, Infura, JSON RPC, Public RPC URLs). This means you don't have to worry about deriving your own RPC URLs for each chain, or instantiating a Ethereum Provider.
+
+ `configureChains` accepts 3 parameters: an array of chains, and an array of providers, and a config object.
+
+ [Learn more about configuring chains & providers.](https://wagmi.sh/docs/providers/configuring-chains)
+
+ ### Before
+
+ ```tsx
+ import { providers } from "ethers";
+ import { chain, createClient, defaultChains } from "wagmi";
+ import { CoinbaseWalletConnector } from "wagmi/connectors/coinbaseWallet";
+ import { InjectedConnector } from "wagmi/connectors/injected";
+ import { MetaMaskConnector } from "wagmi/connectors/metaMask";
+ import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
+
+ const alchemyId = process.env.ALCHEMY_ID;
+
+ const chains = defaultChains;
+ const defaultChain = chain.mainnet;
+
+ const client = createClient({
+ autoConnect: true,
+ connectors({ chainId }) {
+ const chain = chains.find((x) => x.id === chainId) ?? defaultChain;
+ const rpcUrl = chain.rpcUrls.alchemy
+ ? `${chain.rpcUrls.alchemy}/${alchemyId}`
+ : chain.rpcUrls.default;
+ return [
+ new MetaMaskConnector({ chains }),
+ new CoinbaseWalletConnector({
+ chains,
+ options: {
+ appName: "wagmi",
+ chainId: chain.id,
+ jsonRpcUrl: rpcUrl,
+ },
+ }),
+ new WalletConnectConnector({
+ chains,
+ options: {
+ qrcode: true,
+ rpc: { [chain.id]: rpcUrl },
+ },
+ }),
+ new InjectedConnector({
+ chains,
+ options: {
+ name: "Injected",
+ shimDisconnect: true,
+ },
+ }),
+ ];
+ },
+ provider: ({ chainId }) =>
+ new providers.AlchemyProvider(chainId, alchemyId),
+ });
+ ```
+
+ ### After
+
+ ```tsx
+ import { chain, createClient, defaultChains } from "wagmi";
+
+ import { alchemyProvider } from "wagmi/providers/alchemy";
+ import { publicProvider } from "wagmi/providers/public";
+
+ import { CoinbaseWalletConnector } from "wagmi/connectors/coinbaseWallet";
+ import { InjectedConnector } from "wagmi/connectors/injected";
+ import { MetaMaskConnector } from "wagmi/connectors/metaMask";
+ import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
+
+ const alchemyId = process.env.ALCHEMY_ID;
+
+ const { chains, provider, webSocketProvider } = configureChains(
+ defaultChains,
+ [alchemyProvider({ alchemyId }), publicProvider()],
+ );
+
+ const client = createClient({
+ autoConnect: true,
+ connectors: [
+ new MetaMaskConnector({ chains }),
+ new CoinbaseWalletConnector({
+ chains,
+ options: {
+ appName: "wagmi",
+ },
+ }),
+ new WalletConnectConnector({
+ chains,
+ options: {
+ qrcode: true,
+ },
+ }),
+ new InjectedConnector({
+ chains,
+ options: {
+ name: "Injected",
+ shimDisconnect: true,
+ },
+ }),
+ ],
+ provider,
+ webSocketProvider,
+ });
+ ```
+
+### Patch Changes
+
+- [#404](https://github.com/tmm/wagmi/pull/404) [`f81c156`](https://github.com/tmm/wagmi/commit/f81c15665e2e71534f84ada3fa705f2d78627472) Thanks [@holic](https://github.com/holic)! - Add `ProviderRpcError` and `RpcError` error classes.
+
+ Certain wagmi-standardized errors may wrap `ProviderRpcError` or `RpcError`. For these cases, you can access the original provider rpc or rpc error value using the `internal` property.
+
+* [#459](https://github.com/tmm/wagmi/pull/459) [`72dcf7c`](https://github.com/tmm/wagmi/commit/72dcf7c09e814261b2e43a8fa364c57675c472de) Thanks [@tmm](https://github.com/tmm)! - update dependencies
+
+- [#473](https://github.com/tmm/wagmi/pull/473) [`a54f3e2`](https://github.com/tmm/wagmi/commit/a54f3e23ea385ed8aa4ad188128d7089ba20f83e) Thanks [@cesargdm](https://github.com/cesargdm)! - Add workaround for CoinbaseWalletSDK import on esbuild
+
+* [#447](https://github.com/tmm/wagmi/pull/447) [`b9ebf78`](https://github.com/tmm/wagmi/commit/b9ebf782e0900725bcb76483686b30f09d357ebd) Thanks [@tmm](https://github.com/tmm)! - Fix case where connector disconnected while app was closed and stale data was returned when autoconnecting. For example, [MetaMask was locked](https://github.com/tmm/wagmi/issues/444) when page was closed.
+
+## 0.2.5
+
+### Patch Changes
+
+- [`4e03666`](https://github.com/tmm/wagmi/commit/4e03666428d42fc9186c617001b5eb356229677e) Thanks [@tmm](https://github.com/tmm)! - bump dependencies #429
+ add imToken support for WC switch chains #432
+ fix MetaMask and Brave Wallet collision #436
+
+## 0.2.4
+
+### Patch Changes
+
+- [#421](https://github.com/tmm/wagmi/pull/421) [`a232b3f`](https://github.com/tmm/wagmi/commit/a232b3ff5cc41e882c4d2a34c599a8cb670edd2b) Thanks [@tmm](https://github.com/tmm)! - fix erc721 abi
+
+## 0.2.3
+
+### Patch Changes
+
+- [#412](https://github.com/tmm/wagmi/pull/412) [`80bef4f`](https://github.com/tmm/wagmi/commit/80bef4ff3f714b0b8f896f1b4b658acc7266299b) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Import providers from `ethers` peer dependency rather than `@ethersproject/providers` to avoid multiple conflicting versions being installed
+
+## 0.2.2
+
+### Patch Changes
+
+- [`018c2a1`](https://github.com/tmm/wagmi/commit/018c2a11b22ee513571cc7f83fd63f7eb169ee70) Thanks [@tmm](https://github.com/tmm)! - - warn and fallback to default client #380
+
+ - remove signerOrProvider option from read contract #390
+
+ - MetaMaskConnector #391
+
+## 0.2.1
+
+### Patch Changes
+
+- [`afc4607`](https://github.com/tmm/wagmi/commit/afc46071e91601ab8a2b465524da796cd60b6ad4) Thanks [@tmm](https://github.com/tmm)! - - Fix time scaling e9593df
+ - Use fully-specified path for use-sync-external-store import 7b235c1
+ - Update serialize 236fc17
+
+## 0.2.0
+
+### Minor Changes
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - don't persist account data when `autoConnect` is falsy
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - fix(@wagmi/core): persist connector chains to local storage
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - Favour `message` event over `connecting` event to conform to EIP-1193
+ - Export `useWaitForTransaction`
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Initial 0.3.0 release
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Add `cacheOnBlock` config for `useContractRead`
+ Update `react-query` to v4
+ Fix `watchBlockNumber` listener leak
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - add `connecting` event to connectors
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - Fix issue where `getProvider` was not being awaited in `getSigner`
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - - remove storage persistence of `connector`
+ - add `chains` to client state
+
+### Patch Changes
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - add chainId to actions and hooks
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - showtime
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - improve type support for ethers providers
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update zustand
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update babel target
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - update block explorers and rpc urls structure
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - keep previous data when watching
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - republish
+
+- [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - fix stale connectors when switching chains
+
+* [#311](https://github.com/tmm/wagmi/pull/311) [`24ce011`](https://github.com/tmm/wagmi/commit/24ce0113022b890e9582c6cc24035926e0d2b32d) Thanks [@tmm](https://github.com/tmm)! - last beta
+
+## 0.2.0-next.18
+
+### Patch Changes
+
+- showtime
+
+## 0.2.0-next.17
+
+### Patch Changes
+
+- update block explorers and rpc urls structure
+
+## 0.2.0-next.16
+
+### Patch Changes
+
+- last beta
+
+## 0.2.0-next.15
+
+### Patch Changes
+
+- update zustand
+
+## 0.2.0-next.14
+
+### Minor Changes
+
+- Add `cacheOnBlock` config for `useContractRead`
+- Update `react-query` to v4
+- Fix `watchBlockNumber` listener leak
+
+## 0.2.0-next.13
+
+### Patch Changes
+
+- keep previous data when watching
+
+## 0.2.0-next.12
+
+### Patch Changes
+
+- add chainId to actions and hooks
+
+## 0.2.0-next.11
+
+### Patch Changes
+
+- fix stale connectors when switching chains
+
+## 0.2.0-next.10
+
+### Patch Changes
+
+- republish
+
+## 0.2.0-next.9
+
+### Patch Changes
+
+- improve type support for ethers providers
+
+## 0.2.0-next.8
+
+### Patch Changes
+
+- update babel target
+
+## 0.2.0-next.7
+
+### Minor Changes
+
+- - Favour `message` event over `connecting` event to conform to EIP-1193
+ - Export `useWaitForTransaction`
+
+## 0.2.0-next.6
+
+### Minor Changes
+
+- add `connecting` event to connectors
+
+## 0.2.0-next.5
+
+### Minor Changes
+
+- don't persist account data when `autoConnect` is falsy
+
+## 0.2.0-next.4
+
+### Minor Changes
+
+- remove storage persistence of `connector`
+- add `chains` to client state
+
+## 0.2.0-next.3
+
+### Minor Changes
+
+- Fix issue where `getProvider` was not being awaited in `getSigner`
+
+## 0.2.0-next.2
+
+### Minor Changes
+
+- fix: persist connector chains to local storage
+
+## 0.2.0-next.1
+
+### Minor Changes
+
+- Initial 0.3.0 release
+
+## 0.1.22
+
+### Patch Changes
+
+- [`747d895`](https://github.com/tmm/wagmi/commit/747d895a54b562958afde34b1d34e81ab5039e2c) Thanks [@tmm](https://github.com/tmm)! - add warning to WalletLinkConnector
+
+## 0.1.21
+
+### Patch Changes
+
+- [`c858c51`](https://github.com/tmm/wagmi/commit/c858c51b44d9039f1d0db5bcf016639f47d1931f) Thanks [@tmm](https://github.com/tmm)! - update coinbase connector
+
+## 0.1.20
+
+### Patch Changes
+
+- [#326](https://github.com/tmm/wagmi/pull/326) [`36e6989`](https://github.com/tmm/wagmi/commit/36e69894f4c27aaad7fb6d678476c8bb870244bb) Thanks [@0xGabi](https://github.com/0xGabi)! - Add Gnosis Chain
+
+## 0.1.19
+
+### Patch Changes
+
+- [`d467df6`](https://github.com/tmm/wagmi/commit/d467df6374210dbc4b016788b4beb4fded54cb4d) Thanks [@tmm](https://github.com/tmm)! - fix global type leaking
+
+## 0.1.18
+
+### Patch Changes
+
+- [#294](https://github.com/tmm/wagmi/pull/294) [`1d253f3`](https://github.com/tmm/wagmi/commit/1d253f3a59b61d24c88d25c99decd84a6c734e5d) Thanks [@tmm](https://github.com/tmm)! - change babel target
+
+## 0.1.17
+
+### Patch Changes
+
+- [#292](https://github.com/tmm/wagmi/pull/292) [`53c9be1`](https://github.com/tmm/wagmi/commit/53c9be17ee0c2ae6b8f34f2351b8858257b3f5f2) Thanks [@tmm](https://github.com/tmm)! - fix private fields
+
+## 0.1.16
+
+### Patch Changes
+
+- [`79a2499`](https://github.com/tmm/wagmi/commit/79a249989029f818c32c0e84c0dd2c75e8aa990a) Thanks [@tmm](https://github.com/tmm)! - update build target to es2021
+
+## 0.1.15
+
+### Patch Changes
+
+- [`f9790b5`](https://github.com/tmm/wagmi/commit/f9790b55600df09c77bb8ca349c5a3457df1b07c) Thanks [@tmm](https://github.com/tmm)! - fix WalletConnect issue
+
+## 0.1.14
+
+### Patch Changes
+
+- [#236](https://github.com/tmm/wagmi/pull/236) [`53bad61`](https://github.com/tmm/wagmi/commit/53bad615788764e31121678083c382c1bd042fe8) Thanks [@markdalgleish](https://github.com/markdalgleish)! - Updated `@walletconnect/ethereum-provider` to [v1.7.4](https://github.com/WalletConnect/walletconnect-monorepo/releases/tag/1.7.4)
+
+## 0.1.13
+
+### Patch Changes
+
+- [`8e9412a`](https://github.com/tmm/wagmi/commit/8e9412af71958301ae2f9748febb936e79900aa0) Thanks [@tmm](https://github.com/tmm)! - bump walletlink
+
+## 0.1.12
+
+### Patch Changes
+
+- [#210](https://github.com/tmm/wagmi/pull/210) [`684468a`](https://github.com/tmm/wagmi/commit/684468aee3e42a1ce2b4b599f3f17d1819213de8) Thanks [@tmm](https://github.com/tmm)! - update chains to match chainslist.org
+
+## 0.1.11
+
+### Patch Changes
+
+- [#195](https://github.com/tmm/wagmi/pull/195) [`25b6083`](https://github.com/tmm/wagmi/commit/25b6083a662a0236794d1765343467691421c14b) Thanks [@tmm](https://github.com/tmm)! - rename wagmi-private to wagmi-core
+
+## 0.1.10
+
+### Patch Changes
+
+- [#192](https://github.com/tmm/wagmi/pull/192) [`428cedb`](https://github.com/tmm/wagmi/commit/428cedb3dec4e3e4b9f4559c8e65932e05f94e05) Thanks [@tmm](https://github.com/tmm)! - rename core and testing packages
+
+## 0.1.9
+
+### Patch Changes
+
+- [#190](https://github.com/tmm/wagmi/pull/190) [`7034bb8`](https://github.com/tmm/wagmi/commit/7034bb868412b9f481b206371280e84c2d52706d) Thanks [@tmm](https://github.com/tmm)! - add shim for metamask chain changed to prevent disconnect
+
+## 0.1.8
+
+### Patch Changes
+
+- [#137](https://github.com/tmm/wagmi/pull/137) [`dceeb43`](https://github.com/tmm/wagmi/commit/dceeb430d9021fbf98366859cb1cd0149e80c55c) Thanks [@tmm](https://github.com/tmm)! - add siwe guide
+
+## 0.1.7
+
+### Patch Changes
+
+- [#127](https://github.com/tmm/wagmi/pull/127) [`f05b031`](https://github.com/tmm/wagmi/commit/f05b0310f7f7e6447e9b6c81cedbb27dcf2f3649) Thanks [@tmm](https://github.com/tmm)! - update switch chain return type
+
+## 0.1.6
+
+### Patch Changes
+
+- [`1412eed`](https://github.com/tmm/wagmi/commit/1412eed0d1494bb4f8c6845a0e890f79e4e68e03) Thanks [@tmm](https://github.com/tmm)! - add frame to injected
+
+## 0.1.5
+
+### Patch Changes
+
+- [`e338c3b`](https://github.com/tmm/wagmi/commit/e338c3b6cc255742be6a67593aa5da6c17e90fbd) Thanks [@tmm](https://github.com/tmm)! - checksum connector address on change events
+
+ add shim to injected connector for simulating disconnect
+
+## 0.1.4
+
+### Patch Changes
+
+- [`0176c4e`](https://github.com/tmm/wagmi/commit/0176c4e83fb0c5f159c3c802a1da3d6deb2184ae) Thanks [@tmm](https://github.com/tmm)! - added switchChain to WalletConnect and WalletLink connectors
+
+## 0.1.3
+
+### Patch Changes
+
+- [`071d7fb`](https://github.com/tmm/wagmi/commit/071d7fbca35ec4832700b5343661ceb2dae20598) Thanks [@tmm](https://github.com/tmm)! - add hardhat chain
+
+## 0.1.2
+
+### Patch Changes
+
+- [`78bade9`](https://github.com/tmm/wagmi/commit/78bade9d0da97ab38a7e6594c34e3841ec1c8fe6) Thanks [@tmm](https://github.com/tmm)! - add type definitions
+
+## 0.1.1
+
+### Patch Changes
+
+- [#56](https://github.com/tmm/wagmi/pull/56) [`2ebfd8e`](https://github.com/tmm/wagmi/commit/2ebfd8e85b560f25cd46cff04619c84643cab297) Thanks [@tmm](https://github.com/tmm)! - add chain support status
+
+## 0.1.0
+
+### Minor Changes
+
+- [#52](https://github.com/tmm/wagmi/pull/52) [`da7a3a6`](https://github.com/tmm/wagmi/commit/da7a3a615def2443f65c041999100ce35e9774cc) Thanks [@tmm](https://github.com/tmm)! - Moves connectors to their own entrypoints to reduce bundle size.
+
+ ```ts
+ // old - WalletLinkConnector unused, but still in final bundle
+ import { InjectedConnector, WalletConnectConnector } from "wagmi";
+
+ // new - WalletLinkConnector not in final bundle
+ import { InjectedConnector } from "wagmi/connectors/injected";
+ import { WalletConnectConnector } from "wagmi/connectors/walletConnect";
+ ```
+
+## 0.0.17
+
+### Patch Changes
+
+- [#25](https://github.com/tmm/wagmi/pull/25) [`9a7dab7`](https://github.com/tmm/wagmi/commit/9a7dab78b3518658bc7d85dc397990f0d28da175) Thanks [@tmm](https://github.com/tmm)! - update response types
+
+## 0.0.16
+
+### Patch Changes
+
+- [`d1574cf`](https://github.com/tmm/wagmi/commit/d1574cf5f7a578ccd480889c2e375134145a4aba) Thanks [@tmm](https://github.com/tmm)! - add better type information for contract results
+
+## 0.0.15
+
+### Patch Changes
+
+- [`3909624`](https://github.com/tmm/wagmi/commit/39096249c1fa9516beabb11735beb67c94032879) Thanks [@tmm](https://github.com/tmm)! - make contract read and write execute overrides param optional
+
+## 0.0.14
+
+### Patch Changes
+
+- [`63312e2`](https://github.com/tmm/wagmi/commit/63312e2b06b8d835abc2908cba399d941ca79408) Thanks [@tmm](https://github.com/tmm)! - add once to contract event
+
+## 0.0.13
+
+### Patch Changes
+
+- [`6f890b0`](https://github.com/tmm/wagmi/commit/6f890b0dabbdbea913ec91cb8bfc970c05ed0a93) Thanks [@tmm](https://github.com/tmm)! - update readme
+
+## 0.0.12
+
+### Patch Changes
+
+- [#19](https://github.com/tmm/wagmi/pull/19) [`7bc1c47`](https://github.com/tmm/wagmi/commit/7bc1c47875e9ef24e9c79cfafc6b23e7a838b5bc) Thanks [@tmm](https://github.com/tmm)! - remove console log from walletlink connector
+
+## 0.0.11
+
+### Patch Changes
+
+- [#17](https://github.com/tmm/wagmi/pull/17) [`571648b`](https://github.com/tmm/wagmi/commit/571648b754f7f538536bafc9387bd3104657ea49) Thanks [@tmm](https://github.com/tmm)! - standardize connector provider
+
+## 0.0.10
+
+### Patch Changes
+
+- [#15](https://github.com/tmm/wagmi/pull/15) [`5f7675c`](https://github.com/tmm/wagmi/commit/5f7675c3ffd848522d4117c07c1f62b17dfc6616) Thanks [@tmm](https://github.com/tmm)! - read and write contract functions
+
+## 0.0.9
+
+### Patch Changes
+
+- [#13](https://github.com/tmm/wagmi/pull/13) [`e5545f5`](https://github.com/tmm/wagmi/commit/e5545f5565cf0bbf5e62ec7ccab3051705b1d313) Thanks [@tmm](https://github.com/tmm)! - add testing package
+
+## 0.0.8
+
+### Patch Changes
+
+- [`5332500`](https://github.com/tmm/wagmi/commit/5332500918ac240d29ffe4d2aed8566a8ac001e4) Thanks [@tmm](https://github.com/tmm)! - update signing
+
+## 0.0.7
+
+### Patch Changes
+
+- [`0bff89a`](https://github.com/tmm/wagmi/commit/0bff89ab2ad28b2cb9b346d1ac870e859d9278bc) Thanks [@tmm](https://github.com/tmm)! - update injected connector
+
+## 0.0.6
+
+### Patch Changes
+
+- [`37d39d1`](https://github.com/tmm/wagmi/commit/37d39d174ddfa122462bbe2d02141cd61eb9db4a) Thanks [@tmm](https://github.com/tmm)! - add message signing
+
+## 0.0.5
+
+### Patch Changes
+
+- [`d7d94f0`](https://github.com/tmm/wagmi/commit/d7d94f06f7d30468e5e39d64db63124c6315cf82) Thanks [@tmm](https://github.com/tmm)! - fix injected connector name
+
+## 0.0.4
+
+### Patch Changes
+
+- [`29fbe29`](https://github.com/tmm/wagmi/commit/29fbe2920046b9e87a34faa04500ccf3c4f83748) Thanks [@tmm](https://github.com/tmm)! - fix external deps
+
+## 0.0.3
+
+### Patch Changes
+
+- [#6](https://github.com/tmm/wagmi/pull/6) [`8dc3a5d`](https://github.com/tmm/wagmi/commit/8dc3a5d5f418813b09663534fe585d9bcf94dbeb) Thanks [@tmm](https://github.com/tmm)! - clean up deps
+
+## 0.0.2
+
+### Patch Changes
+
+- [#4](https://github.com/tmm/wagmi/pull/4) [`2fbd821`](https://github.com/tmm/wagmi/commit/2fbd8216379bd03c9cc5c06b10b75637e75cb7d8) Thanks [@tmm](https://github.com/tmm)! - init changesets
diff --git a/wagmi-project/packages/core/README.md b/wagmi-project/packages/core/README.md
new file mode 100644
index 000000000..b46e39c55
--- /dev/null
+++ b/wagmi-project/packages/core/README.md
@@ -0,0 +1,13 @@
+# @wagmi/core
+
+VanillaJS library for Ethereum
+
+## Installation
+
+```bash
+pnpm add @wagmi/core viem
+```
+
+## Documentation
+
+For documentation and guides, visit [wagmi.sh](https://wagmi.sh).
diff --git a/wagmi-project/packages/core/package.json b/wagmi-project/packages/core/package.json
new file mode 100644
index 000000000..00589ee83
--- /dev/null
+++ b/wagmi-project/packages/core/package.json
@@ -0,0 +1,100 @@
+{
+ "name": "@wagmi/core",
+ "description": "VanillaJS library for Ethereum",
+ "version": "2.17.2",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/wevm/wagmi.git",
+ "directory": "packages/core"
+ },
+ "scripts": {
+ "build": "pnpm run clean && pnpm run build:esm+types",
+ "build:esm+types": "tsc --project tsconfig.build.json --outDir ./dist/esm --declaration --declarationMap --declarationDir ./dist/types",
+ "check:types": "tsc --noEmit",
+ "clean": "rm -rf dist tsconfig.tsbuildinfo actions chains codegen experimental internal query",
+ "test:build": "publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm"
+ },
+ "files": [
+ "dist/**",
+ "!dist/**/*.tsbuildinfo",
+ "src/**/*.ts",
+ "!src/**/*.test.ts",
+ "!src/**/*.test-d.ts",
+ "/actions",
+ "/chains",
+ "/experimental",
+ "/internal",
+ "/query"
+ ],
+ "sideEffects": false,
+ "type": "module",
+ "main": "./dist/esm/exports/index.js",
+ "types": "./dist/types/exports/index.d.ts",
+ "typings": "./dist/types/exports/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/types/exports/index.d.ts",
+ "default": "./dist/esm/exports/index.js"
+ },
+ "./actions": {
+ "types": "./dist/types/exports/actions.d.ts",
+ "default": "./dist/esm/exports/actions.js"
+ },
+ "./chains": {
+ "types": "./dist/types/exports/chains.d.ts",
+ "default": "./dist/esm/exports/chains.js"
+ },
+ "./codegen": {
+ "types": "./dist/types/exports/codegen.d.ts",
+ "default": "./dist/esm/exports/codegen.js"
+ },
+ "./experimental": {
+ "types": "./dist/types/exports/experimental.d.ts",
+ "default": "./dist/esm/exports/experimental.js"
+ },
+ "./internal": {
+ "types": "./dist/types/exports/internal.d.ts",
+ "default": "./dist/esm/exports/internal.js"
+ },
+ "./query": {
+ "types": "./dist/types/exports/query.d.ts",
+ "default": "./dist/esm/exports/query.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "typesVersions": {
+ "*": {
+ "actions": ["./dist/types/exports/actions.d.ts"],
+ "chains": ["./dist/types/exports/chains.d.ts"],
+ "codegen": ["./dist/types/exports/codegen.d.ts"],
+ "experimental": ["./dist/types/exports/experimental.d.ts"],
+ "internal": ["./dist/types/exports/internal.d.ts"],
+ "query": ["./dist/types/exports/query.d.ts"]
+ }
+ },
+ "peerDependencies": {
+ "@tanstack/query-core": ">=5.0.0",
+ "typescript": ">=5.0.4",
+ "viem": "2.x"
+ },
+ "peerDependenciesMeta": {
+ "@tanstack/query-core": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ },
+ "dependencies": {
+ "eventemitter3": "5.0.1",
+ "mipd": "0.0.7",
+ "zustand": "5.0.0"
+ },
+ "devDependencies": {
+ "@tanstack/query-core": "catalog:"
+ },
+ "contributors": ["awkweb.eth ", "jxom.eth "],
+ "funding": "https://github.com/sponsors/wevm",
+ "keywords": ["wagmi", "eth", "ethereum", "dapps", "wallet", "web3"]
+}
diff --git a/wagmi-project/packages/core/src/actions/call.test.ts b/wagmi-project/packages/core/src/actions/call.test.ts
new file mode 100644
index 000000000..2ef01160d
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/call.test.ts
@@ -0,0 +1,149 @@
+import { accounts, address, config } from '@wagmi/test'
+import { parseEther, parseGwei } from 'viem'
+import { expect, test } from 'vitest'
+
+import { call } from './call.js'
+
+const name4bytes = '0x06fdde03'
+const mint4bytes = '0x1249c58b'
+const mintWithParams4bytes = '0xa0712d68'
+const fourTwenty =
+ '00000000000000000000000000000000000000000000000000000000000001a4'
+
+const account = accounts[0]
+
+test('default', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: name4bytes,
+ to: address.wagmiMintExample,
+ }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000",
+ }
+ `)
+})
+
+test('zero data', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: mint4bytes,
+ to: address.wagmiMintExample,
+ }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "data": undefined,
+ }
+ `)
+})
+
+// TODO: Re-enable
+test.skip('parameters: blockNumber', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: name4bytes,
+ to: address.wagmiMintExample,
+ blockNumber: 16280770n,
+ }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "data": "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000057761676d69000000000000000000000000000000000000000000000000000000",
+ }
+ `)
+})
+
+test('insufficient funds', async () => {
+ await expect(
+ call(config, {
+ account,
+ to: accounts[1],
+ value: parseEther('100000'),
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [CallExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.
+
+ This error could arise when the account does not have enough funds to:
+ - pay for the total gas fee,
+ - pay for the value to send.
+
+ The cost of the transaction is calculated as \`gas * gas fee + value\`, where:
+ - \`gas\` is the amount of gas needed for transaction to execute,
+ - \`gas fee\` is the gas fee,
+ - \`value\` is the amount of ether to send to the recipient.
+
+ Raw Call Arguments:
+ from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8
+ value: 100000 ETH
+
+ Details: Insufficient funds for gas * price + value
+ Version: viem@2.29.2]
+ `)
+})
+
+test('maxFeePerGas less than maxPriorityFeePerGas', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: name4bytes,
+ to: address.wagmiMintExample,
+ maxFeePerGas: parseGwei('20'),
+ maxPriorityFeePerGas: parseGwei('22'),
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [CallExecutionError: The provided tip (\`maxPriorityFeePerGas\` = 22 gwei) cannot be higher than the fee cap (\`maxFeePerGas\` = 20 gwei).
+
+ Raw Call Arguments:
+ from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2
+ data: 0x06fdde03
+ maxFeePerGas: 20 gwei
+ maxPriorityFeePerGas: 22 gwei
+
+ Version: viem@2.29.2]
+ `)
+})
+
+test('contract revert (contract error)', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: `${mintWithParams4bytes}${fourTwenty}`,
+ to: address.wagmiMintExample,
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [CallExecutionError: Execution reverted with reason: Token ID is taken.
+
+ Raw Call Arguments:
+ from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2
+ data: 0xa0712d6800000000000000000000000000000000000000000000000000000000000001a4
+
+ Details: execution reverted: Token ID is taken
+ Version: viem@2.29.2]
+ `)
+})
+
+test('contract revert (insufficient params)', async () => {
+ await expect(
+ call(config, {
+ account,
+ data: mintWithParams4bytes,
+ to: address.wagmiMintExample,
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [CallExecutionError: Execution reverted for an unknown reason.
+
+ Raw Call Arguments:
+ from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2
+ data: 0xa0712d68
+
+ Details: execution reverted
+ Version: viem@2.29.2]
+ `)
+})
diff --git a/wagmi-project/packages/core/src/actions/call.ts b/wagmi-project/packages/core/src/actions/call.ts
new file mode 100644
index 000000000..90e6c1ae2
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/call.ts
@@ -0,0 +1,27 @@
+import type {
+ CallErrorType as viem_CallErrorType,
+ CallParameters as viem_CallParameters,
+ CallReturnType as viem_CallReturnType,
+} from 'viem'
+import { call as viem_call } from 'viem/actions'
+
+import type { Config } from '../createConfig.js'
+import type { ChainIdParameter } from '../types/properties.js'
+import { getAction } from '../utils/getAction.js'
+
+export type CallParameters =
+ viem_CallParameters & ChainIdParameter
+
+export type CallReturnType = viem_CallReturnType
+
+export type CallErrorType = viem_CallErrorType
+
+export async function call(
+ config: config,
+ parameters: CallParameters,
+): Promise {
+ const { chainId, ...rest } = parameters
+ const client = config.getClient({ chainId })
+ const action = getAction(client, viem_call, 'call')
+ return action(rest)
+}
diff --git a/wagmi-project/packages/core/src/actions/codegen/createReadContract.test-d.ts b/wagmi-project/packages/core/src/actions/codegen/createReadContract.test-d.ts
new file mode 100644
index 000000000..f5c9dd302
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createReadContract.test-d.ts
@@ -0,0 +1,130 @@
+import { abi, config, mainnet, optimism } from '@wagmi/test'
+import { assertType, expectTypeOf, test } from 'vitest'
+
+import { createReadContract } from './createReadContract.js'
+
+test('default', async () => {
+ const readErc20 = createReadContract({
+ abi: abi.erc20,
+ address: '0x',
+ })
+
+ const result = await readErc20(config, {
+ functionName: 'balanceOf',
+ args: ['0x'],
+ chainId: 1,
+ })
+ expectTypeOf(result).toEqualTypeOf()
+})
+
+test('multichain address', async () => {
+ const readErc20 = createReadContract({
+ abi: abi.erc20,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ const result = await readErc20(config, {
+ functionName: 'balanceOf',
+ args: ['0x'],
+ chainId: mainnet.id,
+ // ^?
+ })
+ assertType(result)
+
+ readErc20(config, {
+ functionName: 'balanceOf',
+ args: ['0x'],
+ // @ts-expect-error chain id must match address keys
+ chainId: 420,
+ })
+
+ readErc20(config, {
+ functionName: 'balanceOf',
+ args: ['0x'],
+ // @ts-expect-error address not allowed
+ address: '0x',
+ })
+})
+
+test('overloads', async () => {
+ const readViewOverloads = createReadContract({
+ abi: abi.viewOverloads,
+ address: '0x',
+ })
+
+ const result1 = await readViewOverloads(config, {
+ functionName: 'foo',
+ })
+ assertType(result1)
+
+ const result2 = await readViewOverloads(config, {
+ functionName: 'foo',
+ args: [],
+ })
+ assertType(result2)
+
+ const result3 = await readViewOverloads(config, {
+ functionName: 'foo',
+ args: ['0x'],
+ })
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ assertType(result3)
+
+ const result4 = await readViewOverloads(config, {
+ functionName: 'foo',
+ args: ['0x', '0x'],
+ })
+ assertType<{
+ foo: `0x${string}`
+ bar: `0x${string}`
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ }>(result4)
+})
+
+test('functionName', async () => {
+ const readErc20BalanceOf = createReadContract({
+ abi: abi.erc20,
+ address: '0x',
+ functionName: 'balanceOf',
+ })
+
+ const result = await readErc20BalanceOf(config, {
+ args: ['0x'],
+ chainId: 1,
+ })
+ expectTypeOf(result).toEqualTypeOf()
+})
+
+test('functionName with overloads', async () => {
+ const readViewOverloads = createReadContract({
+ abi: abi.viewOverloads,
+ address: '0x',
+ functionName: 'foo',
+ })
+
+ const result1 = await readViewOverloads(config, {})
+ assertType(result1)
+
+ const result2 = await readViewOverloads(config, {
+ args: [],
+ })
+ assertType(result2)
+
+ const result3 = await readViewOverloads(config, {
+ args: ['0x'],
+ })
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ assertType(result3)
+
+ const result4 = await readViewOverloads(config, {
+ args: ['0x', '0x'],
+ })
+ assertType<{
+ foo: `0x${string}`
+ bar: `0x${string}`
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ }>(result4)
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createReadContract.test.ts b/wagmi-project/packages/core/src/actions/codegen/createReadContract.test.ts
new file mode 100644
index 000000000..9de7ae718
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createReadContract.test.ts
@@ -0,0 +1,50 @@
+import { abi, address, chain, config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { createReadContract } from './createReadContract.js'
+
+test('default', async () => {
+ const readWagmiMintExample = createReadContract({
+ address: address.wagmiMintExample,
+ abi: abi.wagmiMintExample,
+ })
+
+ await expect(
+ readWagmiMintExample(config, {
+ functionName: 'balanceOf',
+ args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],
+ }),
+ ).resolves.toMatchInlineSnapshot('4n')
+})
+
+test('multichain', async () => {
+ const readWagmiMintExample = createReadContract({
+ address: {
+ [chain.mainnet.id]: address.wagmiMintExample,
+ [chain.mainnet2.id]: address.wagmiMintExample,
+ },
+ abi: abi.wagmiMintExample,
+ })
+
+ await expect(
+ readWagmiMintExample(config, {
+ functionName: 'balanceOf',
+ args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],
+ chainId: chain.mainnet2.id,
+ }),
+ ).resolves.toMatchInlineSnapshot('4n')
+})
+
+test('functionName', async () => {
+ const readWagmiMintExampleBalanceOf = createReadContract({
+ address: address.wagmiMintExample,
+ abi: abi.wagmiMintExample,
+ functionName: 'balanceOf',
+ })
+
+ await expect(
+ readWagmiMintExampleBalanceOf(config, {
+ args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'],
+ }),
+ ).resolves.toMatchInlineSnapshot('4n')
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createReadContract.ts b/wagmi-project/packages/core/src/actions/codegen/createReadContract.ts
new file mode 100644
index 000000000..f7dbfbed4
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createReadContract.ts
@@ -0,0 +1,100 @@
+import type {
+ Abi,
+ Address,
+ ContractFunctionArgs,
+ ContractFunctionName,
+} from 'viem'
+
+import type { Config } from '../../createConfig.js'
+import type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'
+import { getAccount } from '../getAccount.js'
+import { getChainId } from '../getChainId.js'
+import {
+ type ReadContractParameters,
+ type ReadContractReturnType,
+ readContract,
+} from '../readContract.js'
+
+type stateMutability = 'pure' | 'view'
+
+export type CreateReadContractParameters<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+> = {
+ abi: abi | Abi | readonly unknown[]
+ address?: address | Address | Record | undefined
+ functionName?:
+ | functionName
+ | ContractFunctionName
+ | undefined
+}
+
+export type CreateReadContractReturnType<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined,
+ functionName extends ContractFunctionName | undefined,
+ ///
+ omittedProperties extends 'abi' | 'address' | 'chainId' | 'functionName' =
+ | 'abi'
+ | (address extends undefined ? never : 'address')
+ | (address extends Record ? 'chainId' : never)
+ | (functionName extends undefined ? never : 'functionName'),
+> = <
+ config extends Config,
+ name extends functionName extends ContractFunctionName
+ ? functionName
+ : ContractFunctionName,
+ args extends ContractFunctionArgs,
+>(
+ config: config,
+ parameters: UnionCompute<
+ UnionStrictOmit<
+ ReadContractParameters,
+ omittedProperties
+ >
+ > &
+ (address extends Record
+ ? { chainId?: keyof address | undefined }
+ : unknown),
+) => Promise>
+
+export function createReadContract<
+ const abi extends Abi | readonly unknown[],
+ const address extends
+ | Address
+ | Record
+ | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+>(
+ c: CreateReadContractParameters,
+): CreateReadContractReturnType {
+ if (c.address !== undefined && typeof c.address === 'object')
+ return (config, parameters) => {
+ const configChainId = getChainId(config)
+ const account = getAccount(config)
+ const chainId =
+ (parameters as { chainId?: number })?.chainId ??
+ account.chainId ??
+ configChainId
+ return readContract(config, {
+ ...(parameters as any),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ address: c.address?.[chainId],
+ abi: c.abi,
+ })
+ }
+
+ return (config, parameters) => {
+ return readContract(config, {
+ ...(parameters as any),
+ ...(c.address ? { address: c.address } : {}),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ abi: c.abi,
+ })
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test-d.ts b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test-d.ts
new file mode 100644
index 000000000..91e599897
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test-d.ts
@@ -0,0 +1,211 @@
+import { abi, config, mainnet, optimism } from '@wagmi/test'
+import { http, type Address } from 'viem'
+import { celo } from 'viem/chains'
+import { assertType, expectTypeOf, test } from 'vitest'
+
+import { createConfig } from '../../createConfig.js'
+import { createSimulateContract } from './createSimulateContract.js'
+
+test('default', async () => {
+ const simulateErc20 = createSimulateContract({
+ abi: abi.erc20,
+ address: '0x',
+ })
+
+ const result = await simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ chainId: 1,
+ })
+
+ expectTypeOf(result).toMatchTypeOf<{
+ result: boolean
+ request: {
+ chainId: 1
+ abi: readonly [
+ {
+ readonly name: 'transferFrom'
+ readonly type: 'function'
+ readonly stateMutability: 'nonpayable'
+ readonly inputs: readonly [
+ { readonly type: 'address'; readonly name: 'sender' },
+ { readonly type: 'address'; readonly name: 'recipient' },
+ { readonly type: 'uint256'; readonly name: 'amount' },
+ ]
+ readonly outputs: readonly [{ type: 'bool' }]
+ },
+ ]
+ functionName: 'transferFrom'
+ args: readonly [Address, Address, bigint]
+ }
+ }>()
+})
+
+test('multichain address', async () => {
+ const simulateErc20 = createSimulateContract({
+ abi: abi.erc20,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ const result = await simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ chainId: optimism.id,
+ })
+ expectTypeOf(result.result).toEqualTypeOf()
+
+ simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ // @ts-expect-error chain id must match address keys
+ chainId: 420,
+ })
+
+ simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ // @ts-expect-error address not allowed
+ address: '0x',
+ })
+})
+
+test('overloads', async () => {
+ const simulateWriteOverloads = createSimulateContract({
+ abi: abi.writeOverloads,
+ address: '0x',
+ })
+
+ const result1 = await simulateWriteOverloads(config, {
+ functionName: 'foo',
+ })
+ assertType(result1.result)
+
+ const result2 = await simulateWriteOverloads(config, {
+ functionName: 'foo',
+ args: [],
+ })
+ assertType(result2.result)
+
+ const result3 = await simulateWriteOverloads(config, {
+ functionName: 'foo',
+ args: ['0x'],
+ })
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ assertType(result3.result)
+
+ const result4 = await simulateWriteOverloads(config, {
+ functionName: 'foo',
+ args: ['0x', '0x'],
+ })
+ assertType<
+ | {
+ foo: `0x${string}`
+ bar: `0x${string}`
+ }
+ | undefined
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ >(result4.result)
+})
+
+test('functionName', async () => {
+ const simulateErc20 = createSimulateContract({
+ abi: abi.erc20,
+ address: '0x',
+ functionName: 'transferFrom',
+ })
+
+ const result = await simulateErc20(config, {
+ args: ['0x', '0x', 123n],
+ chainId: 1,
+ })
+
+ expectTypeOf(result).toMatchTypeOf<{
+ result: boolean
+ request: {
+ chainId: 1
+ abi: readonly [
+ {
+ readonly name: 'transferFrom'
+ readonly type: 'function'
+ readonly stateMutability: 'nonpayable'
+ readonly inputs: readonly [
+ { readonly type: 'address'; readonly name: 'sender' },
+ { readonly type: 'address'; readonly name: 'recipient' },
+ { readonly type: 'uint256'; readonly name: 'amount' },
+ ]
+ readonly outputs: readonly [{ type: 'bool' }]
+ },
+ ]
+ functionName: 'transferFrom'
+ args: readonly [Address, Address, bigint]
+ }
+ }>()
+})
+
+test('functionName with overloads', async () => {
+ const simulateWriteOverloads = createSimulateContract({
+ abi: abi.writeOverloads,
+ address: '0x',
+ functionName: 'foo',
+ })
+
+ const result1 = await simulateWriteOverloads(config, {})
+ assertType(result1.result)
+
+ const result2 = await simulateWriteOverloads(config, {
+ args: [],
+ })
+ assertType(result2.result)
+
+ const result3 = await simulateWriteOverloads(config, {
+ args: ['0x'],
+ })
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ assertType(result3.result)
+
+ const result4 = await simulateWriteOverloads(config, {
+ args: ['0x', '0x'],
+ })
+ assertType<
+ | {
+ foo: `0x${string}`
+ bar: `0x${string}`
+ }
+ | undefined
+ // @ts-ignore ā TODO: Fix https://github.com/wevm/viem/issues/1916
+ >(result4.result)
+})
+
+test('chain formatters', async () => {
+ const simulateErc20 = createSimulateContract({
+ abi: abi.erc20,
+ address: '0x',
+ })
+
+ const config = createConfig({
+ chains: [celo, mainnet],
+ transports: { [celo.id]: http(), [mainnet.id]: http() },
+ })
+
+ const response = await simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ })
+ if (response.chainId === celo.id) {
+ expectTypeOf(response.request.feeCurrency).toEqualTypeOf<
+ `0x${string}` | undefined
+ >()
+ }
+
+ const response2 = await simulateErc20(config, {
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ chainId: celo.id,
+ })
+ expectTypeOf(response2.request.feeCurrency).toEqualTypeOf<
+ `0x${string}` | undefined
+ >()
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test.ts b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test.ts
new file mode 100644
index 000000000..bd37d1377
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.test.ts
@@ -0,0 +1,137 @@
+import { abi, address, chain, config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { connect } from '../connect.js'
+import { disconnect } from '../disconnect.js'
+import { createSimulateContract } from './createSimulateContract.js'
+
+const connector = config.connectors[0]!
+
+test('default', async () => {
+ await connect(config, { connector })
+
+ const simulateWagmiMintExample = createSimulateContract({
+ address: address.wagmiMintExample,
+ abi: abi.wagmiMintExample,
+ })
+
+ await expect(
+ simulateWagmiMintExample(config, {
+ functionName: 'mint',
+ }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "chainId": 1,
+ "request": {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "account": {
+ "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "type": "json-rpc",
+ },
+ "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
+ "args": undefined,
+ "chainId": undefined,
+ "dataSuffix": undefined,
+ "functionName": "mint",
+ },
+ "result": undefined,
+ }
+ `)
+
+ await disconnect(config, { connector })
+})
+
+test('multichain', async () => {
+ await connect(config, { connector })
+
+ const simulateWagmiMintExample = createSimulateContract({
+ address: {
+ [chain.mainnet.id]: address.wagmiMintExample,
+ [chain.mainnet2.id]: address.wagmiMintExample,
+ },
+ abi: abi.wagmiMintExample,
+ })
+
+ await expect(
+ simulateWagmiMintExample(config, {
+ functionName: 'mint',
+ chainId: chain.mainnet2.id,
+ }),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "chainId": 456,
+ "request": {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "account": {
+ "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "type": "json-rpc",
+ },
+ "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
+ "args": undefined,
+ "chainId": 456,
+ "dataSuffix": undefined,
+ "functionName": "mint",
+ },
+ "result": undefined,
+ }
+ `)
+
+ await disconnect(config, { connector })
+})
+
+test('functionName', async () => {
+ await connect(config, { connector })
+
+ const simulateWagmiMintExample = createSimulateContract({
+ address: address.wagmiMintExample,
+ abi: abi.wagmiMintExample,
+ functionName: 'mint',
+ })
+
+ await expect(
+ simulateWagmiMintExample(config, {}),
+ ).resolves.toMatchInlineSnapshot(`
+ {
+ "chainId": 1,
+ "request": {
+ "abi": [
+ {
+ "inputs": [],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function",
+ },
+ ],
+ "account": {
+ "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
+ "type": "json-rpc",
+ },
+ "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2",
+ "args": undefined,
+ "chainId": undefined,
+ "dataSuffix": undefined,
+ "functionName": "mint",
+ },
+ "result": undefined,
+ }
+ `)
+
+ await disconnect(config, { connector })
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.ts b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.ts
new file mode 100644
index 000000000..016384e24
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createSimulateContract.ts
@@ -0,0 +1,122 @@
+import type {
+ Abi,
+ Account,
+ Address,
+ Chain,
+ ContractFunctionArgs,
+ ContractFunctionName,
+ SimulateContractParameters as viem_SimulateContractParameters,
+} from 'viem'
+
+import type { Config } from '../../createConfig.js'
+import type { SelectChains } from '../../types/chain.js'
+import type {
+ ChainIdParameter,
+ ConnectorParameter,
+} from '../../types/properties.js'
+import type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'
+import { getAccount } from '../getAccount.js'
+import { getChainId } from '../getChainId.js'
+import {
+ type SimulateContractReturnType,
+ simulateContract,
+} from '../simulateContract.js'
+
+type stateMutability = 'nonpayable' | 'payable'
+
+export type CreateSimulateContractParameters<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+> = {
+ abi: abi | Abi | readonly unknown[]
+ address?: address | Address | Record | undefined
+ functionName?:
+ | functionName
+ | ContractFunctionName
+ | undefined
+}
+
+export type CreateSimulateContractReturnType<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined,
+ functionName extends ContractFunctionName | undefined,
+> = <
+ config extends Config,
+ name extends functionName extends ContractFunctionName
+ ? functionName
+ : ContractFunctionName,
+ args extends ContractFunctionArgs,
+ chainId extends config['chains'][number]['id'] | undefined = undefined,
+ ///
+ chains extends readonly Chain[] = SelectChains,
+>(
+ config: config,
+ parameters: {
+ [key in keyof chains]: UnionCompute<
+ UnionStrictOmit<
+ viem_SimulateContractParameters<
+ abi,
+ name,
+ args,
+ chains[key],
+ chains[key],
+ Account | Address
+ >,
+ | 'abi'
+ | 'chain'
+ | (address extends undefined ? never : 'address')
+ | (functionName extends undefined ? never : 'functionName')
+ >
+ > &
+ ChainIdParameter &
+ ConnectorParameter & {
+ chainId?: address extends Record
+ ?
+ | keyof address
+ | (chainId extends keyof address ? chainId : never)
+ | undefined
+ : chainId | number | undefined
+ }
+ }[number],
+) => Promise>
+
+export function createSimulateContract<
+ const abi extends Abi | readonly unknown[],
+ const address extends
+ | Address
+ | Record
+ | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+>(
+ c: CreateSimulateContractParameters,
+): CreateSimulateContractReturnType {
+ if (c.address !== undefined && typeof c.address === 'object')
+ return (config, parameters) => {
+ const configChainId = getChainId(config)
+ const account = getAccount(config)
+ const chainId =
+ (parameters as { chainId?: number })?.chainId ??
+ account.chainId ??
+ configChainId
+ return simulateContract(config, {
+ ...(parameters as any),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ address: c.address?.[chainId],
+ abi: c.abi,
+ })
+ }
+
+ return (config, parameters) => {
+ return simulateContract(config, {
+ ...(parameters as any),
+ ...(c.address ? { address: c.address } : {}),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ abi: c.abi,
+ })
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test-d.ts b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test-d.ts
new file mode 100644
index 000000000..6c0485f39
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test-d.ts
@@ -0,0 +1,123 @@
+import { abi, config, mainnet, optimism } from '@wagmi/test'
+import { http, webSocket } from 'viem'
+import { expectTypeOf, test } from 'vitest'
+
+import { createConfig } from '../../createConfig.js'
+import { createWatchContractEvent } from './createWatchContractEvent.js'
+
+test('default', () => {
+ const watchErc20Event = createWatchContractEvent({
+ abi: abi.erc20,
+ })
+
+ watchErc20Event(config, {
+ eventName: 'Transfer',
+ chainId: 1,
+ onLogs(logs) {
+ expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()
+ expectTypeOf(logs[0]!.args).toEqualTypeOf<{
+ from?: `0x${string}` | undefined
+ to?: `0x${string}` | undefined
+ value?: bigint | undefined
+ }>()
+ },
+ })
+})
+
+test('multichain address', () => {
+ const watchErc20Event = createWatchContractEvent({
+ abi: abi.erc20,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ watchErc20Event(config, {
+ eventName: 'Transfer',
+ chainId: mainnet.id,
+ // ^?
+ onLogs() {},
+ })
+
+ watchErc20Event(config, {
+ eventName: 'Transfer',
+ // @ts-expect-error chain id must match address keys
+ chainId: 420,
+ onLogs() {},
+ })
+
+ watchErc20Event(config, {
+ eventName: 'Transfer',
+ // @ts-expect-error chain id must match address keys
+ address: '0x',
+ onLogs() {},
+ })
+})
+
+test('differing transports', () => {
+ const watchErc20Event = createWatchContractEvent({
+ abi: abi.erc20,
+ })
+
+ const config = createConfig({
+ chains: [mainnet, optimism],
+ transports: {
+ [mainnet.id]: http(),
+ [optimism.id]: webSocket(),
+ },
+ })
+
+ watchErc20Event(config, {
+ poll: false,
+ address: '0x',
+ onLogs() {},
+ })
+
+ watchErc20Event(config, {
+ chainId: mainnet.id,
+ poll: true,
+ address: '0x',
+ onLogs() {},
+ })
+ watchErc20Event(config, {
+ config,
+ chainId: mainnet.id,
+ // @ts-expect-error poll required since http transport
+ poll: false,
+ address: '0x',
+ onLogs() {},
+ })
+
+ watchErc20Event(config, {
+ chainId: optimism.id,
+ poll: true,
+ address: '0x',
+ onLogs() {},
+ })
+ watchErc20Event(config, {
+ chainId: optimism.id,
+ poll: false,
+ address: '0x',
+ onLogs() {},
+ })
+})
+
+test('eventName', () => {
+ const watchErc20Event = createWatchContractEvent({
+ abi: abi.erc20,
+ eventName: 'Transfer',
+ })
+
+ watchErc20Event(config, {
+ chainId: 1,
+ onLogs(logs) {
+ expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer'>()
+ expectTypeOf(logs[0]!.args).toEqualTypeOf<{
+ from?: `0x${string}` | undefined
+ to?: `0x${string}` | undefined
+ value?: bigint | undefined
+ }>()
+ },
+ })
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test.ts b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test.ts
new file mode 100644
index 000000000..19ba09b2a
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.test.ts
@@ -0,0 +1,41 @@
+import { abi, address, chain, config } from '@wagmi/test'
+import type { WatchEventOnLogsParameter } from 'viem'
+import { test } from 'vitest'
+
+import { createWatchContractEvent } from './createWatchContractEvent.js'
+
+test('default', async () => {
+ const watchErc20Event = createWatchContractEvent({
+ address: address.usdc,
+ abi: abi.wagmiMintExample,
+ })
+
+ let logs: WatchEventOnLogsParameter = []
+ const unwatch = watchErc20Event(config, {
+ eventName: 'Transfer',
+ onLogs(next) {
+ logs = logs.concat(next)
+ },
+ })
+ unwatch()
+})
+
+test('multichain', async () => {
+ const watchErc20Event = createWatchContractEvent({
+ address: {
+ [chain.mainnet.id]: address.usdc,
+ [chain.mainnet2.id]: address.usdc,
+ },
+ abi: abi.wagmiMintExample,
+ })
+
+ let logs: WatchEventOnLogsParameter = []
+ const unwatch = watchErc20Event(config, {
+ eventName: 'Transfer',
+ chainId: chain.mainnet2.id,
+ onLogs(next) {
+ logs = logs.concat(next)
+ },
+ })
+ unwatch()
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.ts b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.ts
new file mode 100644
index 000000000..2817efc70
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWatchContractEvent.ts
@@ -0,0 +1,88 @@
+import type { Abi, Address, ContractEventName } from 'viem'
+
+import type { Config } from '../../createConfig.js'
+import type { UnionCompute, UnionStrictOmit } from '../../types/utils.js'
+import { getAccount } from '../getAccount.js'
+import { getChainId } from '../getChainId.js'
+import {
+ type WatchContractEventParameters,
+ type WatchContractEventReturnType,
+ watchContractEvent,
+} from '../watchContractEvent.js'
+
+export type CreateWatchContractEventParameters<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined = undefined,
+ eventName extends ContractEventName | undefined = undefined,
+> = {
+ abi: abi | Abi | readonly unknown[]
+ address?: address | Address | Record | undefined
+ eventName?: eventName | ContractEventName | undefined
+}
+
+export type CreateWatchContractEventReturnType<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined,
+ eventName extends ContractEventName | undefined,
+ ///
+ omittedProperties extends 'abi' | 'address' | 'chainId' | 'eventName' =
+ | 'abi'
+ | (address extends undefined ? never : 'address')
+ | (address extends Record ? 'chainId' : never)
+ | (eventName extends undefined ? never : 'eventName'),
+> = <
+ config extends Config,
+ name extends eventName extends ContractEventName
+ ? eventName
+ : ContractEventName,
+ strict extends boolean | undefined = undefined,
+ chainId extends
+ config['chains'][number]['id'] = config['chains'][number]['id'],
+>(
+ config: config,
+ parameters: UnionCompute<
+ UnionStrictOmit<
+ WatchContractEventParameters,
+ omittedProperties
+ >
+ > &
+ (address extends Record
+ ? { chainId?: keyof address | undefined }
+ : unknown),
+) => WatchContractEventReturnType
+
+export function createWatchContractEvent<
+ const abi extends Abi | readonly unknown[],
+ const address extends
+ | Address
+ | Record
+ | undefined = undefined,
+ eventName extends ContractEventName | undefined = undefined,
+>(
+ c: CreateWatchContractEventParameters,
+): CreateWatchContractEventReturnType {
+ if (c.address !== undefined && typeof c.address === 'object')
+ return (config, parameters) => {
+ const configChainId = getChainId(config)
+ const account = getAccount(config)
+ const chainId =
+ (parameters as { chainId?: number })?.chainId ??
+ account.chainId ??
+ configChainId
+ return watchContractEvent(config, {
+ ...(parameters as any),
+ ...(c.eventName ? { eventName: c.eventName } : {}),
+ address: c.address?.[chainId],
+ abi: c.abi,
+ })
+ }
+
+ return (config, parameters) => {
+ return watchContractEvent(config, {
+ ...(parameters as any),
+ ...(c.address ? { address: c.address } : {}),
+ ...(c.eventName ? { eventName: c.eventName } : {}),
+ abi: c.abi,
+ })
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test-d.ts b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test-d.ts
new file mode 100644
index 000000000..9c69ede5b
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test-d.ts
@@ -0,0 +1,129 @@
+import { abi, config, mainnet, optimism } from '@wagmi/test'
+import { test } from 'vitest'
+
+import { simulateContract } from '../simulateContract.js'
+import { createWriteContract } from './createWriteContract.js'
+
+test('default', () => {
+ const writeErc20 = createWriteContract({
+ abi: abi.erc20,
+ address: '0x',
+ })
+
+ writeErc20(config, {
+ functionName: 'transfer',
+ args: ['0x', 123n],
+ })
+})
+
+test('multichain address', () => {
+ const writeErc20 = createWriteContract({
+ abi: abi.erc20,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ writeErc20(config, {
+ functionName: 'transfer',
+ args: ['0x', 123n],
+ chainId: mainnet.id,
+ // ^?
+ })
+
+ writeErc20(config, {
+ functionName: 'transfer',
+ args: ['0x', 123n],
+ // @ts-expect-error chain id must match address keys
+ chainId: 420,
+ })
+
+ writeErc20(config, {
+ // @ts-expect-error address not allowed
+ address: '0x',
+ functionName: 'transfer',
+ args: ['0x', 123n],
+ })
+})
+
+test('overloads', () => {
+ const writeOverloads = createWriteContract({
+ abi: abi.writeOverloads,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ writeOverloads(config, {
+ functionName: 'foo',
+ args: [],
+ })
+
+ writeOverloads(config, {
+ functionName: 'foo',
+ args: ['0x'],
+ })
+
+ writeOverloads(config, {
+ functionName: 'foo',
+ args: ['0x', '0x'],
+ })
+})
+
+test('useSimulateContract', async () => {
+ const writeErc20 = createWriteContract({
+ abi: abi.erc20,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ })
+
+ const { request } = await simulateContract(config, {
+ account: '0x',
+ address: '0x',
+ abi: abi.erc20,
+ functionName: 'transferFrom',
+ args: ['0x', '0x', 123n],
+ chainId: 1,
+ })
+
+ writeErc20(config, request)
+})
+
+test('functionName', () => {
+ const writeErc20 = createWriteContract({
+ abi: abi.erc20,
+ address: '0x',
+ functionName: 'transfer',
+ })
+
+ writeErc20(config, {
+ args: ['0x', 123n],
+ })
+})
+
+test('functionName with overloads', () => {
+ const writeOverloads = createWriteContract({
+ abi: abi.writeOverloads,
+ address: {
+ [mainnet.id]: '0x',
+ [optimism.id]: '0x',
+ },
+ functionName: 'foo',
+ })
+
+ writeOverloads(config, {
+ args: [],
+ })
+
+ writeOverloads(config, {
+ args: ['0x'],
+ })
+
+ writeOverloads(config, {
+ args: ['0x', '0x'],
+ })
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test.ts b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test.ts
new file mode 100644
index 000000000..04511d13a
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.test.ts
@@ -0,0 +1,11 @@
+import { abi } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { createWriteContract } from './createWriteContract.js'
+
+test('default', () => {
+ const writeErc20 = createWriteContract({
+ abi: abi.erc20,
+ })
+ expect(writeErc20).toBeDefined()
+})
diff --git a/wagmi-project/packages/core/src/actions/codegen/createWriteContract.ts b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.ts
new file mode 100644
index 000000000..6c1d891a3
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/codegen/createWriteContract.ts
@@ -0,0 +1,145 @@
+import type {
+ Abi,
+ Account,
+ Address,
+ Chain,
+ ContractFunctionArgs,
+ ContractFunctionName,
+ WriteContractParameters as viem_WriteContractParameters,
+} from 'viem'
+
+import type { Config } from '../../createConfig.js'
+import type { SelectChains } from '../../types/chain.js'
+import type {
+ ChainIdParameter,
+ ConnectorParameter,
+} from '../../types/properties.js'
+import type {
+ Compute,
+ UnionCompute,
+ UnionStrictOmit,
+} from '../../types/utils.js'
+import { getAccount } from '../getAccount.js'
+import { getChainId } from '../getChainId.js'
+import {
+ type WriteContractReturnType,
+ writeContract,
+} from '../writeContract.js'
+
+type stateMutability = 'nonpayable' | 'payable'
+
+export type CreateWriteContractParameters<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+> = {
+ abi: abi | Abi | readonly unknown[]
+ address?: address | Address | Record | undefined
+ functionName?:
+ | functionName
+ | ContractFunctionName
+ | undefined
+}
+
+export type CreateWriteContractReturnType<
+ abi extends Abi | readonly unknown[],
+ address extends Address | Record | undefined,
+ functionName extends ContractFunctionName | undefined,
+> = <
+ config extends Config,
+ name extends functionName extends ContractFunctionName
+ ? functionName
+ : ContractFunctionName,
+ args extends ContractFunctionArgs,
+ chainId extends config['chains'][number]['id'],
+ ///
+ allFunctionNames = ContractFunctionName,
+ chains extends readonly Chain[] = SelectChains,
+ omittedProperties extends 'abi' | 'address' | 'functionName' =
+ | 'abi'
+ | (address extends undefined ? never : 'address')
+ | (functionName extends undefined ? never : 'functionName'),
+>(
+ config: config,
+ parameters: UnionCompute<
+ {
+ [key in keyof chains]: UnionStrictOmit<
+ viem_WriteContractParameters<
+ abi,
+ name,
+ args,
+ chains[key],
+ Account,
+ chains[key],
+ allFunctionNames
+ >,
+ omittedProperties | 'chain'
+ >
+ }[number] &
+ (address extends Record
+ ? {
+ chainId?:
+ | keyof address
+ | (chainId extends keyof address ? chainId : never)
+ | undefined
+ }
+ : Compute>) &
+ ConnectorParameter & {
+ /** @deprecated */
+ __mode?: 'prepared'
+ }
+ >,
+) => Promise
+
+export function createWriteContract<
+ const abi extends Abi | readonly unknown[],
+ const address extends
+ | Address
+ | Record
+ | undefined = undefined,
+ functionName extends
+ | ContractFunctionName
+ | undefined = undefined,
+>(
+ c: CreateWriteContractParameters,
+): CreateWriteContractReturnType {
+ if (c.address !== undefined && typeof c.address === 'object')
+ return (config, parameters) => {
+ const configChainId = getChainId(config)
+ const account = getAccount(config)
+
+ let chainId: number | undefined
+ if (parameters.chainId) chainId = parameters.chainId
+ else if (
+ (parameters as unknown as { account: Address | Account | undefined })
+ .account &&
+ (parameters as unknown as { account: Address | Account | undefined })
+ .account === account.address
+ )
+ chainId = account.chainId
+ else if (
+ (parameters as unknown as { account: Address | Account | undefined })
+ .account === undefined
+ )
+ chainId = account.chainId
+ else chainId = configChainId
+
+ return writeContract(config, {
+ ...(parameters as any),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ address: chainId ? c.address?.[chainId] : undefined,
+ abi: c.abi,
+ })
+ }
+
+ return (config, parameters) => {
+ return writeContract(config, {
+ ...(parameters as any),
+ ...(c.address ? { address: c.address } : {}),
+ ...(c.functionName ? { functionName: c.functionName } : {}),
+ abi: c.abi,
+ })
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/connect.test-d.ts b/wagmi-project/packages/core/src/actions/connect.test-d.ts
new file mode 100644
index 000000000..ad790b120
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/connect.test-d.ts
@@ -0,0 +1,48 @@
+import { accounts } from '@wagmi/test'
+import { http } from 'viem'
+import { mainnet } from 'viem/chains'
+import { expectTypeOf, test } from 'vitest'
+
+import type { CreateConnectorFn } from '../connectors/createConnector.js'
+import { mock } from '../connectors/mock.js'
+import { type Connector, createConfig } from '../createConfig.js'
+import { connect } from './connect.js'
+
+const config = createConfig({
+ chains: [mainnet],
+ transports: { [mainnet.id]: http() },
+})
+
+test('parameters: connector (ConnectorFn)', () => {
+ const connectorFn = mock({ accounts })
+
+ connect(config, {
+ connector: connectorFn,
+ foo: 'bar',
+ })
+ expectTypeOf<
+ typeof connectorFn extends CreateConnectorFn ? true : false
+ >().toEqualTypeOf()
+
+ type Result = NonNullable<
+ Parameters>[1]
+ >
+ expectTypeOf().toEqualTypeOf()
+})
+
+test('parameters: connector (Connector)', () => {
+ const connector = config._internal.connectors.setup(mock({ accounts }))
+
+ connect(config, {
+ connector,
+ foo: 'bar',
+ })
+ expectTypeOf<
+ typeof connector extends Connector ? true : false
+ >().toEqualTypeOf()
+
+ type Result = NonNullable<
+ Parameters>[1]
+ >
+ expectTypeOf().toEqualTypeOf()
+})
diff --git a/wagmi-project/packages/core/src/actions/connect.test.ts b/wagmi-project/packages/core/src/actions/connect.test.ts
new file mode 100644
index 000000000..eece8c3a4
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/connect.test.ts
@@ -0,0 +1,71 @@
+import { accounts, chain, config } from '@wagmi/test'
+import { beforeEach, expect, test } from 'vitest'
+
+import { mock } from '../connectors/mock.js'
+import { connect } from './connect.js'
+import { disconnect } from './disconnect.js'
+
+const connector = config._internal.connectors.setup(mock({ accounts }))
+
+beforeEach(async () => {
+ if (config.state.current === connector.uid)
+ await disconnect(config, { connector })
+})
+
+test('default', async () => {
+ await expect(connect(config, { connector })).resolves.toMatchObject(
+ expect.objectContaining({
+ accounts: expect.any(Array),
+ chainId: expect.any(Number),
+ }),
+ )
+})
+
+test('parameters: chainId', async () => {
+ const chainId = chain.mainnet2.id
+ await expect(connect(config, { connector, chainId })).resolves.toMatchObject(
+ expect.objectContaining({
+ accounts: expect.any(Array),
+ chainId,
+ }),
+ )
+})
+
+test('parameters: connector', async () => {
+ const connector_ = config._internal.connectors.setup(mock({ accounts }))
+ await expect(
+ connect(config, { connector: connector_ }),
+ ).resolves.toMatchObject(
+ expect.objectContaining({
+ accounts: expect.any(Array),
+ chainId: expect.any(Number),
+ }),
+ )
+ await disconnect(config, { connector: connector_ })
+})
+
+test('behavior: user rejected request', async () => {
+ const connector_ = config._internal.connectors.setup(
+ mock({
+ accounts,
+ features: { connectError: true },
+ }),
+ )
+ await expect(
+ connect(config, { connector: connector_ }),
+ ).rejects.toMatchInlineSnapshot(`
+ [UserRejectedRequestError: User rejected the request.
+
+ Details: Failed to connect.
+ Version: viem@2.29.2]
+ `)
+})
+
+test('behavior: already connected', async () => {
+ await connect(config, { connector })
+ await expect(connect(config, { connector })).rejects.toMatchInlineSnapshot(`
+ [ConnectorAlreadyConnectedError: Connector already connected.
+
+ Version: @wagmi/core@x.y.z]
+ `)
+})
diff --git a/wagmi-project/packages/core/src/actions/connect.ts b/wagmi-project/packages/core/src/actions/connect.ts
new file mode 100644
index 000000000..f69809e50
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/connect.ts
@@ -0,0 +1,110 @@
+import type {
+ Address,
+ ResourceUnavailableRpcErrorType,
+ UserRejectedRequestErrorType,
+} from 'viem'
+
+import type { CreateConnectorFn } from '../connectors/createConnector.js'
+import type { Config, Connector } from '../createConfig.js'
+import type { BaseErrorType, ErrorType } from '../errors/base.js'
+import {
+ ConnectorAlreadyConnectedError,
+ type ConnectorAlreadyConnectedErrorType,
+} from '../errors/config.js'
+import type { ChainIdParameter } from '../types/properties.js'
+import type { Compute } from '../types/utils.js'
+
+export type ConnectParameters<
+ config extends Config = Config,
+ connector extends Connector | CreateConnectorFn =
+ | Connector
+ | CreateConnectorFn,
+ ///
+ parameters extends unknown | undefined =
+ | (connector extends CreateConnectorFn
+ ? Omit<
+ NonNullable['connect']>[0]>,
+ 'isReconnecting'
+ >
+ : never)
+ | (connector extends Connector
+ ? Omit<
+ NonNullable[0]>,
+ 'isReconnecting'
+ >
+ : never),
+> = Compute<
+ ChainIdParameter & {
+ connector: connector | CreateConnectorFn
+ }
+> &
+ parameters
+
+export type ConnectReturnType = {
+ accounts: readonly [Address, ...Address[]]
+ chainId:
+ | config['chains'][number]['id']
+ | (number extends config['chains'][number]['id'] ? number : number & {})
+}
+
+export type ConnectErrorType =
+ | ConnectorAlreadyConnectedErrorType
+ // connector.connect()
+ | UserRejectedRequestErrorType
+ | ResourceUnavailableRpcErrorType
+ // base
+ | BaseErrorType
+ | ErrorType
+
+/** https://wagmi.sh/core/api/actions/connect */
+export async function connect<
+ config extends Config,
+ connector extends Connector | CreateConnectorFn,
+>(
+ config: config,
+ parameters: ConnectParameters,
+): Promise> {
+ // "Register" connector if not already created
+ let connector: Connector
+ if (typeof parameters.connector === 'function') {
+ connector = config._internal.connectors.setup(parameters.connector)
+ } else connector = parameters.connector
+
+ // Check if connector is already connected
+ if (connector.uid === config.state.current)
+ throw new ConnectorAlreadyConnectedError()
+
+ try {
+ config.setState((x) => ({ ...x, status: 'connecting' }))
+ connector.emitter.emit('message', { type: 'connecting' })
+
+ const { connector: _, ...rest } = parameters
+ const data = await connector.connect(rest)
+ const accounts = data.accounts as readonly [Address, ...Address[]]
+
+ connector.emitter.off('connect', config._internal.events.connect)
+ connector.emitter.on('change', config._internal.events.change)
+ connector.emitter.on('disconnect', config._internal.events.disconnect)
+
+ await config.storage?.setItem('recentConnectorId', connector.id)
+ config.setState((x) => ({
+ ...x,
+ connections: new Map(x.connections).set(connector.uid, {
+ accounts,
+ chainId: data.chainId,
+ connector: connector,
+ }),
+ current: connector.uid,
+ status: 'connected',
+ }))
+
+ return { accounts, chainId: data.chainId }
+ } catch (error) {
+ config.setState((x) => ({
+ ...x,
+ // Keep existing connector connected in case of error
+ status: x.current ? 'connected' : 'disconnected',
+ }))
+ throw error
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/deployContract.test-d.ts b/wagmi-project/packages/core/src/actions/deployContract.test-d.ts
new file mode 100644
index 000000000..b7a6a897d
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/deployContract.test-d.ts
@@ -0,0 +1,71 @@
+import { abi, bytecode, config } from '@wagmi/test'
+import { http } from 'viem'
+import { celo, mainnet } from 'viem/chains'
+import { expectTypeOf, test } from 'vitest'
+
+import { createConfig } from '../createConfig.js'
+import {
+ type DeployContractParameters,
+ deployContract,
+} from './deployContract.js'
+
+test('default', async () => {
+ await deployContract(config, {
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ chainId: mainnet.id,
+ })
+})
+
+test('chain formatters', () => {
+ const config = createConfig({
+ chains: [mainnet, celo],
+ transports: { [celo.id]: http(), [mainnet.id]: http() },
+ })
+
+ type Result = DeployContractParameters
+ expectTypeOf().toMatchTypeOf<{
+ chainId?: typeof celo.id | typeof mainnet.id | undefined
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ deployContract(config, {
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ feeCurrency: '0x',
+ })
+
+ type Result2 = DeployContractParameters<
+ typeof abi.bayc,
+ typeof config,
+ typeof celo.id
+ >
+ expectTypeOf().toMatchTypeOf<{
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ deployContract(config, {
+ chainId: celo.id,
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ feeCurrency: '0x',
+ })
+
+ type Result3 = DeployContractParameters<
+ typeof abi.bayc,
+ typeof config,
+ typeof mainnet.id
+ >
+ expectTypeOf().not.toMatchTypeOf<{
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ deployContract(config, {
+ chainId: mainnet.id,
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ // @ts-expect-error
+ feeCurrency: '0x',
+ })
+})
diff --git a/wagmi-project/packages/core/src/actions/deployContract.test.ts b/wagmi-project/packages/core/src/actions/deployContract.test.ts
new file mode 100644
index 000000000..bebf42342
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/deployContract.test.ts
@@ -0,0 +1,67 @@
+import {
+ abi,
+ bytecode,
+ config,
+ testClient,
+ transactionHashRegex,
+} from '@wagmi/test'
+import { parseEther } from 'viem'
+import { expect, test } from 'vitest'
+
+import { connect } from './connect.js'
+import { deployContract } from './deployContract.js'
+import { disconnect } from './disconnect.js'
+
+const connector = config.connectors[0]!
+
+test('default', async () => {
+ await connect(config, { connector })
+ await expect(
+ deployContract(config, {
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ }),
+ ).resolves.toMatch(transactionHashRegex)
+ await disconnect(config, { connector })
+})
+
+test('behavior: no funds', async () => {
+ const data = await connect(config, { connector })
+ const connectedAddress = data.accounts[0]
+
+ await testClient.mainnet.setBalance({
+ address: connectedAddress,
+ value: parseEther('0'),
+ })
+
+ await expect(
+ deployContract(config, {
+ chainId: testClient.mainnet.chain.id,
+ abi: abi.bayc,
+ bytecode: bytecode.bayc,
+ args: ['Bored Ape Wagmi Club', 'BAYC', 69420n, 0n],
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [TransactionExecutionError: The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.
+
+ This error could arise when the account does not have enough funds to:
+ - pay for the total gas fee,
+ - pay for the value to send.
+
+ The cost of the transaction is calculated as \`gas * gas fee + value\`, where:
+ - \`gas\` is the amount of gas needed for transaction to execute,
+ - \`gas fee\` is the gas fee,
+ - \`value\` is the amount of ether to send to the recipient.
+
+ Request Arguments:
+ chain: undefined (id: 1)
+ from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+ data: 0x608060405260405180602001604052806000815250600b90805190602001906200002b92919062000484565b506000600f60006101000a81548160ff0219169083151502179055503480156200005457600080fd5b50604051620046d0380380620046d0833981810160405260808110156200007a57600080fd5b81019080805160405193929190846401000000008211156200009b57600080fd5b83820191506020820185811115620000b257600080fd5b8251866001820283011164010000000082111715620000d057600080fd5b8083526020830192505050908051906020019080838360005b8381101562000106578082015181840152602081019050620000e9565b50505050905090810190601f168015620001345780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015857600080fd5b838201915060208201858111156200016f57600080fd5b82518660018202830111640100000000821117156200018d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620001c3578082015181840152602081019050620001a6565b50505050905090810190601f168015620001f15780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291905050508383620002296301ffc9a760e01b6200037360201b60201c565b81600690805190602001906200024192919062000484565b5080600790805190602001906200025a92919062000484565b50620002736380ac58cd60e01b6200037360201b60201c565b6200028b635b5e139f60e01b6200037360201b60201c565b620002a363780e9d6360e01b6200037360201b60201c565b50506000620002b76200047c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600e81905550620bdd808101601081905550505050506200052a565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004c757805160ff1916838001178555620004f8565b82800160010185558215620004f8579182015b82811115620004f7578251825591602001919060010190620004da565b5b5090506200050791906200050b565b5090565b5b80821115620005265760008160009055506001016200050c565b5090565b614196806200053a6000396000f3fe60806040526004361061021a5760003560e01c80636c0360eb11610123578063b0f67427116100ab578063e36d64981161006f578063e36d649814610ddf578063e985e9c514610e0a578063e986655014610e91578063eb8d244414610ea8578063f2fde38b14610ed55761021a565b8063b0f6742714610bac578063b88d4fde14610bc3578063bb8a16bd14610cd5578063c87b56dd14610d00578063cb774d4714610db45761021a565b80637d17fcbe116100f25780637d17fcbe14610a395780638da5cb5b14610a5057806395d89b4114610a91578063a22cb46514610b21578063a723533e14610b7e5761021a565b80636c0360eb1461090257806370a0823114610992578063715018a6146109f75780637a3f451e14610a0e5761021a565b80632f745c59116101a65780634f6ccce7116101755780634f6ccce7146106cb57806355f804b31461071a578063571dff3b146107e2578063607e20e31461080d5780636352211e1461089d5761021a565b80632f745c59146105b357806334918dfd146106225780633ccfd60b1461063957806342842e0e146106505761021a565b8063095ea7b3116101ed578063095ea7b3146103bf578063109695231461041a57806318160ddd146104e257806318e20a381461050d57806323b872dd146105385761021a565b8063018a2c371461021f57806301ffc9a71461025a57806306fdde03146102ca578063081812fc1461035a575b600080fd5b34801561022b57600080fd5b506102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610f26565b005b34801561026657600080fd5b506102b26004803603602081101561027d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610fdf565b60405180821515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611046565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031f578082015181840152602081019050610304565b50505050905090810190601f16801561034c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036657600080fd5b506103936004803603602081101561037d57600080fd5b81019080803590602001909291905050506110e8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103cb57600080fd5b50610418600480360360408110156103e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611183565b005b34801561042657600080fd5b506104e06004803603602081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c7565b005b3480156104ee57600080fd5b506104f7611390565b6040518082815260200191505060405180910390f35b34801561051957600080fd5b506105226113a1565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105b16004803603606081101561055b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156105bf57600080fd5b5061060c600480360360408110156105d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141d565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b50610637611478565b005b34801561064557600080fd5b5061064e611553565b005b34801561065c57600080fd5b506106c96004803603606081101561067357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611651565b005b3480156106d757600080fd5b50610704600480360360208110156106ee57600080fd5b8101908080359060200190929190505050611671565b6040518082815260200191505060405180910390f35b34801561072657600080fd5b506107e06004803603602081101561073d57600080fd5b810190808035906020019064010000000081111561075a57600080fd5b82018360208201111561076c57600080fd5b8035906020019184600183028401116401000000008311171561078e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611694565b005b3480156107ee57600080fd5b506107f761174f565b6040518082815260200191505060405180910390f35b34801561081957600080fd5b50610822611754565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610862578082015181840152602081019050610847565b50505050905090810190601f16801561088f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a957600080fd5b506108d6600480360360208110156108c057600080fd5b81019080803590602001909291905050506117f2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b50610917611829565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561095757808201518184015260208101905061093c565b50505050905090810190601f1680156109845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099e57600080fd5b506109e1600480360360208110156109b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118cb565b6040518082815260200191505060405180910390f35b348015610a0357600080fd5b50610a0c6119a0565b005b348015610a1a57600080fd5b50610a23611b10565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e611b1c565b005b348015610a5c57600080fd5b50610a65611c4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9d57600080fd5b50610aa6611c76565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578082015181840152602081019050610acb565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b2d57600080fd5b50610b7c60048036036040811015610b4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d18565b005b610baa60048036036020811015610b9457600080fd5b8101908080359060200190929190505050611ece565b005b348015610bb857600080fd5b50610bc1612127565b005b348015610bcf57600080fd5b50610cd360048036036080811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c4d57600080fd5b820183602082011115610c5f57600080fd5b80359060200191846001830284011164010000000083111715610c8157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061220b565b005b348015610ce157600080fd5b50610cea612283565b6040518082815260200191505060405180910390f35b348015610d0c57600080fd5b50610d3960048036036020811015610d2357600080fd5b8101908080359060200190929190505050612289565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dc057600080fd5b50610dc961255a565b6040518082815260200191505060405180910390f35b348015610deb57600080fd5b50610df4612560565b6040518082815260200191505060405180910390f35b348015610e1657600080fd5b50610e7960048036036040811015610e2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612566565b60405180821515815260200191505060405180910390f35b348015610e9d57600080fd5b50610ea66125fa565b005b348015610eb457600080fd5b50610ebd612764565b60405180821515815260200191505060405180910390f35b348015610ee157600080fd5b50610f2460048036036020811015610ef857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612777565b005b610f2e61296c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614610fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060108190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050905090565b60006110f382612974565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061408b602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061118e826117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061410f6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661123461296c565b73ffffffffffffffffffffffffffffffffffffffff16148061126357506112628161125d61296c565b612566565b5b6112b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613f956038913960400191505060405180910390fd5b6112c28383612991565b505050565b6112cf61296c565b73ffffffffffffffffffffffffffffffffffffffff166112ed611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b908051906020019061138c929190613de6565b5050565b600061139c6002612a4a565b905090565b60105481565b6113b86113b261296c565b82612a5f565b61140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b611418838383612b53565b505050565b600061147082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9690919063ffffffff16565b905092915050565b61148061296c565b73ffffffffffffffffffffffffffffffffffffffff1661149e611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61155b61296c565b73ffffffffffffffffffffffffffffffffffffffff16611579611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561164d573d6000803e3d6000fd5b5050565b61166c8383836040518060200160405280600081525061220b565b505050565b600080611688836002612db090919063ffffffff16565b50905080915050919050565b61169c61296c565b73ffffffffffffffffffffffffffffffffffffffff166116ba611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61174c81612ddc565b50565b601481565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ea5780601f106117bf576101008083540402835291602001916117ea565b820191906000526020600020905b8154815290600101906020018083116117cd57829003601f168201915b505050505081565b600061182282604051806060016040528060298152602001613ff7602991396002612df69092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fcd602a913960400191505060405180910390fd5b611999600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e15565b9050919050565b6119a861296c565b73ffffffffffffffffffffffffffffffffffffffff166119c6611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b67011c37937e08000081565b611b2461296c565b73ffffffffffffffffffffffffffffffffffffffff16611b42611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611bcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600d5414611c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43600c81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d0e5780601f10611ce357610100808354040283529160200191611d0e565b820191906000526020600020905b815481529060010190602001808311611cf157829003601f168201915b5050505050905090565b611d2061296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000611dce61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600f60009054906101000a900460ff16611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53616c65206d7573742062652061637469766520746f206d696e74204170650081525060200191505060405180910390fd5b6014811115611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613f746021913960400191505060405180910390fd5b600e54611fc782611fb9611390565b612e2a90919063ffffffff16565b111561201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806140426028913960400191505060405180910390fd5b3461203a8267011c37937e080000612eb290919063ffffffff16565b11156120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b818110156120ef5760006120c3611390565b9050600e546120d0611390565b10156120e1576120e03382612f38565b5b5080806001019150506120b1565b506000600c541480156121175750600e54612108611390565b148061211657506010544210155b5b156121245743600c819055505b50565b61212f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661214d611c4c565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006121e0611390565b905060005b601e811015612207576121fa33828401612f38565b80806001019150506121e5565b5050565b61221c61221661296c565b83612a5f565b612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b61227d84848484612f56565b50505050565b600e5481565b606061229482612974565b6122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140e0602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123925780601f1061236757610100808354040283529160200191612392565b820191906000526020600020905b81548152906001019060200180831161237557829003601f168201915b5050505050905060606123a3611829565b90506000815114156123b9578192505050612555565b60008251111561248a5780826040516020018083805190602001908083835b602083106123fb57805182526020820191506020810190506020830392506123d8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061244c5780518252602082019150602081019050602083039250612429565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612555565b8061249485612fc8565b6040516020018083805190602001908083835b602083106124ca57805182526020820191506020810190506020830392506124a7565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061251b57805182526020820191506020810190506020830392506124f8565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d5414612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b6000600c5414156126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b600e54600c544060001c816126fc57fe5b06600d8190555060ff61271a600c544361310f90919063ffffffff16565b111561273a57600e54600143034060001c8161273257fe5b06600d819055505b6000600d5414156127625761275b6001600d54612e2a90919063ffffffff16565b600d819055505b565b600f60009054906101000a900460ff1681565b61277f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661279d611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614612826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ed86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600061298a82600261319290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a04836117f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a58826000016131ac565b9050919050565b6000612a6a82612974565b612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613f48602c913960400191505060405180910390fd5b6000612aca836117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3957508373ffffffffffffffffffffffffffffffffffffffff16612b21846110e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4a5750612b498185612566565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b73826117f2565b73ffffffffffffffffffffffffffffffffffffffff1614612bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140b76029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613efe6024913960400191505060405180910390fd5b612c708383836131bd565b612c7b600082612991565b612ccc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131c290919063ffffffff16565b50612d1e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50612d35818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612da5836000018361322b565b60001c905092915050565b600080600080612dc386600001866132ae565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612df2929190613de6565b5050565b6000612e09846000018460001b84613347565b60001c90509392505050565b6000612e238260000161343d565b9050919050565b600080828401905083811015612ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415612ec55760009050612f32565b6000828402905082848281612ed657fe5b0414612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061406a6021913960400191505060405180910390fd5b809150505b92915050565b612f5282826040518060200160405280600081525061344e565b5050565b612f61848484612b53565b612f6d848484846134bf565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b50505050565b60606000821415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061310a565b600082905060005b6000821461303a578080600101915050600a828161303257fe5b049150613018565b60608167ffffffffffffffff8111801561305357600080fd5b506040519080825280601f01601f1916602001820160405280156130865781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461310257600a84816130a757fe5b0660300160f81b828280600190039350815181106130c157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130fa57fe5b049350613095565b819450505050505b919050565b600082821115613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131a4836000018360001b6136d8565b905092915050565b600081600001805490509050919050565b505050565b60006131d4836000018360001b6136fb565b905092915050565b60006131ee836000018360001b6137e3565b905092915050565b6000613222846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613853565b90509392505050565b60008183600001805490501161328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e846022913960400191505060405180910390fd5b82600001828154811061329b57fe5b9060005260206000200154905092915050565b60008082846000018054905011613310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140206022913960400191505060405180910390fd5b600084600001848154811061332157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133d35780820151818401526020810190506133b8565b50505050905090810190601f1680156134005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061342157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613458838361392f565b61346560008484846134bf565b6134ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b505050565b60006134e08473ffffffffffffffffffffffffffffffffffffffff16613b23565b6134ed57600190506136d0565b606061365763150b7a0260e01b61350261296c565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561358657808201518184015260208101905061356b565b50505050905090810190601f1680156135b35780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613ea6603291398773ffffffffffffffffffffffffffffffffffffffff16613b369092919063ffffffff16565b9050600081806020019051602081101561367057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137d7576000600182039050600060018660000180549050039050600086600001828154811061374657fe5b906000526020600020015490508087600001848154811061376357fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061379b57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137dd565b60009150505b92915050565b60006137ef8383613b4e565b61384857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061384d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613928565b8285600001600183038154811061390d57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6139db81612974565b15613a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b613a5a600083836131bd565b613aab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50613ac2818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613b458484600085613b71565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613f226026913960400191505060405180910390fd5b613bd585613b23565b613c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c975780518252602082019150602081019050602083039250613c74565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cf9576040519150601f19603f3d011682016040523d82523d6000602084013e613cfe565b606091505b5091509150613d0e828286613d1a565b92505050949350505050565b60608315613d2a57829050613ddf565b600083511115613d3d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da4578082015181840152602081019050613d89565b50505050905090810190601f168015613dd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e2757805160ff1916838001178555613e55565b82800160010185558215613e55579182015b82811115613e54578251825591602001919060010190613e39565b5b509050613e629190613e66565b5090565b5b80821115613e7f576000816000905550600101613e67565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473507572636861736520776f756c6420657863656564206d617820737570706c79206f662041706573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b0e64d1fa6c4dbeb9c6f54607d7e1996943fe27624a80652f57b53fda084621b64736f6c63430007000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006080e6d70000000000000000000000000000000000000000000000000000000000000011426f7265644170655961636874436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000010f2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014426f72656420417065205761676d6920436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000
+
+ Details: Insufficient funds for gas * price + value
+ Version: viem@2.29.2]
+ `)
+
+ await disconnect(config, { connector })
+})
diff --git a/wagmi-project/packages/core/src/actions/deployContract.ts b/wagmi-project/packages/core/src/actions/deployContract.ts
new file mode 100644
index 000000000..a688dd7cf
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/deployContract.ts
@@ -0,0 +1,87 @@
+import type { Abi, Account, Chain, Client, ContractConstructorArgs } from 'viem'
+import {
+ type DeployContractErrorType as viem_DeployContractErrorType,
+ type DeployContractParameters as viem_DeployContractParameters,
+ type DeployContractReturnType as viem_DeployContractReturnType,
+ deployContract as viem_deployContract,
+} from 'viem/actions'
+import type { Config } from '../createConfig.js'
+import type { BaseErrorType, ErrorType } from '../errors/base.js'
+import type { SelectChains } from '../types/chain.js'
+import type {
+ ChainIdParameter,
+ ConnectorParameter,
+} from '../types/properties.js'
+import type { Compute } from '../types/utils.js'
+import { getAction } from '../utils/getAction.js'
+import {
+ type GetConnectorClientErrorType,
+ getConnectorClient,
+} from './getConnectorClient.js'
+
+export type DeployContractParameters<
+ abi extends Abi | readonly unknown[] = Abi,
+ config extends Config = Config,
+ chainId extends
+ config['chains'][number]['id'] = config['chains'][number]['id'],
+ ///
+ allArgs = ContractConstructorArgs,
+ chains extends readonly Chain[] = SelectChains,
+> = {
+ [key in keyof chains]: Compute<
+ Omit<
+ viem_DeployContractParameters<
+ abi,
+ chains[key],
+ Account,
+ chains[key],
+ allArgs
+ >,
+ 'chain'
+ > &
+ ChainIdParameter &
+ ConnectorParameter
+ >
+}[number]
+
+export type DeployContractReturnType = viem_DeployContractReturnType
+
+export type DeployContractErrorType =
+ // getConnectorClient()
+ | GetConnectorClientErrorType
+ // base
+ | BaseErrorType
+ | ErrorType
+ // viem
+ | viem_DeployContractErrorType
+
+/** https://wagmi.sh/core/api/actions/deployContract */
+export async function deployContract<
+ config extends Config,
+ const abi extends Abi | readonly unknown[],
+ chainId extends config['chains'][number]['id'],
+>(
+ config: config,
+ parameters: DeployContractParameters,
+): Promise {
+ const { account, chainId, connector, ...rest } = parameters
+
+ let client: Client
+ if (typeof account === 'object' && account?.type === 'local')
+ client = config.getClient({ chainId })
+ else
+ client = await getConnectorClient(config, {
+ account: account ?? undefined,
+ chainId,
+ connector,
+ })
+
+ const action = getAction(client, viem_deployContract, 'deployContract')
+ const hash = await action({
+ ...(rest as any),
+ ...(account ? { account } : {}),
+ chain: chainId ? { id: chainId } : null,
+ })
+
+ return hash
+}
diff --git a/wagmi-project/packages/core/src/actions/disconnect.test.ts b/wagmi-project/packages/core/src/actions/disconnect.test.ts
new file mode 100644
index 000000000..03d63db7d
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/disconnect.test.ts
@@ -0,0 +1,33 @@
+import { accounts, config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { mock } from '../connectors/mock.js'
+import { connect } from './connect.js'
+import { disconnect } from './disconnect.js'
+
+const connector = config._internal.connectors.setup(mock({ accounts }))
+
+test('default', async () => {
+ await connect(config, { connector })
+ expect(config.state.status).toEqual('connected')
+ await disconnect(config)
+ expect(config.state.status).toEqual('disconnected')
+})
+
+test('parameters: connector', async () => {
+ await connect(config, { connector })
+ expect(config.state.status).toEqual('connected')
+ await disconnect(config, { connector })
+ expect(config.state.status).toEqual('disconnected')
+})
+
+test('behavior: uses next connector on disconnect', async () => {
+ const connector_ = config._internal.connectors.setup(mock({ accounts }))
+ await connect(config, { connector: connector_ })
+ await connect(config, { connector })
+
+ expect(config.state.status).toEqual('connected')
+ await disconnect(config, { connector })
+ expect(config.state.status).toEqual('connected')
+ await disconnect(config, { connector: connector_ })
+})
diff --git a/wagmi-project/packages/core/src/actions/disconnect.ts b/wagmi-project/packages/core/src/actions/disconnect.ts
new file mode 100644
index 000000000..6efb4c790
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/disconnect.ts
@@ -0,0 +1,71 @@
+import type { Config, Connection, Connector } from '../createConfig.js'
+import type { BaseErrorType, ErrorType } from '../errors/base.js'
+import type {
+ ConnectorNotConnectedErrorType,
+ ConnectorNotFoundErrorType,
+} from '../errors/config.js'
+import type { ConnectorParameter } from '../types/properties.js'
+
+export type DisconnectParameters = ConnectorParameter
+
+export type DisconnectReturnType = void
+
+export type DisconnectErrorType =
+ | ConnectorNotFoundErrorType
+ | ConnectorNotConnectedErrorType
+ // base
+ | BaseErrorType
+ | ErrorType
+
+/** https://wagmi.sh/core/api/actions/disconnect */
+export async function disconnect(
+ config: Config,
+ parameters: DisconnectParameters = {},
+): Promise {
+ let connector: Connector | undefined
+ if (parameters.connector) connector = parameters.connector
+ else {
+ const { connections, current } = config.state
+ const connection = connections.get(current!)
+ connector = connection?.connector
+ }
+
+ const connections = config.state.connections
+
+ if (connector) {
+ await connector.disconnect()
+ connector.emitter.off('change', config._internal.events.change)
+ connector.emitter.off('disconnect', config._internal.events.disconnect)
+ connector.emitter.on('connect', config._internal.events.connect)
+
+ connections.delete(connector.uid)
+ }
+
+ config.setState((x) => {
+ // if no connections exist, move to disconnected state
+ if (connections.size === 0)
+ return {
+ ...x,
+ connections: new Map(),
+ current: null,
+ status: 'disconnected',
+ }
+
+ // switch over to another connection
+ const nextConnection = connections.values().next().value as Connection
+ return {
+ ...x,
+ connections: new Map(connections),
+ current: nextConnection.connector.uid,
+ }
+ })
+
+ // Set recent connector if exists
+ {
+ const current = config.state.current
+ if (!current) return
+ const connector = config.state.connections.get(current)?.connector
+ if (!connector) return
+ await config.storage?.setItem('recentConnectorId', connector.id)
+ }
+}
diff --git a/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test-d.ts b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test-d.ts
new file mode 100644
index 000000000..dada2ea31
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test-d.ts
@@ -0,0 +1,41 @@
+import { config } from '@wagmi/test'
+import { expectTypeOf, test } from 'vitest'
+import { estimateFeesPerGas } from './estimateFeesPerGas.js'
+
+test('types', async () => {
+ const default_ = await estimateFeesPerGas(config)
+ expectTypeOf(default_).toMatchTypeOf<{
+ gasPrice?: undefined
+ maxFeePerGas: bigint
+ maxPriorityFeePerGas: bigint
+ formatted: {
+ gasPrice?: undefined
+ maxFeePerGas: string
+ maxPriorityFeePerGas: string
+ }
+ }>()
+
+ const legacy = await estimateFeesPerGas(config, { type: 'legacy' })
+ expectTypeOf(legacy).toMatchTypeOf<{
+ gasPrice: bigint
+ maxFeePerGas?: undefined
+ maxPriorityFeePerGas?: undefined
+ formatted: {
+ gasPrice: string
+ maxFeePerGas?: undefined
+ maxPriorityFeePerGas?: undefined
+ }
+ }>()
+
+ const eip1559 = await estimateFeesPerGas(config, { type: 'eip1559' })
+ expectTypeOf(eip1559).toMatchTypeOf<{
+ gasPrice?: undefined
+ maxFeePerGas: bigint
+ maxPriorityFeePerGas: bigint
+ formatted: {
+ gasPrice?: undefined
+ maxFeePerGas: string
+ maxPriorityFeePerGas: string
+ }
+ }>()
+})
diff --git a/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test.ts b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test.ts
new file mode 100644
index 000000000..4c5d668b8
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.test.ts
@@ -0,0 +1,16 @@
+import { config } from '@wagmi/test'
+import { expect, test } from 'vitest'
+
+import { estimateFeesPerGas } from './estimateFeesPerGas.js'
+
+test('default', async () => {
+ const result = await estimateFeesPerGas(config)
+ expect(Object.keys(result)).toMatchInlineSnapshot(`
+ [
+ "formatted",
+ "gasPrice",
+ "maxFeePerGas",
+ "maxPriorityFeePerGas",
+ ]
+ `)
+})
diff --git a/wagmi-project/packages/core/src/actions/estimateFeesPerGas.ts b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.ts
new file mode 100644
index 000000000..66915f010
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateFeesPerGas.ts
@@ -0,0 +1,87 @@
+import {
+ type Chain,
+ type FeeValuesEIP1559,
+ type FeeValuesLegacy,
+ type FeeValuesType,
+ formatUnits,
+} from 'viem'
+import {
+ type EstimateFeesPerGasErrorType as viem_EstimateFeesPerGasErrorType,
+ type EstimateFeesPerGasParameters as viem_EstimateFeesPerGasParameters,
+ type EstimateFeesPerGasReturnType as viem_EstimateFeesPerGasReturnType,
+ estimateFeesPerGas as viem_estimateFeesPerGas,
+} from 'viem/actions'
+
+import type { Config } from '../createConfig.js'
+import type { ChainIdParameter } from '../types/properties.js'
+import type { Unit } from '../types/unit.js'
+import type { Compute } from '../types/utils.js'
+import type { UnionCompute, UnionLooseOmit } from '../types/utils.js'
+import { getAction } from '../utils/getAction.js'
+import { getUnit } from '../utils/getUnit.js'
+
+export type EstimateFeesPerGasParameters<
+ type extends FeeValuesType = FeeValuesType,
+ config extends Config = Config,
+> = UnionCompute<
+ UnionLooseOmit<
+ viem_EstimateFeesPerGasParameters,
+ 'chain'
+ > &
+ ChainIdParameter & {
+ /** @deprecated */
+ formatUnits?: Unit | undefined
+ }
+>
+
+export type EstimateFeesPerGasReturnType<
+ type extends FeeValuesType = FeeValuesType,
+> = Compute<
+ viem_EstimateFeesPerGasReturnType & {
+ /** @deprecated */
+ formatted: UnionCompute<
+ | (type extends 'legacy' ? FeeValuesLegacy : never)
+ | (type extends 'eip1559' ? FeeValuesEIP1559 : never)
+ >
+ }
+>
+
+export type EstimateFeesPerGasErrorType = viem_EstimateFeesPerGasErrorType
+
+export async function estimateFeesPerGas<
+ config extends Config,
+ type extends FeeValuesType = 'eip1559',
+>(
+ config: config,
+ parameters: EstimateFeesPerGasParameters = {},
+): Promise> {
+ const { chainId, formatUnits: units = 'gwei', ...rest } = parameters
+
+ const client = config.getClient({ chainId })
+ const action = getAction(
+ client,
+ viem_estimateFeesPerGas,
+ 'estimateFeesPerGas',
+ )
+
+ const { gasPrice, maxFeePerGas, maxPriorityFeePerGas } = await action({
+ ...rest,
+ chain: client.chain,
+ })
+
+ const unit = getUnit(units)
+ const formatted = {
+ gasPrice: gasPrice ? formatUnits(gasPrice, unit) : undefined,
+ maxFeePerGas: maxFeePerGas ? formatUnits(maxFeePerGas, unit) : undefined,
+ maxPriorityFeePerGas: maxPriorityFeePerGas
+ ? formatUnits(maxPriorityFeePerGas, unit)
+ : undefined,
+ }
+
+ return {
+ formatted,
+ gasPrice,
+ maxFeePerGas,
+ maxPriorityFeePerGas,
+ } as EstimateFeesPerGasReturnType
+}
diff --git a/wagmi-project/packages/core/src/actions/estimateGas.test-d.ts b/wagmi-project/packages/core/src/actions/estimateGas.test-d.ts
new file mode 100644
index 000000000..5fc66c0ec
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateGas.test-d.ts
@@ -0,0 +1,47 @@
+import { http, parseEther } from 'viem'
+import { celo, mainnet } from 'viem/chains'
+import { expectTypeOf, test } from 'vitest'
+
+import { createConfig } from '../createConfig.js'
+import { type EstimateGasParameters, estimateGas } from './estimateGas.js'
+
+test('chain formatters', () => {
+ const config = createConfig({
+ chains: [mainnet, celo],
+ transports: { [celo.id]: http(), [mainnet.id]: http() },
+ })
+
+ type Result = EstimateGasParameters
+ expectTypeOf().toMatchTypeOf<{
+ chainId?: typeof celo.id | typeof mainnet.id | undefined
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ estimateGas(config, {
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ feeCurrency: '0x',
+ })
+
+ type Result2 = EstimateGasParameters
+ expectTypeOf().toMatchTypeOf<{
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ estimateGas(config, {
+ chainId: celo.id,
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ feeCurrency: '0x',
+ })
+
+ type Result3 = EstimateGasParameters
+ expectTypeOf().not.toMatchTypeOf<{
+ feeCurrency?: `0x${string}` | undefined
+ }>()
+ estimateGas(config, {
+ chainId: mainnet.id,
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ // @ts-expect-error
+ feeCurrency: '0x',
+ })
+})
diff --git a/wagmi-project/packages/core/src/actions/estimateGas.test.ts b/wagmi-project/packages/core/src/actions/estimateGas.test.ts
new file mode 100644
index 000000000..f0154c55f
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateGas.test.ts
@@ -0,0 +1,47 @@
+import { accounts, config } from '@wagmi/test'
+import { parseEther } from 'viem'
+import { expect, test } from 'vitest'
+
+import { mock } from '../connectors/mock.js'
+import { connect } from './connect.js'
+import { disconnect } from './disconnect.js'
+import { estimateGas } from './estimateGas.js'
+
+const connector = config._internal.connectors.setup(mock({ accounts }))
+
+test('parameters: account', async () => {
+ await expect(
+ estimateGas(config, {
+ account: accounts[0],
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ }),
+ ).resolves.toMatchInlineSnapshot('21000n')
+})
+
+test('parameters: connector', async () => {
+ await connect(config, { connector })
+
+ await expect(
+ estimateGas(config, {
+ connector,
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ }),
+ ).resolves.toMatchInlineSnapshot('21000n')
+
+ await disconnect(config, { connector })
+})
+
+test('behavior: no account and not connected', async () => {
+ await expect(
+ estimateGas(config, {
+ to: '0xd2135CfB216b74109775236E36d4b433F1DF507B',
+ value: parseEther('0.01'),
+ }),
+ ).rejects.toThrowErrorMatchingInlineSnapshot(`
+ [ConnectorNotConnectedError: Connector not connected.
+
+ Version: @wagmi/core@x.y.z]
+ `)
+})
diff --git a/wagmi-project/packages/core/src/actions/estimateGas.ts b/wagmi-project/packages/core/src/actions/estimateGas.ts
new file mode 100644
index 000000000..c049fa42f
--- /dev/null
+++ b/wagmi-project/packages/core/src/actions/estimateGas.ts
@@ -0,0 +1,73 @@
+import type { Account, Address, Chain } from 'viem'
+import {
+ type EstimateGasErrorType as viem_EstimateGasErrorType,
+ type EstimateGasParameters as viem_EstimateGasParameters,
+ type EstimateGasReturnType as viem_EstimateGasReturnType,
+ estimateGas as viem_estimateGas,
+} from 'viem/actions'
+
+import type { Config } from '../createConfig.js'
+import type { BaseErrorType, ErrorType } from '../errors/base.js'
+import type { SelectChains } from '../types/chain.js'
+import type {
+ ChainIdParameter,
+ ConnectorParameter,
+} from '../types/properties.js'
+import type { UnionCompute, UnionLooseOmit } from '../types/utils.js'
+import { getAction } from '../utils/getAction.js'
+import {
+ type GetConnectorClientErrorType,
+ getConnectorClient,
+} from './getConnectorClient.js'
+
+export type EstimateGasParameters<
+ config extends Config = Config,
+ chainId extends
+ | config['chains'][number]['id']
+ | undefined = config['chains'][number]['id'],
+ ///
+ chains extends readonly Chain[] = SelectChains,
+> = {
+ [key in keyof chains]: UnionCompute<
+ UnionLooseOmit, 'chain'> &
+ ChainIdParameter &
+ ConnectorParameter
+ >
+}[number]
+
+export type EstimateGasReturnType = viem_EstimateGasReturnType
+
+export type EstimateGasErrorType =
+ // getConnectorClient()
+ | GetConnectorClientErrorType
+ // base
+ | BaseErrorType
+ | ErrorType
+ // viem
+ | viem_EstimateGasErrorType
+
+/** https://wagmi.sh/core/api/actions/estimateGas */
+export async function estimateGas<
+ config extends Config,
+ chainId extends config['chains'][number]['id'] | undefined = undefined,
+>(
+ config: config,
+ parameters: EstimateGasParameters