diff --git a/.changeset/config.json b/.changeset/config.json index c47279e4c8..11187a0aca 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,9 +1,15 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", + "$schema": "https://unpkg.com/@changesets/config@3.0.5/schema.json", + "changelog": [ + "@svitejs/changesets-changelog-github-compact", + { "repo": "wevm/wagmi" } + ], + "commit": false, "access": "public", + "fixed": [], + "linked": [], "baseBranch": "main", - "changelog": ["@changesets/changelog-github", { "repo": "wevm/wagmi" }], - "commit": false, + "updateInternalDependencies": "minor", "ignore": [ "*-register", "@wagmi/test", @@ -11,9 +17,5 @@ "next-app", "nuxt-app", "vite-*" - ], - "updateInternalDependencies": "patch", - "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { - "onlyUpdatePeerDependentsWhenOutOfRange": true - } + ] } diff --git a/.changeset/cool-masks-hang.md b/.changeset/cool-masks-hang.md deleted file mode 100644 index 0c0ff73c79..0000000000 --- a/.changeset/cool-masks-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@wagmi/connectors": patch ---- - -Added `rdns` property to Coinbase Wallet v3 connector diff --git a/.changeset/young-houses-relate.md b/.changeset/young-houses-relate.md deleted file mode 100644 index 288ab44256..0000000000 --- a/.changeset/young-houses-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@wagmi/connectors": patch ---- - -Bumped `@safe-global/safe-apps-provider` version to `0.18.6`. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 12451d4bc9..9c8e90839e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,6 @@ @tmm @jxom +/packages/connectors/src/gemini @mikelxc /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/.github/README.md b/.github/README.md index 6b5f336419..6a42bc8198 100644 --- a/.github/README.md +++ b/.github/README.md @@ -23,6 +23,19 @@ Version + + + + OpenSSF Best Practices + + + + + + OpenSSF Best Practices + + +
@@ -239,6 +252,12 @@ If you find Wagmi useful or use it for work, please consider [sponsoring Wagmi]( sequence logo + + + + gemini logo + +

[Sponsor Wagmi](https://github.com/sponsors/wevm?metadata_campaign=gh_readme_support_bottom) diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index 34e945ddf0..ad427406cf 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -2,6 +2,8 @@ name: Changesets on: push: branches: [main] +permissions: + contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -10,31 +12,37 @@ concurrency: jobs: verify: name: Verify + permissions: + contents: write uses: ./.github/workflows/verify.yml secrets: inherit changesets: name: Publish needs: verify + # prevents this action from running on forks + if: github.repository == 'wevm/wagmi' permissions: - contents: write - id-token: write - pull-requests: write + contents: write # to create release (changesets/action) + id-token: write # OpenID Connect token needed for provenance + pull-requests: write # to create pull request (changesets/action) runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Clone repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 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 + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 - name: PR or publish - uses: changesets/action@06245a4e0a36c064a573d4150030f5ec548e4fcc + uses: changesets/action@e0145edc7d9d8679003495b11f87bd8ef63c0cba # v1.5.3 with: title: 'chore: version packages' commit: 'chore: version packages' @@ -43,18 +51,14 @@ jobs: version: pnpm changeset:version env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Publish prerelease + - name: Publish canary release 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/.github/workflows/issue-labeled.yml b/.github/workflows/issue-labeled.yml index 39b98291d1..eaa28bfd01 100644 --- a/.github/workflows/issue-labeled.yml +++ b/.github/workflows/issue-labeled.yml @@ -1,4 +1,6 @@ name: Issue Labeled +permissions: + issues: write on: issues: @@ -7,7 +9,7 @@ on: jobs: issue-labeled: if: ${{ github.repository_owner == 'wevm' }} - uses: wevm/actions/.github/workflows/issue-labeled.yml@main + uses: wevm/actions/.github/workflows/issue-labeled.yml@f7ad7f00e16e73322562922c241f21f0c7ffbbec with: needs-reproduction-body: | Hello @${{ github.event.issue.user.login }}. diff --git a/.github/workflows/lock-issue.yml b/.github/workflows/lock-issue.yml index 279452d223..afce18e9fb 100644 --- a/.github/workflows/lock-issue.yml +++ b/.github/workflows/lock-issue.yml @@ -1,4 +1,6 @@ name: Lock Issue +permissions: + issues: write on: schedule: @@ -7,7 +9,7 @@ on: jobs: lock-issue: if: ${{ github.repository_owner == 'wevm' }} - uses: wevm/actions/.github/workflows/lock-issue.yml@main + uses: wevm/actions/.github/workflows/lock-issue.yml@f7ad7f00e16e73322562922c241f21f0c7ffbbec with: issue-comment: | This issue has been locked since it has been closed for more than 14 days. diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9ff4c5bb76..6634c53d07 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -2,6 +2,8 @@ name: Pull Request on: pull_request: types: [opened, reopened, synchronize, ready_for_review] +permissions: + contents: read concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -10,23 +12,55 @@ concurrency: jobs: verify: name: Verify + permissions: + contents: write uses: ./.github/workflows/verify.yml secrets: inherit + publish: + name: Publish preview release + # prevents this action from running on forks + if: github.repository == 'wevm/wagmi' + permissions: + contents: read + runs-on: ubuntu-latest + timeout-minutes: 5 + + steps: + - name: Clone repository + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 + + - name: Install dependencies + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 + + - name: Publish to pkg.pr.new + run: | + pnpm changeset:prepublish + pnpx pkg-pr-new publish --pnpm --compact './packages/*' + env: + PKG_PR_NEW: true + size: name: Size + permissions: + contents: read + pull-requests: write runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Clone repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 - name: Report build size - uses: preactjs/compressed-size-action@v2 + uses: preactjs/compressed-size-action@946a292cd35bd1088e0d7eb92b69d1a8d5b5d76a with: pattern: 'packages/**/dist/**' repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000000..ba176318ec --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,51 @@ +name: Scorecard +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '22 13 * * 0' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled. + if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request' + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + with: + results_file: results.sarif + results_format: sarif + publish_results: true + + - name: "Upload artifact" + uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@80cb6b56b93de3e779c7d476d9100d06fb87c877 # codeql-bundle-v2.23.2 + with: + sarif_file: results.sarif diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml deleted file mode 100644 index 39683bb684..0000000000 --- a/.github/workflows/snapshot.yml +++ /dev/null @@ -1,32 +0,0 @@ -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/.github/workflows/verify.yml b/.github/workflows/verify.yml index 2ec609c42c..dc10db5e03 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -2,6 +2,8 @@ name: Verify on: workflow_call: workflow_dispatch: +permissions: + contents: read jobs: check: @@ -13,12 +15,17 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 with: token: ${{ secrets.GH_PTOKEN }} - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 + + - name: Audit dependencies + run: pnpm audit - name: Check repo run: pnpm check:repo @@ -29,7 +36,7 @@ jobs: - name: Update package versions run: pnpm version:update - - uses: stefanzweifel/git-auto-commit-action@v5 + - uses: stefanzweifel/git-auto-commit-action@778341af668090896ca464160c2def5d1d1a3eb0 # v6.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -39,19 +46,23 @@ jobs: build: name: Build + permissions: + contents: read needs: check runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Clone repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 - name: Build - run: pnpm build + run: pnpm clean && pnpm build - name: Publint run: pnpm test:build @@ -61,20 +72,24 @@ jobs: types: name: Types + permissions: + contents: read needs: check runs-on: ubuntu-latest timeout-minutes: 5 strategy: matrix: - typescript-version: ['5.2.2', '5.3.3', '5.4.5', '5.5.2'] - viem-version: ['2.23.12', 'latest'] + typescript-version: ['5.7.3', '5.8.3', '5.9.3', 'latest'] + viem-version: ['2.44.0', 'latest'] steps: - name: Clone repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 - run: pnpm add -D -w typescript@${{ matrix.typescript-version }} viem@${{ matrix.viem-version }} @@ -84,6 +99,9 @@ jobs: - name: Check types run: pnpm check:types + - name: Bench types + run: pnpm bench: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 @@ -91,6 +109,8 @@ jobs: test: name: Test + permissions: + contents: read runs-on: ubuntu-latest timeout-minutes: 10 strategy: @@ -101,18 +121,34 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v4 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 - name: Install dependencies - uses: wevm/actions/.github/actions/pnpm@main + uses: wevm/actions/.github/actions/pnpm@f7ad7f00e16e73322562922c241f21f0c7ffbbec + with: + node-version: 24.5 + + - name: Setup Docker + uses: docker/setup-docker-action@v4 - name: Set up foundry - uses: foundry-rs/foundry-toolchain@v1 + uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0 with: version: nightly + - name: Cache Playwright + uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb + id: playwright-cache + with: + path: ~/.cache/ms-playwright + key: ${{ runner.os }}-playwright-${{ hashFiles('pnpm-lock.yaml') }} + + - name: Install Playwright + if: steps.playwright-cache.outputs.cache-hit != 'true' + run: pnpm exec playwright install chromium --with-deps + - name: Run tests - uses: nick-fields/retry@v3 + uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 with: command: CI=true pnpm test:cov --shard=${{ matrix.shard }}/${{ matrix.total-shards }} --retry=3 --bail=1 max_attempts: 3 @@ -122,6 +158,6 @@ jobs: VITE_OPTIMISM_FORK_URL: ${{ secrets.VITE_OPTIMISM_FORK_URL }} - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v5 + uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 with: token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 1834fe72ab..e89dcd50c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,17 @@ +*.vitest-temp.json .DS_Store +.attest .next .nuxt .pnpm-debug.log* +.tanstack +.wrangler +_ cache coverage dist node_modules tsconfig.tsbuildinfo -*.vitest-temp.json # local env files .env @@ -31,9 +35,11 @@ packages/react/chains packages/react/codegen packages/react/connectors packages/react/experimental +packages/react/internal packages/react/query packages/vue/actions packages/vue/chains packages/vue/connectors +packages/vue/internal packages/vue/nuxt packages/vue/query diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 47687565bf..0000000000 --- a/.npmrc +++ /dev/null @@ -1,5 +0,0 @@ -auto-install-peers=false -enable-pre-post-scripts=true -link-workspace-packages=deep -provenance=true -strict-peer-dependencies=false diff --git a/.vscode/settings.json b/.vscode/settings.json index c32e8fa4c3..6318c082c0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,8 +5,7 @@ "typescript.preferences.importModuleSpecifier": "shortest", "typescript.tsdk": "node_modules/typescript/lib", "editor.codeActionsOnSave": { - "quickfix.biome": "explicit", - "source.organizeImports.biome": "explicit" + "source.fixAll.biome": "explicit" }, "[javascript][javascriptreact][json][typescript][typescriptreact]": { "editor.defaultFormatter": "biomejs.biome" diff --git a/biome.json b/biome.json index ce99662cb0..9fb7318f87 100644 --- a/biome.json +++ b/biome.json @@ -1,7 +1,14 @@ { "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", "files": { - "ignore": ["CHANGELOG.md", "pnpm-lock.yaml", "tsconfig.base.json"] + "includes": [ + "**", + "!**/CHANGELOG.md", + "!**/pnpm-lock.yaml", + "!**/routeTree.gen.ts", + "!**/tsconfig.base.json", + "!**/worker-configuration.d.ts" + ] }, "formatter": { "enabled": true, @@ -11,13 +18,16 @@ "lineWidth": 80 }, "linter": { - "ignore": ["packages/create-wagmi/templates/*"], + "includes": ["**", "!**/packages/create-wagmi/templates/**/*"], "enabled": true, "rules": { "recommended": true, "a11y": { "useButtonType": "off" }, + "complexity": { + "noImportantStyles": "off" + }, "correctness": { "noUnusedVariables": "error", "useExhaustiveDependencies": "error" @@ -29,13 +39,34 @@ }, "style": { "noNonNullAssertion": "off", - "useShorthandArrayType": "error" + "noParameterAssign": "error", + "useAsConstAssertion": "error", + "useDefaultParameterLast": "error", + "useEnumInitializers": "error", + "useSelfClosingElements": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error", + "useConsistentArrayType": { + "level": "error", + "options": { + "syntax": "shorthand" + } + } }, "suspicious": { "noArrayIndexKey": "off", "noConfusingVoidType": "off", - "noConsoleLog": "error", - "noExplicitAny": "off" + "noExplicitAny": "off", + "noConsole": { + "level": "error", + "options": { + "allow": ["log"] + } + }, + "noTsIgnore": "off" } } }, @@ -46,32 +77,52 @@ "semicolons": "asNeeded" } }, - "organizeImports": { - "enabled": true + "assist": { + "actions": { + "source": { + "organizeImports": "on" + } + } }, "overrides": [ { - "include": ["*.vue"], + "includes": ["**/*.vue"], "linter": { "rules": { "correctness": { + "noUnusedImports": "off", "noUnusedVariables": "off" } } } }, { - "include": ["./scripts/**/*.ts"], + "includes": ["site/snippets/**"], + "linter": { + "rules": { + "correctness": { + "noUnusedImports": "off" + } + } + } + }, + { + "includes": ["scripts/**/*.ts"], "linter": { "rules": { "suspicious": { - "noConsoleLog": "off" + "noConsole": { + "level": "off", + "options": { + "allow": ["log"] + } + } } } } }, { - "include": ["./playgrounds/**"], + "includes": ["playgrounds/**"], "linter": { "rules": { "style": { diff --git a/package.json b/package.json index d7b3821bf0..7adf2c4848 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,11 @@ { + "name": "workspace", "private": true, "type": "module", "scripts": { - "build": "pnpm run --r --filter \"./packages/**\" build", - "changeset:prepublish": "pnpm version:update && pnpm build && bun scripts/formatPackageJson.ts && bun scripts/generateProxyPackages.ts", + "build": "pnpm run --filter @wagmi/core --filter @wagmi/cli build && pnpm run --filter @wagmi/connectors build && pnpm run --filter wagmi --filter @wagmi/vue build", + "bench:types": "TYPES=true vitest bench-d.ts", + "changeset:prepublish": "pnpm clean && pnpm version:update && pnpm build && node scripts/formatPackageJson.ts && node scripts/generateProxyPackages.ts", "changeset:publish": "pnpm changeset:prepublish && changeset publish", "changeset:version": "changeset version && pnpm version:update && pnpm format", "check": "biome check --write", @@ -12,6 +14,7 @@ "check:unused": "pnpm clean && knip", "clean": "pnpm run --r --parallel clean && rm -rf packages/**/*.json.tmp", "deps": "pnpx taze -r", + "deps:ci": "pnpx actions-up", "dev": "pnpm dev:react", "dev:cli": "pnpm --filter cli dev", "dev:core": "pnpm --filter vite-core dev", @@ -19,117 +22,143 @@ "dev:next": "pnpm --filter next-app dev", "dev:nuxt": "pnpm --filter nuxt-app dev", "dev:react": "pnpm --filter vite-react dev", + "dev:start": "pnpm --filter tanstack-start 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", + "preconstruct": "node 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:build": "node scripts/generateProxyPackages.ts && pnpm run --r --parallel test:build", "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" + "version:update": "node scripts/updateVersion.ts", + "version:update:viem": "node scripts/updateViemVersion.ts" }, "devDependencies": { "@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": "^2.1.1", + "@ark/attest": "^0.56.0", + "@biomejs/biome": "^2.2.4", + "@changesets/cli": "^3.0.0-next.0", + "@svitejs/changesets-changelog-github-compact": "^1.2.0", + "@types/node": "^24.5.1", + "@vitejs/plugin-react": "catalog:", + "@vitest/browser": "^4.0.16", + "@vitest/browser-playwright": "^4.0.16", + "@vitest/coverage-v8": "^4.0.16", "@wagmi/test": "workspace:*", - "bun": "^1.1.29", - "happy-dom": "^15.7.4", - "knip": "^5.30.6", - "prool": "^0.0.23", + "happy-dom": "^20.0.0", + "knip": "^5.69.0", + "playwright": "1.56.1", + "prool": "^0.2.2", "publint": "^0.2.11", + "react": "catalog:", + "react-dom": "catalog:", "sherif": "^1.0.0", "simple-git-hooks": "^2.11.1", - "typescript": "5.5.4", - "viem": "2.23.12", - "vitest": "^2.1.1" + "testcontainers": "^11.11.0", + "typescript": "^5.9.3", + "viem": "2.44.0", + "vite-plugin-react-fallback-throttle": "^0.1.1", + "vitest": "^4.0.16", + "vitest-browser-react": "^2.0.2" }, - "packageManager": "pnpm@9.11.0", - "pnpm": { - "peerDependencyRules": { - "ignoreMissing": [ - "@algolia/client-search", - "react", - "react-native", - "search-insights" - ] + "packageManager": "pnpm@10.22.0", + "devEngines": { + "runtime": { + "name": "node", + "version": "^24.5.1", + "onFail": "download" } }, - "engines": { - "node": "22.x" - }, "simple-git-hooks": { "pre-commit": "pnpm check" }, "knip": { - "ignore": ["**/templates/**", "**/hardhat.config.js"], - "ignoreBinaries": ["only-allow"], + "ignore": [ + "**/templates/**", + "**/hardhat.config.js", + "packages/**/*.bench-d.ts", + "scripts/**" + ], "ignoreWorkspaces": [ "packages/register-tests/**", "packages/test", - "playgrounds/**" + "playgrounds/**", + "site/**" ], "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"] + "ignore": [ + "test/{constants,setup,utils}.ts" + ] }, "packages/connectors": { - "entry": "src/exports/index.ts!" + "entry": "src/exports/index.ts!", + "ignoreDependencies": [ + "@base-org/account", + "@coinbase/wallet-sdk", + "@gemini-wallet/core", + "@metamask/sdk", + "@safe-global/safe-apps-provider", + "@safe-global/safe-apps-sdk", + "@wagmi/core", + "@walletconnect/ethereum-provider", + "porto" + ] }, "packages/core": { - "entry": "src/exports/{actions,chains,codegen,experimental,index,internal,query}.ts!", - "ignore": ["test/setup.ts"], - "ignoreDependencies": ["@tanstack/query-core"] + "entry": "src/exports/{actions,chains,codegen,experimental,index,internal,query,tempo}.ts!", + "ignore": [ + "test/setup.ts" + ], + "ignoreDependencies": [ + "@tanstack/query-core", + "ox" + ] }, "packages/create-wagmi": { "entry": "src/cli.ts!" }, "packages/react": { "entry": [ - "src/exports/{actions,chains,codegen,connectors,experimental,index,query}.ts!", + "src/exports/{actions,chains,codegen,connectors,experimental,index,internal,query,tempo}.ts!", "src/exports/actions/experimental.ts!" ], - "ignore": ["test/setup.ts"] + "ignore": [ + "test/setup.ts" + ] }, "packages/test": { "entry": [ - "src/{globalSetup,setup}.ts!", - "src/exports/{index,react}.ts!" + "src/setup.ts!", + "src/setup.global.ts!", + "src/setup.global.types.ts!", + "src/exports/{index,react,tempo}.ts!", + "src/tempo/setup.ts!", + "src/tempo/setup.global.ts!" ] }, "packages/vue": { "entry": [ - "src/exports/{actions,chains,connectors,index,nuxt,query}.ts!", + "src/exports/{actions,chains,connectors,index,internal,nuxt,query}.ts!", "src/exports/actions/experimental.ts!" ], - "ignore": ["src/nuxt/runtime/*", "test/setup.ts"], - "ignoreDependencies": ["nuxt"] - }, - "site": { - "project": ["**/*.ts", "**/*.tsx"] + "ignore": [ + "src/nuxt/runtime/*", + "test/setup.ts" + ], + "ignoreDependencies": [ + "nuxt" + ] } } } diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 07c2aa5825..dc0bb61ddd 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,65 @@ # @wagmi/cli +## 2.8.0 + +### Minor Changes + +- Added option to React plugin to disable generating hooks for each function/event in ABI. ([#4866](https://github.com/wevm/wagmi/pull/4866)) + +## 2.7.1 + +### Patch Changes + +- Bumped chains for block explorer plugins. ([`ed2d473`](https://github.com/wevm/wagmi/commit/ed2d473172e8d063f29400b8edcec33e5d21a659)) + +## 2.7.0 + +### Minor Changes + +- Updated block explorer plugins supported chains. ([#4830](https://github.com/wevm/wagmi/pull/4830)) + +## 2.6.0 + +### Minor Changes + +- Bumped internal deps. ([#4808](https://github.com/wevm/wagmi/pull/4808)) + +## 2.5.1 + +### Patch Changes + +- [#4773](https://github.com/wevm/wagmi/pull/4773) [`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8) Thanks [@tmm](https://github.com/tmm)! - Fixed issue with codegen actions/hooks, where `syncConnectedChain: false` did not work as intended. + +## 2.5.0 + +### Minor Changes + +- [`1edb09f7b69da3d7819d0e070e875e2c6fe8015d`](https://github.com/wevm/wagmi/commit/1edb09f7b69da3d7819d0e070e875e2c6fe8015d) Thanks [@tmm](https://github.com/tmm)! - Added testnets to `routescan` plugin + +## 2.4.0 + +### Minor Changes + +- [#4757](https://github.com/wevm/wagmi/pull/4757) [`aec8a61ef0dfe02421d514bd130505ec13f8d3a0`](https://github.com/wevm/wagmi/commit/aec8a61ef0dfe02421d514bd130505ec13f8d3a0) Thanks [@tmm](https://github.com/tmm)! - Added Routescan plugin. + +## 2.3.2 + +### Patch Changes + +- [#4727](https://github.com/wevm/wagmi/pull/4727) [`910e6c6180bd632e65bad348bd0814de5a8cfa4b`](https://github.com/wevm/wagmi/commit/910e6c6180bd632e65bad348bd0814de5a8cfa4b) Thanks [@reallesee](https://github.com/reallesee)! - `fetch` plugin: cleared timeout on fetch error + +## 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 diff --git a/packages/cli/package.json b/packages/cli/package.json index 88fb1e82cc..35e8a2b378 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@wagmi/cli", "description": "Manage and generate code from Ethereum ABIs", - "version": "2.2.1", + "version": "2.8.0", "license": "MIT", "repository": { "type": "git", @@ -9,7 +9,7 @@ "directory": "packages/cli" }, "scripts": { - "build": "pnpm run clean && pnpm run build:esm+types", + "build": "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", @@ -50,12 +50,16 @@ }, "typesVersions": { "*": { - "config": ["./dist/types/exports/config.d.ts"], - "plugins": ["./dist/types/exports/plugins.d.ts"] + "config": [ + "./dist/types/exports/config.d.ts" + ], + "plugins": [ + "./dist/types/exports/plugins.d.ts" + ] } }, "peerDependencies": { - "typescript": ">=5.0.4" + "typescript": ">=5.7.3" }, "peerDependenciesMeta": { "typescript": { @@ -63,15 +67,15 @@ } }, "dependencies": { - "abitype": "^1.0.4", - "bundle-require": "^4.0.2", + "abitype": "^1.1.1", + "bundle-require": "^5.1.0", "cac": "^6.7.14", "change-case": "^5.4.4", "chokidar": "4.0.1", "dedent": "^0.7.0", "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", - "esbuild": "^0.19.0", + "esbuild": "~0.25.4", "escalade": "3.2.0", "fdir": "^6.1.1", "nanospinner": "1.2.2", @@ -80,15 +84,26 @@ "picomatch": "^3.0.0", "prettier": "^3.0.3", "viem": "2.x", - "zod": "^3.22.2" + "zod": "^4.1.11" }, "devDependencies": { "@types/dedent": "^0.7.2", - "@types/node": "^20.12.10", + "@types/node": "^24.5.1", "fixturez": "^1.1.0", "msw": "^2.4.9" }, - "contributors": ["awkweb.eth ", "jxom.eth "], + "contributors": [ + "awkweb.eth ", + "jxom.eth " + ], "funding": "https://github.com/sponsors/wevm", - "keywords": ["wagmi", "eth", "ethereum", "dapps", "wallet", "web3", "cli"] + "keywords": [ + "wagmi", + "eth", + "ethereum", + "dapps", + "wallet", + "web3", + "cli" + ] } diff --git a/packages/cli/src/commands/generate.test.ts b/packages/cli/src/commands/generate.test.ts index 91e4265216..ccebce18d9 100644 --- a/packages/cli/src/commands/generate.test.ts +++ b/packages/cli/src/commands/generate.test.ts @@ -169,7 +169,7 @@ test('behavior: invalid cli options', async () => { }), ).rejects.toThrowErrorMatchingInlineSnapshot(` [Error: Invalid option - - Expected string, received number at \`config\`] + - Invalid input: expected string, received number at \`config\`] `) }) @@ -334,7 +334,7 @@ test('behavior: throws when address is invalid', async () => { await expect(generate()).rejects.toThrowErrorMatchingInlineSnapshot(` [Error: Invalid address for contract "Foo" - - Invalid address] + - Invalid input] `) }) diff --git a/packages/cli/src/commands/generate.ts b/packages/cli/src/commands/generate.ts index 5e1f5a2a1a..992a2e2923 100644 --- a/packages/cli/src/commands/generate.ts +++ b/packages/cli/src/commands/generate.ts @@ -1,5 +1,4 @@ import { mkdir, writeFile } from 'node:fs/promises' -import type { Abi } from 'abitype' import { Abi as AbiSchema } from 'abitype/zod' import { camelCase } from 'change-case' import type { ChokidarOptions, FSWatcher } from 'chokidar' @@ -7,7 +6,7 @@ import { watch } from 'chokidar' import { default as dedent } from 'dedent' import { basename, dirname, resolve } from 'pathe' import pc from 'picocolors' -import { type Address, getAddress } from 'viem' +import { type Abi, type Address, getAddress } from 'viem' import { z } from 'zod' import type { Contract, ContractConfig, Plugin, Watch } from '../config.js' diff --git a/packages/cli/src/config.ts b/packages/cli/src/config.ts index 94c54d7c41..146a1e3424 100644 --- a/packages/cli/src/config.ts +++ b/packages/cli/src/config.ts @@ -1,5 +1,4 @@ -import type { Abi } from 'abitype' -import type { Address } from 'viem' +import type { Abi, Address } from 'viem' import type { Compute, MaybeArray, MaybePromise } from './types.js' diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index 6ef37093fc..7f87212220 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -1,12 +1,12 @@ -import type { z } from 'zod' +import type * as z from 'zod' class ValidationError extends Error { - details: Zod.ZodIssue[] + details: z.core.$ZodIssue[] constructor( message: string, options: { - details: Zod.ZodIssue[] + details: z.core.$ZodIssue[] }, ) { super(message) @@ -29,15 +29,15 @@ export function fromZodError( prefix?: string } = {}, ): ValidationError { - function joinPath(arr: Array): string { + function joinPath(arr: Array): string { return arr.reduce((acc, value) => { if (typeof value === 'number') return `${acc}[${value}]` const separator = acc === '' ? '' : '.' - return acc + separator + value + return acc + separator + value.toString() }, '') } - const reason = zError.errors + const reason = zError.issues // limit max number of issues printed in the reason section .slice(0, maxIssuesInMessage) // format error message @@ -52,6 +52,6 @@ export function fromZodError( const message = reason ? [prefix, reason].join(prefixSeparator) : prefix return new ValidationError(message, { - details: zError.errors, + details: zError.issues, }) } diff --git a/packages/cli/src/exports/config.test.ts b/packages/cli/src/exports/config.test.ts index c833780ffc..f8154635b2 100644 --- a/packages/cli/src/exports/config.test.ts +++ b/packages/cli/src/exports/config.test.ts @@ -5,8 +5,8 @@ import * as Exports from './config.js' test('exports', () => { expect(Object.keys(Exports)).toMatchInlineSnapshot(` [ - "defineConfig", "defaultConfig", + "defineConfig", ] `) }) diff --git a/packages/cli/src/exports/config.ts b/packages/cli/src/exports/config.ts index b3c4a83ba4..6dea251a10 100644 --- a/packages/cli/src/exports/config.ts +++ b/packages/cli/src/exports/config.ts @@ -1,10 +1,10 @@ // biome-ignore lint/performance/noBarrelFile: entrypoint module export { - type ContractConfig, - type Contract, - type Watch, - type Plugin, type Config, - defineConfig, + type Contract, + type ContractConfig, defaultConfig, + defineConfig, + type Plugin, + type Watch, } from '../config.js' diff --git a/packages/cli/src/exports/index.ts b/packages/cli/src/exports/index.ts index 1c5e624df6..4ab9b10ab3 100644 --- a/packages/cli/src/exports/index.ts +++ b/packages/cli/src/exports/index.ts @@ -1,8 +1,8 @@ // biome-ignore lint/performance/noBarrelFile: entrypoint module export { - defineConfig, type Config, type ContractConfig, + defineConfig, type Plugin, } from '../config.js' diff --git a/packages/cli/src/exports/plugins.test.ts b/packages/cli/src/exports/plugins.test.ts index 4d7b5a97cd..e8d8e5a5fe 100644 --- a/packages/cli/src/exports/plugins.test.ts +++ b/packages/cli/src/exports/plugins.test.ts @@ -14,6 +14,7 @@ test('exports', () => { "hardhat", "hardhatDefaultExcludes", "react", + "routescan", "sourcify", ] `) diff --git a/packages/cli/src/exports/plugins.ts b/packages/cli/src/exports/plugins.ts index a289b5c576..baeef622cb 100644 --- a/packages/cli/src/exports/plugins.ts +++ b/packages/cli/src/exports/plugins.ts @@ -1,27 +1,29 @@ // biome-ignore lint/performance/noBarrelFile: entrypoint module -export { actions, type ActionsConfig } from '../plugins/actions.js' +export { type ActionsConfig, actions } from '../plugins/actions.js' export { - blockExplorer, type BlockExplorerConfig, + blockExplorer, } from '../plugins/blockExplorer.js' -export { etherscan, type EtherscanConfig } from '../plugins/etherscan.js' +export { type EtherscanConfig, etherscan } from '../plugins/etherscan.js' -export { fetch, type FetchConfig } from '../plugins/fetch.js' +export { type FetchConfig, fetch } from '../plugins/fetch.js' export { + type FoundryConfig, foundry, foundryDefaultExcludes, - type FoundryConfig, } from '../plugins/foundry.js' export { + type HardhatConfig, hardhat, hardhatDefaultExcludes, - type HardhatConfig, } from '../plugins/hardhat.js' -export { react, type ReactConfig } from '../plugins/react.js' +export { type ReactConfig, react } from '../plugins/react.js' + +export { type RoutescanConfig, routescan } from '../plugins/routescan.js' -export { sourcify, type SourcifyConfig } from '../plugins/sourcify.js' +export { type SourcifyConfig, sourcify } from '../plugins/sourcify.js' diff --git a/packages/cli/src/logger.ts b/packages/cli/src/logger.ts index b56fb9728b..758eb16ed5 100644 --- a/packages/cli/src/logger.ts +++ b/packages/cli/src/logger.ts @@ -9,24 +9,25 @@ function format(args: any[]) { } 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[]) { + // biome-ignore lint/suspicious/noConsole: logger 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[]) { + // biome-ignore lint/suspicious/noConsole: logger console.warn(pc.yellow(format(args))) } export function error(...args: any[]) { + // biome-ignore lint/suspicious/noConsole: logger console.error(pc.red(format(args))) } diff --git a/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js b/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js index c8126eedfa..2ff4f7cbae 100644 --- a/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js +++ b/packages/cli/src/plugins/__fixtures__/hardhat/hardhat.config.js @@ -1,3 +1,5 @@ -module.exports = { +import { defineConfig } from 'hardhat/config' + +export default defineConfig({ solidity: '0.8.17', -} +}) diff --git a/packages/cli/src/plugins/__fixtures__/hardhat/package.json b/packages/cli/src/plugins/__fixtures__/hardhat/package.json index 85c9ffb7bd..e3385bb9cc 100644 --- a/packages/cli/src/plugins/__fixtures__/hardhat/package.json +++ b/packages/cli/src/plugins/__fixtures__/hardhat/package.json @@ -1,7 +1,8 @@ { "name": "hardhat-fixture", "private": true, + "type": "module", "devDependencies": { - "hardhat": "^2.22.3" + "hardhat": "^3.0.0" } } diff --git a/packages/cli/src/plugins/__snapshots__/routescan.test.ts.snap b/packages/cli/src/plugins/__snapshots__/routescan.test.ts.snap new file mode 100644 index 0000000000..e03ee30f81 --- /dev/null +++ b/packages/cli/src/plugins/__snapshots__/routescan.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/packages/cli/src/plugins/blockExplorer.test.ts b/packages/cli/src/plugins/blockExplorer.test.ts index 13372f53ec..83e9ce98d5 100644 --- a/packages/cli/src/plugins/blockExplorer.test.ts +++ b/packages/cli/src/plugins/blockExplorer.test.ts @@ -4,13 +4,13 @@ import { afterAll, afterEach, beforeAll, expect, test } from 'vitest' import { address, apiKey, - baseUrl, - handlers, + getHandlers, unverifiedContractAddress, } from '../../test/utils.js' import { blockExplorer } from './blockExplorer.js' -const server = setupServer(...handlers) +const baseUrl = 'https://api.etherscan.io/v2/api' +const server = setupServer(...getHandlers(baseUrl)) beforeAll(() => server.listen()) afterEach(() => server.resetHandlers()) diff --git a/packages/cli/src/plugins/blockExplorer.ts b/packages/cli/src/plugins/blockExplorer.ts index 2518b6e936..907f072908 100644 --- a/packages/cli/src/plugins/blockExplorer.ts +++ b/packages/cli/src/plugins/blockExplorer.ts @@ -34,9 +34,7 @@ export type BlockExplorerConfig = { * Function to get address from contract config. */ getAddress?: - | ((config: { - address: NonNullable - }) => Address) + | ((config: { address: NonNullable }) => Address) | undefined /** * Name of source. diff --git a/packages/cli/src/plugins/etherscan.test.ts b/packages/cli/src/plugins/etherscan.test.ts index dc496f4630..9dc31496bd 100644 --- a/packages/cli/src/plugins/etherscan.test.ts +++ b/packages/cli/src/plugins/etherscan.test.ts @@ -5,7 +5,7 @@ import { afterAll, afterEach, beforeAll, expect, test } from 'vitest' import { address, apiKey, - handlers, + getHandlers, invalidApiKey, proxyAddress, timeoutAddress, @@ -14,7 +14,7 @@ import { import { etherscan } from './etherscan.js' import { getCacheDir } from './fetch.js' -const server = setupServer(...handlers) +const server = setupServer(...getHandlers()) beforeAll(() => server.listen()) afterEach(() => server.resetHandlers()) diff --git a/packages/cli/src/plugins/etherscan.ts b/packages/cli/src/plugins/etherscan.ts index fdd344c3b5..4a00b5aeb0 100644 --- a/packages/cli/src/plugins/etherscan.ts +++ b/packages/cli/src/plugins/etherscan.ts @@ -1,9 +1,8 @@ import { mkdir, writeFile } from 'node:fs/promises' -import type { Abi } from 'abitype' import { Address as AddressSchema } from 'abitype/zod' import { camelCase } from 'change-case' import { join } from 'pathe' -import type { Address } from 'viem' +import type { Abi, Address } from 'viem' import { z } from 'zod' import type { ContractConfig } from '../config.js' @@ -199,12 +198,11 @@ 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 @@ -212,8 +210,6 @@ type ChainId = | 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 @@ -221,17 +217,16 @@ type ChainId = | 43114 // Avalanche C-Chain | 43113 // Avalanche Fuji Testnet | 199 // BitTorrent Chain Mainnet - | 1028 // BitTorrent Chain Testnet + | 1029 // BitTorrent Chain Testnet | 42220 // Celo Mainnet - | 44787 // Celo Alfajores Testnet + | 11142220 // Celo Sepolia 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 + | 43521 // Memecore Testnet | 1284 // Moonbeam Mainnet | 1285 // Moonriver Mainnet | 1287 // Moonbase Alpha Testnet @@ -240,13 +235,9 @@ type ChainId = | 534352 // Scroll Mainnet | 534351 // Scroll Sepolia Testnet | 167000 // Taiko Mainnet - | 167009 // Taiko Hekla L2 Testnet - | 1111 // WEMIX3.0 Mainnet - | 1112 // WEMIX3.0 Testnet + | 167012 // Taiko Hoodi | 324 // zkSync Mainnet | 300 // zkSync Sepolia Testnet - | 660279 // Xai Mainnet - | 37714555429 // Xai Sepolia Testnet | 50 // XDC Mainnet | 51 // XDC Apothem Testnet | 33139 // ApeChain Mainnet @@ -256,9 +247,18 @@ type ChainId = | 50104 // Sophon Mainnet | 531050104 // Sophon Sepolia Testnet | 146 // Sonic Mainnet - | 57054 // Sonic Blaze Testnet + | 14601 // Sonic 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 + | 999 // HyperEVM Mainnet + | 747474 // Katana Mainnet + | 737373 // Katana Bokuto + | 1329 // Sei Mainnet + | 1328 // Sei Testnet diff --git a/packages/cli/src/plugins/fetch.test.ts b/packages/cli/src/plugins/fetch.test.ts index 600cbfeda7..937a03f50a 100644 --- a/packages/cli/src/plugins/fetch.test.ts +++ b/packages/cli/src/plugins/fetch.test.ts @@ -6,14 +6,14 @@ import { afterAll, afterEach, beforeAll, expect, test } from 'vitest' import { address, apiKey, - baseUrl, - handlers, + getHandlers, timeoutAddress, unverifiedContractAddress, } from '../../test/utils.js' import { fetch, getCacheDir } from './fetch.js' -const server = setupServer(...handlers) +const baseUrl = 'https://api.etherscan.io/v2/api' +const server = setupServer(...getHandlers(baseUrl)) beforeAll(() => server.listen()) afterEach(() => server.resetHandlers()) diff --git a/packages/cli/src/plugins/fetch.ts b/packages/cli/src/plugins/fetch.ts index 9e6b737e09..99502dd7b6 100644 --- a/packages/cli/src/plugins/fetch.ts +++ b/packages/cli/src/plugins/fetch.ts @@ -2,7 +2,7 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises' import { homedir } from 'node:os' import { join } from 'pathe' -import type { Abi } from 'abitype' +import type { Abi } from 'viem' import type { ContractConfig, Plugin } from '../config.js' import type { Compute, RequiredBy } from '../types.js' @@ -85,13 +85,9 @@ export function fetch(config: FetchConfig): FetchResult { let abi: Abi | undefined if (cachedFile?.timestamp > Date.now()) abi = cachedFile.abi else { + const controller = new globalThis.AbortController() + const timeout = setTimeout(() => controller.abort(), timeoutDuration) 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, @@ -105,6 +101,7 @@ export function fetch(config: FetchConfig): FetchResult { `${JSON.stringify({ abi, timestamp }, undefined, 2)}\n`, ) } catch (error) { + clearTimeout(timeout) try { // Attempt to read from cache if fetch fails. abi = JSON.parse(await readFile(cacheFilePath, 'utf8')).abi diff --git a/packages/cli/src/plugins/foundry.test.ts b/packages/cli/src/plugins/foundry.test.ts index 75e5ec73ee..9bc794a059 100644 --- a/packages/cli/src/plugins/foundry.test.ts +++ b/packages/cli/src/plugins/foundry.test.ts @@ -12,7 +12,7 @@ afterEach(() => { test('forge not installed', async () => { const dir = f.temp() - expect( + await expect( foundry({ project: dir, forge: { diff --git a/packages/cli/src/plugins/hardhat.test.ts b/packages/cli/src/plugins/hardhat.test.ts index efb416c5e6..108b25abde 100644 --- a/packages/cli/src/plugins/hardhat.test.ts +++ b/packages/cli/src/plugins/hardhat.test.ts @@ -12,7 +12,7 @@ afterEach(() => { test('validate', async () => { const temp = f.temp() - expect( + await expect( hardhat({ project: temp }).validate?.(), ).rejects.toThrowErrorMatchingInlineSnapshot( '[Error: hardhat must be installed to use Hardhat plugin.]', @@ -34,7 +34,7 @@ test('project does not exist', async () => { }) test('contracts', async () => { - expect( + await expect( hardhat({ project: resolve(__dirname, '__fixtures__/hardhat/'), exclude: ['Foo.sol/**'], diff --git a/packages/cli/src/plugins/react.test.ts b/packages/cli/src/plugins/react.test.ts index 939a5299ae..e693e5fa20 100644 --- a/packages/cli/src/plugins/react.test.ts +++ b/packages/cli/src/plugins/react.test.ts @@ -335,3 +335,46 @@ test('legacy hook names', async () => { export const useErc20TransferEvent = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi, address: erc20Address, eventName: 'Transfer' })" `) }) + +test('abi item hooks disabled', async () => { + const result = await react({ abiItemHooks: false }).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 useWriteContract}__ with \`abi\` set to __{@link erc20Abi}__ + */ + export const useWriteErc20 = /*#__PURE__*/ createUseWriteContract({ abi: erc20Abi }) + + /** + * Wraps __{@link useSimulateContract}__ with \`abi\` set to __{@link erc20Abi}__ + */ + export const useSimulateErc20 = /*#__PURE__*/ createUseSimulateContract({ abi: erc20Abi }) + + /** + * Wraps __{@link useWatchContractEvent}__ with \`abi\` set to __{@link erc20Abi}__ + */ + export const useWatchErc20Event = /*#__PURE__*/ createUseWatchContractEvent({ abi: erc20Abi })" + `) +}) diff --git a/packages/cli/src/plugins/react.ts b/packages/cli/src/plugins/react.ts index b76ea006a5..dfe41fffb3 100644 --- a/packages/cli/src/plugins/react.ts +++ b/packages/cli/src/plugins/react.ts @@ -4,15 +4,23 @@ 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}`) -} +export type ReactConfig = Compute< + { + abiItemHooks?: boolean | undefined + } & ( + | { + /** @deprecated */ + getHookName: 'legacy' + } + | { + getHookName?: (options: { + contractName: string + itemName?: string | undefined + type: 'read' | 'simulate' | 'watch' | 'write' + }) => `use${string}` + } + ) +> type ReactResult = Compute> @@ -25,6 +33,8 @@ export function react(config: ReactConfig = {}): ReactResult { const pure = '/*#__PURE__*/' const hookNames = new Set() + const isAbiItemHooksEnabled = config.abiItemHooks ?? true + for (const contract of contracts) { let hasReadFunction = false let hasWriteFunction = false @@ -65,34 +75,36 @@ export function react(config: ReactConfig = {}): ReactResult { 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 + if (isAbiItemHooksEnabled) { + 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) + // 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} + 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}' })`, - ) + ) + } } } @@ -112,34 +124,36 @@ export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionNa 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 + if (isAbiItemHooksEnabled) { + 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) + // 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} + 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}' })`, - ) + ) + } } } @@ -158,34 +172,40 @@ export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionNa 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 + if (isAbiItemHooksEnabled) { + 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) + // 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} + 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}' })`, - ) + ) + } } } } @@ -205,29 +225,35 @@ export const ${hookName} = ${pure} ${functionName}({ ${innerContent}, functionNa export const ${hookName} = ${pure} ${functionName}({ ${innerContent} })`, ) - const names = new Set() - for (const item of eventItems) { - if (item.type !== 'event') continue + if (isAbiItemHooksEnabled) { + 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) + // 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} + 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}' })`, - ) + ) + } } } } diff --git a/packages/cli/src/plugins/routescan.test.ts b/packages/cli/src/plugins/routescan.test.ts new file mode 100644 index 0000000000..28cdc1323c --- /dev/null +++ b/packages/cli/src/plugins/routescan.test.ts @@ -0,0 +1,116 @@ +import { mkdir, rm } from 'node:fs/promises' +import { setupServer } from 'msw/node' +import { afterAll, afterEach, beforeAll, expect, test } from 'vitest' + +import { + address, + apiKey, + getHandlers, + invalidApiKey, + proxyAddress, + timeoutAddress, + unverifiedContractAddress, +} from '../../test/utils.js' +import { getCacheDir } from './fetch.js' +import { routescan } from './routescan.js' + +const server = setupServer( + ...getHandlers( + 'https://api.routescan.io/v2/network/mainnet/evm/1/etherscan/api', + ), +) + +beforeAll(() => server.listen()) +afterEach(() => server.resetHandlers()) +afterAll(() => server.close()) + +test('fetches ABI', async () => { + await expect( + routescan({ + apiKey, + chainId: 1, + contracts: [{ name: 'WagmiMintExample', address }], + }).contracts?.(), + ).resolves.toMatchSnapshot() +}) + +test('fetches ABI with multichain deployment', async () => { + await expect( + routescan({ + apiKey, + chainId: 1, + contracts: [ + { name: 'WagmiMintExample', address: { 1: address, 10: address } }, + ], + }).contracts?.(), + ).resolves.toMatchSnapshot() +}) + +test('fails to fetch for unverified contract', async () => { + await expect( + routescan({ + 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( + routescan({ + 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( + routescan({ + 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( + routescan({ + 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( + routescan({ + apiKey, + chainId: 1, + contracts: [{ name: 'FiatToken', address: proxyAddress }], + tryFetchProxyImplementation: true, + }).contracts?.(), + ).resolves.toMatchSnapshot() + + await rm(cacheDir, { recursive: true }) +}) diff --git a/packages/cli/src/plugins/routescan.ts b/packages/cli/src/plugins/routescan.ts new file mode 100644 index 0000000000..0d2419c61d --- /dev/null +++ b/packages/cli/src/plugins/routescan.ts @@ -0,0 +1,354 @@ +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 RoutescanConfig = { + /** + * Routescan API key. + */ + 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. + */ + 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 Routescan. + */ +export function routescan( + config: RoutescanConfig, +) { + 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 = 'Routescan' + + 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 { action, address, apiKey, chainId } = options + const baseUrl = `https://api.routescan.io/v2/network/mainnet/evm/${chainId}/etherscan/api` + return `${baseUrl}?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 +type ChainId = + | 1 // Ethereum + | 10 // OP Mainnet + | 14 // Flare Mainnet + | 16 // Coston + | 19 // Songbird Canary + | 56 // BNB Smart Chain + | 114 // Coston2 + | 130 // Unichain + | 151 // Redbelly + | 166 // Nomina + | 185 // Mint + | 252 // Fraxtal + | 254 // Swan chain + | 288 // Boba Ethereum + | 291 // Orderly + | 324 // zkSync Era + | 335 // DFK + | 357 // Pulsar + | 369 // Pulse Chain + | 919 // Mode + | 1301 // Unichain + | 1687 // Mint Sepolia + | 1946 // Minato + | 2037 // Kiwi + | 2233 // Chainbase + | 2522 // Fraxtal + | 3012 // PLAYA3ULL Games + | 3636 // Botanix + | 3939 // DOS + | 4202 // Lisk + | 4460 // Orderly + | 10888 // GameSwift + | 17000 // Holesky + | 28882 // Boba Sepolia + | 48795 // Space + | 49321 // GUNZ + | 70800 // Barret + | 80008 // Polynomial Sepolia + | 80085 // Artio Testnet + | 84532 // Base Sepolia + | 88882 // Chiliz Spicy + | 167008 // Taiko Katla + | 167009 // Taiko Hekla + | 173750 // Echo + | 421614 // Arbitrum Sepolia + | 555666 // Eclipse + | 763373 // Ink + | 779672 // Dispatch + | 11155111 // Sepolia + | 11155420 // OP Sepolia + | 20241133 // Proxima + | 21000001 // Corn + | 168587773 // Blast Sepolia + | 999999999 // Zora Sepolia + | 164_4 // Nomina + | 153_2 // Redbelly + | 70805_2 // Cloud + | 378 // Koroshi + | 379 // KOROSHI + | 987 // Orange + | 999 // Hyperliquid EVM + | 1088 // Metis + | 1135 // Lisk + | 1216 // Intersect + | 1234 // StepNetwork + | 1344 // Blitz + | 1853 // HighOctane + | 1888 // Memoria + | 1923 // Swell + | 2038 // Shrapnel + | 2044 // Shrapnel + | 2786 // Apertum + | 2818 // Morph + | 3011 // PLAYA3ULL Games + | 3084 // XL Network + | 3278 // Soshi + | 3637 // Botanix + | 4227 // Hashfire + | 4313 // Artery + | 4337 // Beam + | 5000 // Mantle + | 5039 // Onigiri + | 5040 // Onigiri + | 5115 // Citrea + | 5330 // Superseed + | 5566 // StraitsX + | 6119 // UPTN + | 6533 // Kalichain + | 6900 // Nibiru + | 6911 // Nibiru Testnet-2 + | 7894 // Mintus + | 7979 // DOS + | 8008 // Polynomial + | 8021 // Numine + | 8227 // Space + | 8453 // Base + | 8787 // Animalia + | 9745 // Plasma + | 10036 // Innovo + | 10507 // Numbers + | 10849 // Lamina1 + | 10850 // Lamina1 Identity + | 11227 // Jiritsutes + | 12150 // QChain + | 13322 // Fifa Blockchain + | 13337 // Beam + | 13576 // Mythgames + | 14174 // Pecorino + | 16180 // Plyr + | 21024 // Tradex + | 21816 // Frqtal + | 24010 // Stealthnet + | 27827 // Zeroone + | 28530 // Blockticity + | 33311 // Feature + | 34443 // Mode + | 42161 // Arbitrum One + | 43113 // C-Chain Fuji + | 43114 // C-Chain + | 43419 // GUNZ + | 47208 // Armada + | 53188 // DSRV2 + | 53302 // Superseed + | 53935 // DFK + | 54414 // Innovomark + | 55197 // Egmtester + | 56288 // Boba BNB + | 56400 // Zeroone + | 57073 // Ink + | 59409 // Lifeaiv1 + | 59932 // Insomnia + | 61587 // Growth + | 62521 // Lucid + | 62831 // Plyr + | 68414 // Henesys + | 69696 // Ceden + | 76736 // Hiss + | 79554 // Lucid + | 79685 // Modex + | 80069 // Berachain bepolia + | 80094 // Berachain + | 81457 // Blast + | 84358 // Titan + | 88888 // Chiliz + | 96786 // Delaunch + | 97433 // Growth + | 124816 // Mitosis + | 132008 // BitcoinL1 + | 167000 // Taiko + | 210815 // Stavax + | 432201 // Dexalot + | 432204 // Dexalot + | 560048 // Hoodi + | 710420 // Tiltyard + | 723107 // Tixchain + | 5278000 // JSC Kaigan + | 7777777 // Zora + | 21000000 // Corn + | 420120000 // Alpha 0 + | 420120001 // Alpha 1 + | 420420421 // Westend + | 9746_5 // Plasma diff --git a/packages/cli/src/plugins/sourcify.test.ts b/packages/cli/src/plugins/sourcify.test.ts index b5ebb104c1..6ca0ecb536 100644 --- a/packages/cli/src/plugins/sourcify.test.ts +++ b/packages/cli/src/plugins/sourcify.test.ts @@ -1,43 +1,32 @@ -import { http, HttpResponse } from 'msw' +import { HttpResponse, http } 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://repo.sourcify.dev/contracts/full_match' +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 = { - compiler: { version: '0.6.11+commit.5ef660b1' }, - language: 'Solidity', - output: { - abi: depositAbi, - devdoc: {}, - userdoc: {}, - }, - settings: {}, - sources: {}, - version: 1, + abi: depositAbi, } const handlers = [ - http.get(`${baseUrl}/${chainId}/${address}/metadata.json`, () => + http.get(`${baseUrl}/${chainId}/${address}`, () => HttpResponse.json(successJson), ), - http.get(`${baseUrl}/${multichainIdGnosis}/${address}/metadata.json`, () => + http.get(`${baseUrl}/${multichainIdGnosis}/${address}`, () => HttpResponse.json({}, { status: 404 }), ), - http.get( - `${baseUrl}/${multichainIdGnosis}/${multichainAddress}/metadata.json`, - () => HttpResponse.json(successJson), + http.get(`${baseUrl}/${multichainIdGnosis}/${multichainAddress}`, () => + HttpResponse.json(successJson), ), - http.get( - `${baseUrl}/${multichainIdPolygon}/${multichainAddress}/metadata.json`, - () => HttpResponse.json(successJson), + http.get(`${baseUrl}/${multichainIdPolygon}/${multichainAddress}`, () => + HttpResponse.json(successJson), ), ] @@ -47,8 +36,8 @@ beforeAll(() => server.listen()) afterEach(() => server.resetHandlers()) afterAll(() => server.close()) -test('fetches ABI', () => { - expect( +test('fetches ABI', async () => { + await expect( sourcify({ chainId: chainId, contracts: [{ name: 'DepositContract', address }], @@ -56,8 +45,8 @@ test('fetches ABI', () => { ).resolves.toMatchSnapshot() }) -test('fetches ABI with multichain deployment', () => { - expect( +test('fetches ABI with multichain deployment', async () => { + await expect( sourcify({ chainId: 100, contracts: [ @@ -70,8 +59,8 @@ test('fetches ABI with multichain deployment', () => { ).resolves.toMatchSnapshot() }) -test('fails to fetch for unverified contract', () => { - expect( +test('fails to fetch for unverified contract', async () => { + await expect( sourcify({ chainId: 100, contracts: [{ name: 'DepositContract', address }], @@ -81,8 +70,8 @@ test('fails to fetch for unverified contract', () => { ) }) -test('missing address for chainId', () => { - expect( +test('missing address for chainId', async () => { + await expect( sourcify({ chainId: 1, // @ts-expect-error `chainId` and `keyof typeof contracts[number].address` mismatch diff --git a/packages/cli/src/plugins/sourcify.ts b/packages/cli/src/plugins/sourcify.ts index f53a020a3c..5c0637308a 100644 --- a/packages/cli/src/plugins/sourcify.ts +++ b/packages/cli/src/plugins/sourcify.ts @@ -29,18 +29,7 @@ export type SourcifyConfig = { } const SourcifyResponse = z.object({ - compiler: z.object({ - version: z.string(), - }), - language: z.string(), - output: z.object({ - abi: AbiSchema, - devdoc: z.any(), - userdoc: z.any(), - }), - settings: z.any(), - sources: z.any(), - version: z.number(), + abi: AbiSchema, }) /** Fetches contract ABIs from Sourcify. */ @@ -67,8 +56,7 @@ export function sourcify( if (!parsed.success) throw fromZodError(parsed.error, { prefix: 'Invalid response' }) - if (parsed.data.output.abi) - return parsed.data.output.abi as ContractConfig['abi'] + if (parsed.data.abi) return parsed.data.abi as ContractConfig['abi'] throw new Error('contract not found') }, request({ address }) { @@ -82,9 +70,8 @@ export function sourcify( throw new Error( `No address found for chainId "${chainId}". Make sure chainId "${chainId}" is set as an address.`, ) - return { - url: `https://repo.sourcify.dev/contracts/full_match/${chainId}/${contractAddress}/metadata.json`, + url: `https://sourcify.dev/server/v2/contract/${chainId}/${contractAddress}?fields=abi`, } }, }) @@ -94,231 +81,247 @@ export function sourcify( // https://docs.sourcify.dev/docs/chains type ChainId = | 1 // Ethereum Mainnet + | 560048 // Ethereum Testnet Hoodi + | 11155111 // Ethereum Testnet Sepolia | 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 + | 96969696 // Privix Chain Testnet + | 180 // AME Chain Mainnet + | 78430 // Amplify Subnet + | 1339 // Elysium Mainnet + | 421613 // Arbitrum Goerli + | 42170 // Arbitrum Nova + | 42161 // Arbitrum One + | 421614 // Arbitrum Sepolia + | 421611 // Arbitrum Rinkeby | 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 + | 592 // Astar + | 6321 // Aura Euphoria Testnet + | 6322 // Aura Mainnet | 1313161554 // Aurora Mainnet | 1313161555 // Aurora Testnet + | 43114 // Avalanche C-Chain + | 43113 // Avalanche Fuji Testnet + | 223 // B2 Mainnet + | 56 // BNB Smart Chain Mainnet + | 97 // BNB Smart Chain Testnet + | 8453 // Base + | 84531 // Base Goerli Testnet + | 84532 // Base Sepolia Testnet + | 4337 // Beam | 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 + | 641230 // Bear Network Chain Mainnet | 200901 // Bitlayer Mainnet - | 2017 // Adiri - | 2020 // Ronin Mainnet + | 200810 // Bitlayer Testnet + | 7171 // Bitrock Mainnet + | 7771 // Bitrock Testnet + | 81457 // Blast + | 288 // Boba Network + | 28 // Boba Network Rinkeby Testnet + | 78431 // Bulletin Subnet + | 534 // Candle + | 7700 // Canto + | 7701 // Canto Tesnet + | 44787 // Celo Alfajores Testnet + | 62320 // Celo Baklava Testnet + | 42220 // Celo Mainnet + | 11142220 // Celo Sepolia Testnet + | 5115 // Citrea Testnet + | 78432 // Conduit Subnet + | 1030 // Conflux eSpace + | 1116 // Core Blockchain Mainnet + | 1115 // Core Blockchain Testnet + | 1114 // Core Blockchain Testnet2 + | 21000000 // Corn + | 44 // Crab Network + | 25 // Cronos Mainnet + | 4157 // CrossFi Testnet + | 3737 // Crossbell + | 103090 // Crystaleum + | 33111 // Curtis + | 53935 // DFK Chain + | 335 // DFK Chain Test + | 46 // Darwinia Network + | 43 // Darwinia Pangolin Testnet + | 666666666 // Degen Chain + | 432204 // Dexalot Subnet + | 432201 // Dexalot Subnet Testnet + | 2000 // Dogechain 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 + | 648 // Endurance Smart Chain Mainnet + | 39797 // Energi Mainnet + | 49797 // Energi Testnet | 246 // Energy Web Chain - | 25 // Cronos Mainnet + | 73799 // Energy Web Volta Testnet + | 61 // Ethereum Classic + | 42793 // Etherlink Mainnet + | 128123 // Etherlink Testnet + | 9001 // Evmos + | 9000 // Evmos Testnet | 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 + | 314 // Filecoin - Mainnet + | 14 // Flare Mainnet + | 252 // Fraxtal + | 2522 // Fraxtal Testnet + | 122 // Fuse Mainnet + | 17069 // Garnet Holesky + | 486217935 // Gather Devnet Network + | 192837465 // Gather Mainnet Network | 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 + | 100 // Gnosis + | 10200 // Gnosis Chiado Testnet + | 71402 // Godwoken Mainnet + | 71401 // Godwoken Testnet v1 + | 19011 // HOME Verse Mainnet + | 216 // Happychain Testnet + | 54211 // Haqq Chain Testnet + | 11235 // Haqq Network + | 295 // Hedera Mainnet + | 16350 // Incentiv Devnet + | 96 // KUB Mainnet + | 25925 // KUB Testnet + | 1001 // Kaia Kairos Testnet + | 8217 // Kaia Mainnet + | 2222 // Kava + | 2221 // Kava Testnet | 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 - | 48899 // Zircuit Testnet - | 48900 // Zircuit Mainnet - | 49797 // Energi Testnet - | 50 // XDC Network + | 2037 // Kiwi Subnet + | 255 // Kroma + | 2358 // Kroma Sepolia + | 10849 // Lamina1 + | 10850 // Lamina1 Identity + | 767368 // Lamina1 Identity Testnet + | 764984 // Lamina1 Testnet + | 1891 // Lightlink Pegasus Testnet + | 1890 // Lightlink Phoenix Mainnet + | 59144 // Linea + | 59141 // Linea Sepolia + | 1135 // Lisk + | 957 // Lyra Chain + | 22776 // MAP Protocol + | 212 // MAPO Makalu | 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 + | 7078815900 // Mekong + | 333000333 // Meld + | 222000222 // Kanazawa + | 4200 // Merlin Mainnet + | 82 // Meter Mainnet + | 83 // Meter Testnet + | 1088 // Metis Andromeda Mainnet | 59902 // Metis Sepolia Testnet - | 61 // Ethereum Classic - | 6119 // UPTN - | 62320 // Celo Baklava Testnet + | 31612 // Mezo + | 9996 // Mind Smart Chain Mainnet + | 9977 // Mind Smart Chain Testnet + | 34443 // Mode + | 919 // Mode Testnet + | 1287 // Moonbase Alpha + | 1284 // Moonbeam + | 1285 // Moonriver | 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 + | 10 // OP Mainnet + | 11155420 // OP Sepolia Testnet + | 42262 // Oasis Emerald + | 42261 // Oasis Emerald Testnet + | 23294 // Oasis Sapphire + | 23295 // Oasis Sapphire Testnet + | 311752642 // OneLedger Mainnet + | 4216137055 // OneLedger Testnet Frankenstein + | 970 // Oort Mainnet + | 28528 // Optimism Bedrock (Goerli Alpha Testnet) + | 420 // Optimism Goerli Testnet | 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 + | 4000 // Ozone Chain Mainnet + | 16180 // PLYR PHI + | 62831 // PLYR TAU Testnet + | 99 // POA Network Core | 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 + | 11297108109 // Palm + | 11297108099 // Palm Testnet + | 13381 // Phoenix Mainnet + | 2206132 // PlatON Dev Testnet2 + | 210425 // PlatON Mainnet + | 12898 // PlayFair Testnet Subnet | 80002 // Amoy - | 82 // Meter Mainnet - | 8217 // Kaia Mainnet - | 83 // Meter Testnet - | 839999 // exSat Testnet + | 137 // Polygon Mainnet + | 80001 // Mumbai + | 1101 // Polygon zkEVM + | 2442 // Polygon zkEVM Cardona Testnet + | 16969696 // Privix Chain Mainnet + | 369 // PulseChain + | 35441 // Q Mainnet + | 35443 // Q Testnet + | 690 // Redstone + | 1433 // Rikeza Network Mainnet + | 570 // Rollux Mainnet + | 57000 // Rollux Testnet + | 2020 // Ronin Mainnet + | 30 // Rootstock Mainnet + | 534352 // Scroll + | 534351 // Scroll Sepolia Testnet + | 336 // Shiden + | 2044 // Shrapnel Subnet + | 2038 // Shrapnel Testnet + | 111000 // Siberium Test Network + | 19 // Songbird Canary-Network + | 1516 // Story Odyssey Testnet + | 105105 // Stratis Mainnet + | 205205 // Auroria Testnet + | 2048 // Stratos + | 2047 // Stratos Testnet + | 5330 // Superseed + | 1291 // Swisstronik Testnet + | 1149 // Symplexia Smart Chain + | 57 // Syscoin Mainnet + | 5700 // Syscoin Tanenbaum Testnet + | 167000 // Taiko Alethia + | 167006 // Taiko Eldfell L3 + | 167005 // Taiko Grimsvotn L2 + | 5845 // Tangle | 841 // Taraxa Mainnet | 842 // Taraxa Testnet - | 8453 // Base - | 84531 // Base Goerli Testnet - | 84532 // Base Sepolia Testnet + | 2017 // Adiri + | 40 // Telos EVM Mainnet + | 41 // Telos EVM Testnet + | 7668 // The Root Network - Mainnet + | 7672 // The Root Network - Porcini Testnet + | 710420 // Tiltyard Mainnet Subnet + | 1127469 // Tiltyard Subnet + | 723107 // TixChain Testnet + | 6119 // UPTN + | 8 // Ubiq + | 130 // Unichain + | 100009 // VeChain + | 100010 // VeChain Testnet + | 106 // Velas EVM Mainnet + | 11111 // WAGMI | 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 + | 51 // XDC Apothem Network + | 50 // XDC Network + | 660279 // Xai Mainnet + | 37714555429 // Xai Testnet v2 + | 202401 // YMTECH-BESU Testnet + | 42766 // ZKFair Mainnet + | 383414847825 // Zeniq + | 7000 // ZetaChain Mainnet + | 7001 // ZetaChain Testnet + | 32769 // Zilliqa 2 + | 32770 // Zilliqa 2 EVM proto-mainnet + | 33103 // Zilliqa 2 EVM proto-testnet + | 33101 // Zilliqa 2 Testnet + | 48898 // Zircuit Garfield Testnet + | 48900 // Zircuit Mainnet + | 48899 // Zircuit Testnet + | 7777777 // Zora | 999999999 // Zora Sepolia Testnet + | 7200 // exSat Mainnet + | 839999 // exSat Testnet + | 3338 // peaq + | 300 // zkSync Sepolia Testnet diff --git a/packages/cli/src/utils/getAddressDocString.ts b/packages/cli/src/utils/getAddressDocString.ts index d0e137928c..efe04f6b7c 100644 --- a/packages/cli/src/utils/getAddressDocString.ts +++ b/packages/cli/src/utils/getAddressDocString.ts @@ -19,23 +19,23 @@ export function getAddressDocString(parameters: { if (Object.keys(address).length === 1) return `* ${getLink({ - address: address[Number.parseInt(Object.keys(address)[0]!)]!, - chainId: Number.parseInt(Object.keys(address)[0]!), + address: address[Number.parseInt(Object.keys(address)[0]!, 10)]!, + chainId: Number.parseInt(Object.keys(address)[0]!, 10), })}` const addresses = Object.entries(address).filter( - (x) => chainMap[Number.parseInt(x[0])], + (x) => chainMap[Number.parseInt(x[0], 10)], ) if (addresses.length === 0) return '' if (addresses.length === 1 && addresses[0]) return `* ${getLink({ address: addresses[0][1], - chainId: Number.parseInt(addresses[0][0])!, + chainId: Number.parseInt(addresses[0][0], 10)!, })}` return dedent` ${addresses.reduce((prev, curr) => { - const chainId = Number.parseInt(curr[0]) + const chainId = Number.parseInt(curr[0], 10) const address = curr[1] return `${prev}\n* - ${getLink({ address, chainId })}` }, '')} diff --git a/packages/cli/src/utils/loadEnv.ts b/packages/cli/src/utils/loadEnv.ts index d7ffa99919..8a1f26c85f 100644 --- a/packages/cli/src/utils/loadEnv.ts +++ b/packages/cli/src/utils/loadEnv.ts @@ -1,15 +1,11 @@ -import { parse } from 'dotenv' -import { expand } from 'dotenv-expand' - import { existsSync, readFileSync, statSync } from 'node:fs' import { dirname, join } from 'node:path' +import { parse } from 'dotenv' +import { expand } from 'dotenv-expand' // https://github.com/vitejs/vite/blob/main/packages/vite/src/node/env.ts#L7 export function loadEnv( - config: { - mode?: string - envDir?: string - } = {}, + config: { mode?: string; envDir?: string } = {}, ): Record { const mode = config.mode if (mode === 'local') { diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index 4f138388f5..1b52c57d4e 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -1 +1 @@ -export const version = '2.2.1' +export const version = '2.8.0' diff --git a/packages/cli/test/constants.ts b/packages/cli/test/constants.ts index 6d3f243a92..9b84c5bb1b 100644 --- a/packages/cli/test/constants.ts +++ b/packages/cli/test/constants.ts @@ -1,4 +1,4 @@ -import { parseAbi } from 'abitype' +import { parseAbi } from 'viem' export const wagmiAbi = parseAbi([ 'constructor()', diff --git a/packages/cli/test/setup.ts b/packages/cli/test/setup.ts index d2eed4a5e5..4f926cab74 100644 --- a/packages/cli/test/setup.ts +++ b/packages/cli/test/setup.ts @@ -21,17 +21,16 @@ vi.mock('nanospinner', async (importOriginal) => { 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) { + // biome-ignore lint/suspicious/noConsole: logging error console.error(`× ${text}`) spinner.error(text) }, diff --git a/packages/cli/test/utils.ts b/packages/cli/test/utils.ts index 4ea6c6051e..b3e76bf8e3 100644 --- a/packages/cli/test/utils.ts +++ b/packages/cli/test/utils.ts @@ -1,7 +1,7 @@ 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 { HttpResponse, http } from 'msw' import * as path from 'pathe' import { vi } from 'vitest' @@ -19,13 +19,7 @@ export async function createFixture< TFiles extends { [filename: string]: string | Json } & { tsconfig?: true }, ->( - config: { - copyNodeModules?: boolean - dir?: string - files?: TFiles - } = {}, -) { +>(config: { copyNodeModules?: boolean; dir?: string; files?: TFiles } = {}) { const dir = config.dir ?? f.temp() await mkdir(dir, { recursive: true }) @@ -130,6 +124,7 @@ export function watchConsole() { } } return { + // biome-ignore lint/suspicious/noConsole: logging debug: console.debug, info: vi.spyOn(console, 'info').mockImplementation(handleOutput('info')), log: vi.spyOn(console, 'log').mockImplementation(handleOutput('log')), @@ -167,7 +162,6 @@ export async function typecheck(project: string) { } } -export const baseUrl = 'https://api.etherscan.io/v2/api' export const apiKey = 'abc' export const invalidApiKey = 'xyz' export const address = '0xaf0326d92b97df1221759476b072abfd8084f9be' @@ -178,115 +172,117 @@ 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&/, '?') +export function getHandlers(baseUrl = 'https://api.etherscan.io/v2/api') { + return [ + 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=${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=${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=${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=${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=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=${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: '', - }, - ], - }) + 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}`) - }), -] + throw new Error(`Unhandled request: ${search}`) + }), + ] +} diff --git a/packages/connectors/CHANGELOG.md b/packages/connectors/CHANGELOG.md index 6da26192bc..33e3572bb1 100644 --- a/packages/connectors/CHANGELOG.md +++ b/packages/connectors/CHANGELOG.md @@ -1,5 +1,364 @@ # @wagmi/connectors +## 7.1.2 + +### Patch Changes + +- Updated dependencies [[`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994)]: + - @wagmi/core@3.2.2 + +## 7.1.1 + +### Patch Changes + +- Updated dependencies [[`a373b50`](https://github.com/wevm/wagmi/commit/a373b504f2ba199ca63ec0da6138ad1aa12a3a8f)]: + - @wagmi/core@3.2.1 + +## 7.1.0 + +### Patch Changes + +- Updated dependencies [[`2ee3f55`](https://github.com/wevm/wagmi/commit/2ee3f559a2637c7aab3fca6c7d196cf238ecd63d)]: + - @wagmi/core@3.2.0 + +## 7.0.7 + +### Patch Changes + +- Updated dependencies [[`14989e4`](https://github.com/wevm/wagmi/commit/14989e425a36b765a6a24e5abf1782c2a26c70db)]: + - @wagmi/core@3.1.0 + +## 7.0.6 + +### Patch Changes + +- Updated dependencies [[`a5c4381`](https://github.com/wevm/wagmi/commit/a5c4381563374018dca0074017b21181ac027e9a)]: + - @wagmi/core@3.0.2 + +## 7.0.5 + +### Patch Changes + +- Fixed published exports. ([`ed86500`](https://github.com/wevm/wagmi/commit/ed86500fbd56e5f543cb04e990b2dadc08d8b3b5)) + +## 7.0.4 + +### Patch Changes + +- Fixed internal dynamic imports when using Webpack ([#4911](https://github.com/wevm/wagmi/pull/4911)) + +## 7.0.3 + +### Patch Changes + +- Updated dependencies [[`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4)]: + - @wagmi/core@3.0.1 + +## 7.0.2 + +### Patch Changes + +- Fixed account ordering in `baseAccount` connection response ([#4882](https://github.com/wevm/wagmi/pull/4882)) + +## 7.0.1 + +### Patch Changes + +- Fixed `baseAccount` reconnect behavior ([#4884](https://github.com/wevm/wagmi/pull/4884)) + +## 7.0.0 + +### Major Changes + +- All connector dependencies are now optional peer dependencies. This means that if you want to use a specific connector, you need to install its required dependencies. ([#4857](https://github.com/wevm/wagmi/pull/4857)) + + #### baseAccount + + [`baseAccount`](https://wagmi.sh/core/api/connectors/baseAccount) requires `@base-org/account` + + ``` + pnpm add @base-org/account@~2.4.0 + ``` + + #### coinbaseWallet + + [`coinbaseWallet`](https://wagmi.sh/core/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk` + + ``` + pnpm add @coinbase/wallet-sdk@~4.3.6 + ``` + + #### gemini + + [`gemini`](https://wagmi.sh/core/api/connectors/gemini) requires `@gemini-wallet/core` + + ``` + pnpm add @gemini-wallet/core@~0.3.1 + ``` + + #### metaMask + + [`metaMask`](https://wagmi.sh/core/api/connectors/metaMask) requires `@metamask/sdk` + + ``` + pnpm add @metamask/sdk@~0.33.1 + ``` + + #### porto + + [`porto`](https://wagmi.sh/core/api/connectors/porto) requires `porto` + + ``` + pnpm add porto@~0.2.35 + ``` + + #### safe + + [`safe`](https://wagmi.sh/core/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk` + + ``` + pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0 + ``` + + #### walletConnect + + [`walletConnect`](https://wagmi.sh/core/api/connectors/walletConnect) requires `walletconnect/ethereum-provider` + + ``` + pnpm add @walletconnect/ethereum-provider@~2.21.1 + ``` + +### Patch Changes + +- Updated dependencies [[`73e7326`](https://github.com/wevm/wagmi/commit/73e7326ac21303d7790765c78a7076b319b2ad26)]: + - @wagmi/core@3.0.0 + +## 6.2.0 + +### Minor Changes + +- Added support for `'wallet_connect'` capabilities to `baseAccount` connector ([#4877](https://github.com/wevm/wagmi/pull/4877)) + +## 6.1.4 + +### Patch Changes + +- Bumped Gemini package version ([`2ddb506`](https://github.com/wevm/wagmi/commit/2ddb506b67fcb2abb464765d2af88df2eb58de60)) + +## 6.1.3 + +### Patch Changes + +- Added warning to `walletConnect` about vulnerability and relicensing. ([`65cf154`](https://github.com/wevm/wagmi/commit/65cf1544d65bfb1fb830c405a371e8cd3c3fb73e)) + +## 6.1.2 + +### Patch Changes + +- Bumped connector deps ([#4843](https://github.com/wevm/wagmi/pull/4843)) + +## 6.1.1 + +### Patch Changes + +- Bumped Porto version ([`990dd23`](https://github.com/wevm/wagmi/commit/990dd2339e96b302931056e0fb898bd2dd42a04d)) + +## 6.1.0 + +### Minor Changes + +- Added `getPortoInstance` method to `porto`. ([#4837](https://github.com/wevm/wagmi/pull/4837)) + +## 6.0.1 + +### Patch Changes + +- Updated dependencies [[`74100b0`](https://github.com/wevm/wagmi/commit/74100b0dea2dfe7b057fdbe1660596554c70642e)]: + - @wagmi/core@2.22.1 + +## 6.0.0 + +### Patch Changes + +- Updated dependencies [[`ebb2352`](https://github.com/wevm/wagmi/commit/ebb2352375e05e52d0bcf6ae1a60ac4e798bf29f)]: + - @wagmi/core@2.22.0 + +## 5.11.2 + +### Patch Changes + +- Added `chainId` parameter on `walletConnect#getProvider` ([#4806](https://github.com/wevm/wagmi/pull/4806)) + +- Updated dependencies [[`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10)]: + - @wagmi/core@2.21.2 + +## 5.11.1 + +### Patch Changes + +- Updated `porto`. ([`41eb70e`](https://github.com/wevm/wagmi/commit/41eb70e072774b282053a5e98669a7d01c0e2438)) + +- Pulled `porto` connector implementation. ([#4801](https://github.com/wevm/wagmi/pull/4801)) + +## 5.11.0 + +### Minor Changes + +- Added `porto` connector. ([#4794](https://github.com/wevm/wagmi/pull/4794)) + +## 5.10.2 + +### Patch Changes + +- Updated dependencies [[`72b703a`](https://github.com/wevm/wagmi/commit/72b703ab379c74ecf88f637cf47f31786c823a48)]: + - @wagmi/core@2.21.1 + +## 5.10.1 + +### Patch Changes + +- Bumped MetaMask SDK version in accordance with [security advisory](https://github.com/advisories/GHSA-qj3p-xc97-xw74). ([`5937456`](https://github.com/wevm/wagmi/commit/59374562f2c3a41245687eb1c29ee8023737c7cc)) + +## 5.10.0 + +### Minor Changes + +- [#4784](https://github.com/wevm/wagmi/pull/4784) [`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c) Thanks [@tmm](https://github.com/tmm)! - Added `withCapabilities` option to `connect` for exposing response capabilities. + +### Patch Changes + +- Updated dependencies [[`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c)]: + - @wagmi/core@2.21.0 + +## 5.9.9 + +### Patch Changes + +- Updated dependencies [[`ce06e137e7bfaf000464b1cecd6c86e19a66ebcf`](https://github.com/wevm/wagmi/commit/ce06e137e7bfaf000464b1cecd6c86e19a66ebcf)]: + - @wagmi/core@2.20.3 + +## 5.9.8 + +### Patch Changes + +- [#4691](https://github.com/wevm/wagmi/pull/4691) [`a03da817a388646c9b4885792101a67eef3616e7`](https://github.com/wevm/wagmi/commit/a03da817a388646c9b4885792101a67eef3616e7) Thanks [@frolic](https://github.com/frolic)! - Fixed `walletConnect#connect` by moving chain switch directly inside instead of relying on `getProvider`. + +## 5.9.7 + +### Patch Changes + +- Updated dependencies [[`986b96427a4bb743d2673dfbc7e8cb5041316db3`](https://github.com/wevm/wagmi/commit/986b96427a4bb743d2673dfbc7e8cb5041316db3)]: + - @wagmi/core@2.20.2 + +## 5.9.6 + +### Patch Changes + +- Updated dependencies [[`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8)]: + - @wagmi/core@2.20.1 + +## 5.9.5 + +### Patch Changes + +- Updated dependencies [[`a13aa2b68890f180f6ac3f741cbb9817494cb66c`](https://github.com/wevm/wagmi/commit/a13aa2b68890f180f6ac3f741cbb9817494cb66c)]: + - @wagmi/core@2.20.0 + +## 5.9.4 + +### Patch Changes + +- [#4764](https://github.com/wevm/wagmi/pull/4764) [`f4039419b83b52b2984de149db85c11f503ffe39`](https://github.com/wevm/wagmi/commit/f4039419b83b52b2984de149db85c11f503ffe39) Thanks [@mikelxc](https://github.com/mikelxc)! - Updated gemini connector + +## 5.9.3 + +### Patch Changes + +- [#4759](https://github.com/wevm/wagmi/pull/4759) [`909324d28c81e15c9df312b277dcff1983fbae4d`](https://github.com/wevm/wagmi/commit/909324d28c81e15c9df312b277dcff1983fbae4d) Thanks [@mikelxc](https://github.com/mikelxc)! - Added Gemini + +## 5.9.2 + +### Patch Changes + +- Updated dependencies [[`b5f017dbc707729eb0b36d617352be224d1139d4`](https://github.com/wevm/wagmi/commit/b5f017dbc707729eb0b36d617352be224d1139d4)]: + - @wagmi/core@2.19.0 + +## 5.9.1 + +### Patch Changes + +- [`6fbafd425e488dbeee8404162dbeb3c737eeb8cf`](https://github.com/wevm/wagmi/commit/6fbafd425e488dbeee8404162dbeb3c737eeb8cf) Thanks [@jxom](https://github.com/jxom)! - Updated `@base-org/account` + +- Updated dependencies [[`6514ba29a5acb918773235fed0238d7d679d06d5`](https://github.com/wevm/wagmi/commit/6514ba29a5acb918773235fed0238d7d679d06d5)]: + - @wagmi/core@2.18.1 + +## 5.9.0 + +### Minor Changes + +- [#4734](https://github.com/wevm/wagmi/pull/4734) [`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013) Thanks [@jxom](https://github.com/jxom)! - Added `baseAccount` connector. + +### Patch Changes + +- Updated dependencies [[`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013)]: + - @wagmi/core@2.18.0 + +## 5.8.6 + +### Patch Changes + +- [#4731](https://github.com/wevm/wagmi/pull/4731) [`e75bd89406e9b6ff5b7d3a7148ab34140fe6352a`](https://github.com/wevm/wagmi/commit/e75bd89406e9b6ff5b7d3a7148ab34140fe6352a) Thanks [@tomiir](https://github.com/tomiir)! - Updated `@coinbase/wallet-sdk` to version 4.3.6 + +## 5.8.5 + +### Patch Changes + +- Updated dependencies [[`7ce242b549d8cc78e6c319d9ee419693da36704c`](https://github.com/wevm/wagmi/commit/7ce242b549d8cc78e6c319d9ee419693da36704c)]: + - @wagmi/core@2.17.3 + +## 5.8.4 + +### Patch Changes + +- [#4696](https://github.com/wevm/wagmi/pull/4696) [`3a90f358820444a85bb727742b0a16eb943fc361`](https://github.com/wevm/wagmi/commit/3a90f358820444a85bb727742b0a16eb943fc361) Thanks [@tomiir](https://github.com/tomiir)! - Updated @walletconnect/etereum-provider to version 2.21.1 + +## 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 diff --git a/packages/connectors/package.json b/packages/connectors/package.json index 0c085d330e..ce5df566d6 100644 --- a/packages/connectors/package.json +++ b/packages/connectors/package.json @@ -1,7 +1,7 @@ { "name": "@wagmi/connectors", "description": "Collection of connectors for Wagmi", - "version": "5.7.12", + "version": "7.1.2", "license": "MIT", "repository": { "type": "git", @@ -9,7 +9,7 @@ "directory": "packages/connectors" }, "scripts": { - "build": "pnpm run clean && pnpm run build:esm+types", + "build": "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", @@ -35,28 +35,63 @@ "./package.json": "./package.json" }, "peerDependencies": { + "@base-org/account": "^2.5.1", + "@coinbase/wallet-sdk": "^4.3.6", + "@gemini-wallet/core": "~0.3.1", + "@metamask/sdk": "~0.33.1", + "@safe-global/safe-apps-provider": "~0.18.6", + "@safe-global/safe-apps-sdk": "^9.1.0", "@wagmi/core": "workspace:*", - "typescript": ">=5.0.4", + "@walletconnect/ethereum-provider": "^2.21.1", + "porto": "~0.2.35", + "typescript": ">=5.7.3", "viem": "2.x" }, "peerDependenciesMeta": { + "@base-org/account": { + "optional": true + }, + "@coinbase/wallet-sdk": { + "optional": true + }, + "@gemini-wallet/core": { + "optional": true + }, + "@metamask/sdk": { + "optional": true + }, + "@safe-global/safe-apps-provider": { + "optional": true + }, + "@safe-global/safe-apps-sdk": { + "optional": true + }, + "@walletconnect/ethereum-provider": { + "optional": true + }, + "porto": { + "optional": true + }, "typescript": { "optional": true } }, - "dependencies": { - "@coinbase/wallet-sdk": "4.3.0", - "@metamask/sdk": "0.32.0", - "@safe-global/safe-apps-provider": "0.18.6", - "@safe-global/safe-apps-sdk": "9.1.0", - "@walletconnect/ethereum-provider": "2.19.2", - "cbw-sdk": "npm:@coinbase/wallet-sdk@3.9.3" - }, "devDependencies": { + "@base-org/account": "catalog:", + "@coinbase/wallet-sdk": "catalog:", + "@gemini-wallet/core": "catalog:", + "@metamask/sdk": "catalog:", + "@safe-global/safe-apps-provider": "catalog:", + "@safe-global/safe-apps-sdk": "catalog:", "@wagmi/core": "workspace:*", - "msw": "^2.4.9" + "@walletconnect/ethereum-provider": "catalog:", + "msw": "^2.4.9", + "porto": "catalog:" }, - "contributors": ["awkweb.eth ", "jxom.eth "], + "contributors": [ + "awkweb.eth ", + "jxom.eth " + ], "funding": "https://github.com/sponsors/wevm", "keywords": [ "react", diff --git a/packages/connectors/src/baseAccount.test.ts b/packages/connectors/src/baseAccount.test.ts new file mode 100644 index 0000000000..d5fe1a7aa6 --- /dev/null +++ b/packages/connectors/src/baseAccount.test.ts @@ -0,0 +1,10 @@ +import { config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { baseAccount } from './baseAccount.js' + +test('setup', () => { + const connectorFn = baseAccount({ appName: 'wagmi' }) + const connector = config._internal.connectors.setup(connectorFn) + expect(connector.name).toEqual('Base Account') +}) diff --git a/packages/connectors/src/baseAccount.ts b/packages/connectors/src/baseAccount.ts new file mode 100644 index 0000000000..9de7106efd --- /dev/null +++ b/packages/connectors/src/baseAccount.ts @@ -0,0 +1,330 @@ +import type { createBaseAccountSDK, ProviderInterface } from '@base-org/account' +import { + ChainNotConfiguredError, + type Connector, + createConnector, +} from '@wagmi/core' +import type { Mutable, Omit } from '@wagmi/core/internal' +import { + type AddEthereumChainParameter, + type Address, + getAddress, + type Hex, + numberToHex, + type ProviderRpcError, + SwitchChainError, + UserRejectedRequestError, +} from 'viem' + +export type BaseAccountParameters = Mutable< + Omit< + Parameters[0], + 'appChainIds' // set via wagmi config + > +> + +export function baseAccount(parameters: BaseAccountParameters = {}) { + type Provider = ProviderInterface + type Properties = { + connect(parameters?: { + chainId?: number | undefined + capabilities?: + | { + signInWithEthereum?: { + chainId?: string | undefined + domain?: string | undefined + expirationTime?: string | undefined + issuedAt?: string | undefined + nonce: string + notBefore?: string | undefined + requestId?: string | undefined + resources?: string[] | undefined + scheme?: string | undefined + statement?: string | undefined + uri?: string | undefined + version?: string | undefined + } + [capability: string]: any + } + | undefined + isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined + }): Promise<{ + accounts: withCapabilities extends true + ? readonly { + address: Address + capabilities: WalletConnectResponseCapabilities + }[] + : readonly Address[] + chainId: number + }> + } + type WalletConnectResponseCapabilities = { + signInWithEthereum?: { message: string; signature: Hex } | undefined + [capability: string]: any + } + + let walletProvider: Provider | undefined + + let accountsChanged: Connector['onAccountsChanged'] | undefined + let chainChanged: Connector['onChainChanged'] | undefined + let disconnect: Connector['onDisconnect'] | undefined + + return createConnector((config) => ({ + id: 'baseAccount', + name: 'Base Account', + rdns: 'app.base.account', + type: 'baseAccount', + async connect({ chainId, withCapabilities, ...rest } = {}) { + try { + const provider = await this.getProvider() + + const targetChainId = chainId ?? config.chains[0]?.id + if (!targetChainId) throw new ChainNotConfiguredError() + + let { accounts, currentChainId } = await (async () => { + if (rest.isReconnecting) + return { + accounts: ( + (await provider.request({ + method: 'eth_accounts', + params: [], + })) as string[] + ).map((x) => ({ address: getAddress(x) })), + currentChainId: await this.getChainId(), + } + const response = (await provider.request({ + method: 'wallet_connect', + params: [ + { + capabilities: + 'capabilities' in rest && rest.capabilities + ? rest.capabilities + : {}, + chainIds: [ + numberToHex(targetChainId), + ...config.chains + .filter((x) => x.id !== targetChainId) + .map((x) => numberToHex(x.id)), + ], + }, + ], + })) as { + accounts: { + address: Address + capabilities?: WalletConnectResponseCapabilities | undefined + }[] + chainIds: Hex[] + } + const orderedAccounts = (await provider.request({ + method: 'eth_accounts', + })) as Address[] + const accounts = orderedAccounts.map( + (account1) => + response.accounts.find( + (account2) => account2.address === account1, + ) ?? { address: account1 }, + ) + return { + accounts: accounts.map((account) => ({ + address: getAddress(account.address), + capabilities: account.capabilities ?? {}, + })), + currentChainId: Number(response.chainIds[0]), + } + })() + + 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 + 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 { + // TODO(v3): Make `withCapabilities: true` default behavior + accounts: (withCapabilities + ? accounts + : accounts.map((account) => account.address)) as never, + 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() + }, + 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 { createBaseAccountSDK } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@base-org/account') + } catch { + throw new Error('dependency "@base-org/account" not found') + } + })() + const sdk = createBaseAccountSDK({ + ...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 + } + }, + })) +} diff --git a/packages/connectors/src/coinbaseWallet.test.ts b/packages/connectors/src/coinbaseWallet.test.ts index 99b141e49b..a551a16568 100644 --- a/packages/connectors/src/coinbaseWallet.test.ts +++ b/packages/connectors/src/coinbaseWallet.test.ts @@ -4,7 +4,7 @@ import { expect, expectTypeOf, test } from 'vitest' import { coinbaseWallet } from './coinbaseWallet.js' test('setup', () => { - const connectorFn = coinbaseWallet({ appName: 'wagmi', version: '4' }) + const connectorFn = coinbaseWallet({ appName: 'wagmi' }) const connector = config._internal.connectors.setup(connectorFn) expect(connector.name).toEqual('Coinbase Wallet') diff --git a/packages/connectors/src/coinbaseWallet.ts b/packages/connectors/src/coinbaseWallet.ts index 630c91261e..25bb63c29c 100644 --- a/packages/connectors/src/coinbaseWallet.ts +++ b/packages/connectors/src/coinbaseWallet.ts @@ -1,93 +1,53 @@ import type { - Preference, - ProviderInterface, createCoinbaseWalletSDK, + ProviderInterface, } 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 { Mutable, Omit } from '@wagmi/core/internal' import { type AddEthereumChainParameter, type Address, + getAddress, type Hex, + numberToHex, 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< +export type CoinbaseWalletParameters< + /** @deprecated remove */ + _ = unknown, +> = 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 - } + 'appChainIds' // set via wagmi config + > > -function version4(parameters: Version4Parameters) { +coinbaseWallet.type = 'coinbaseWallet' as const +export function coinbaseWallet( + parameters: CoinbaseWalletParameters = {} as any, +) { type Provider = ProviderInterface & { // for backwards compatibility close?(): void } type Properties = { - connect(parameters?: { + // TODO(v3): Make `withCapabilities: true` default behavior + connect(parameters?: { chainId?: number | undefined instantOnboarding?: boolean | undefined isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined }): Promise<{ - accounts: readonly Address[] + accounts: withCapabilities extends true + ? readonly { address: Address }[] + : readonly Address[] chainId: number }> } @@ -103,7 +63,7 @@ function version4(parameters: Version4Parameters) { name: 'Coinbase Wallet', rdns: 'com.coinbase.wallet', type: coinbaseWallet.type, - async connect({ chainId, ...rest } = {}) { + async connect({ chainId, withCapabilities, ...rest } = {}) { try { const provider = await this.getProvider() const accounts = ( @@ -139,7 +99,12 @@ function version4(parameters: Version4Parameters) { currentChainId = chain?.id ?? currentChainId } - return { accounts, chainId: currentChainId } + return { + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + chainId: currentChainId, + } } catch (error) { if ( /(user closed modal|accounts received is empty|user denied account|request rejected)/i.test( @@ -186,20 +151,21 @@ function version4(parameters: Version4Parameters) { }, 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 (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@coinbase/wallet-sdk') + } catch { + throw new Error('dependency "@coinbase/wallet-sdk" not found') } })() - - const { createCoinbaseWalletSDK } = await import('@coinbase/wallet-sdk') const sdk = createCoinbaseWalletSDK({ ...parameters, appChainIds: config.chains.map((x) => x.id), - preference, + preference: { + options: 'all', + ...(parameters.preference ?? {}), + }, }) walletProvider = sdk.getProvider() @@ -299,248 +265,3 @@ function version4(parameters: Version4Parameters) { }, })) } - -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/packages/connectors/src/exports/index.test.ts b/packages/connectors/src/exports/index.test.ts index bcf100cb61..66c405fa0b 100644 --- a/packages/connectors/src/exports/index.test.ts +++ b/packages/connectors/src/exports/index.test.ts @@ -7,11 +7,14 @@ test('exports', () => { [ "injected", "mock", + "baseAccount", "coinbaseWallet", + "gemini", "metaMask", + "porto", "safe", - "walletConnect", "version", + "walletConnect", ] `) }) diff --git a/packages/connectors/src/exports/index.ts b/packages/connectors/src/exports/index.ts index bac0975956..da6c805acc 100644 --- a/packages/connectors/src/exports/index.ts +++ b/packages/connectors/src/exports/index.ts @@ -5,19 +5,17 @@ export { type MockParameters, mock, } from '@wagmi/core' - +export { type BaseAccountParameters, baseAccount } from '../baseAccount.js' export { type CoinbaseWalletParameters, coinbaseWallet, } from '../coinbaseWallet.js' - +export { type GeminiParameters, gemini } from '../gemini.js' export { type MetaMaskParameters, metaMask } from '../metaMask.js' - +export { type PortoParameters, porto } from '../porto.js' export { type SafeParameters, safe } from '../safe.js' - +export { version } from '../version.js' export { type WalletConnectParameters, walletConnect, } from '../walletConnect.js' - -export { version } from '../version.js' diff --git a/packages/connectors/src/gemini.test.ts b/packages/connectors/src/gemini.test.ts new file mode 100644 index 0000000000..3fd1cf3042 --- /dev/null +++ b/packages/connectors/src/gemini.test.ts @@ -0,0 +1,22 @@ +import { config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { gemini } from './gemini.js' + +test('setup', () => { + const connectorFn = gemini() + const connector = config._internal.connectors.setup(connectorFn) + expect(connector.name).toEqual('Gemini Wallet') +}) + +test('setup with parameters', () => { + const connectorFn = gemini({ + appMetadata: { + name: 'Test App', + url: 'https://example.com', + }, + }) + const connector = config._internal.connectors.setup(connectorFn) + expect(connector.name).toEqual('Gemini Wallet') + expect(connector.id).toEqual('gemini') +}) diff --git a/packages/connectors/src/gemini.ts b/packages/connectors/src/gemini.ts new file mode 100644 index 0000000000..69b9b6bd34 --- /dev/null +++ b/packages/connectors/src/gemini.ts @@ -0,0 +1,183 @@ +import type { AppMetadata, ProviderInterface } from '@gemini-wallet/core' +import { + ChainNotConfiguredError, + type Connector, + createConnector, +} from '@wagmi/core' +import { + getAddress, + numberToHex, + SwitchChainError, + UserRejectedRequestError, +} from 'viem' + +export type GeminiParameters = { + appMetadata?: AppMetadata +} + +gemini.type = 'gemini' as const +export function gemini(parameters: GeminiParameters = {}) { + type Provider = ProviderInterface + + let walletProvider: Provider | undefined + let onAccountsChanged: Connector['onAccountsChanged'] | undefined + let onChainChanged: Connector['onChainChanged'] | undefined + let onDisconnect: Connector['onDisconnect'] | undefined + + return createConnector((config) => ({ + id: 'gemini', + name: 'Gemini Wallet', + type: gemini.type, + icon: 'https://keys.gemini.com/images/gemini-wallet-logo.svg', + async connect({ chainId, withCapabilities } = {}) { + try { + const provider = await this.getProvider() + const accounts = (await provider.request({ + method: 'eth_requestAccounts', + })) as string[] + + if (!onAccountsChanged) { + onAccountsChanged = this.onAccountsChanged.bind(this) + provider.on('accountsChanged', onAccountsChanged) + } + if (!onChainChanged) { + onChainChanged = this.onChainChanged.bind(this) + provider.on('chainChanged', onChainChanged) + } + if (!onDisconnect) { + onDisconnect = this.onDisconnect.bind(this) + provider.on('disconnect', onDisconnect) + } + + 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 { + // TODO(v3): Make `withCapabilities: true` default behavior + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + 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 (onAccountsChanged) { + provider.removeListener('accountsChanged', onAccountsChanged) + onAccountsChanged = undefined + } + if (onChainChanged) { + provider.removeListener('chainChanged', onChainChanged) + onChainChanged = undefined + } + if (onDisconnect) { + provider.removeListener('disconnect', onDisconnect) + onDisconnect = undefined + } + + await provider.disconnect() + }, + 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 = (await provider.request({ + method: 'eth_chainId', + })) as string + return Number(chainId) + }, + async getProvider() { + if (!walletProvider) { + const { GeminiWalletProvider } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@gemini-wallet/core') + } catch { + throw new Error('dependency "@gemini-wallet/core" not found') + } + })() + walletProvider = new GeminiWalletProvider({ + appMetadata: parameters.appMetadata ?? {}, + chain: { + id: config.chains[0]?.id ?? 1, + rpcUrl: config.chains[0]?.rpcUrls?.default?.http[0], + }, + }) + } + return walletProvider + }, + async isAuthorized() { + try { + const accounts = await this.getAccounts() + return Boolean(accounts.length) + } catch { + return false + } + }, + async switchChain({ 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(chainId) }], + }) + return chain + } catch (error) { + throw new SwitchChainError(error as Error) + } + }, + onAccountsChanged(accounts) { + if (accounts.length === 0) this.onDisconnect() + else + config.emitter.emit('change', { + accounts: accounts.map((x: string) => getAddress(x)), + }) + }, + onChainChanged(chain) { + const chainId = Number(chain) + config.emitter.emit('change', { chainId }) + }, + async onDisconnect() { + config.emitter.emit('disconnect') + + const provider = await this.getProvider() + if (onAccountsChanged) { + provider.removeListener('accountsChanged', onAccountsChanged) + onAccountsChanged = undefined + } + if (onChainChanged) { + provider.removeListener('chainChanged', onChainChanged) + onChainChanged = undefined + } + if (onDisconnect) { + provider.removeListener('disconnect', onDisconnect) + onDisconnect = undefined + } + }, + })) +} diff --git a/packages/connectors/src/metaMask.ts b/packages/connectors/src/metaMask.ts index 02ab4c3fb3..dd046c03e0 100644 --- a/packages/connectors/src/metaMask.ts +++ b/packages/connectors/src/metaMask.ts @@ -7,9 +7,9 @@ import type { import { ChainNotConfiguredError, type Connector, - ProviderNotFoundError, createConnector, extractRpcUrls, + ProviderNotFoundError, } from '@wagmi/core' import type { Compute, @@ -21,16 +21,16 @@ import type { import { type AddEthereumChainParameter, type Address, + getAddress, type Hex, + hexToNumber, + numberToHex, type ProviderConnectInfo, type ProviderRpcError, ResourceUnavailableRpcError, type RpcError, SwitchChainError, UserRejectedRequestError, - getAddress, - hexToNumber, - numberToHex, withRetry, withTimeout, } from 'viem' @@ -61,16 +61,7 @@ type WagmiMetaMaskSDKOptions = Compute< | 'useDeeplink' | 'readonlyRPCMap' > - > & { - /** @deprecated */ - forceDeleteProvider?: MetaMaskSDKOptions['forceDeleteProvider'] - /** @deprecated */ - forceInjectProvider?: MetaMaskSDKOptions['forceInjectProvider'] - /** @deprecated */ - injectProvider?: MetaMaskSDKOptions['injectProvider'] - /** @deprecated */ - useDeeplink?: MetaMaskSDKOptions['useDeeplink'] - } + > > metaMask.type = 'metaMask' as const @@ -113,7 +104,7 @@ export function metaMask(parameters: MetaMaskParameters = {}) { } } }, - async connect({ chainId, isReconnecting } = {}) { + async connect({ chainId, isReconnecting, withCapabilities } = {}) { const provider = await this.getProvider() if (!displayUri) { displayUri = this.onDisplayUri @@ -191,7 +182,13 @@ export function metaMask(parameters: MetaMaskParameters = {}) { provider.on('disconnect', disconnect as Listener) } - return { accounts, chainId: currentChainId } + return { + // TODO(v3): Make `withCapabilities: true` default behavior + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + chainId: currentChainId, + } } catch (err) { const error = err as RpcError if (error.code === UserRejectedRequestError.code) @@ -239,7 +236,14 @@ export function metaMask(parameters: MetaMaskParameters = {}) { // Unwrapping import for Vite compatibility. // See: https://github.com/vitejs/vite/issues/9703 const MetaMaskSDK = await (async () => { - const { default: SDK } = await import('@metamask/sdk') + const { default: SDK } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@metamask/sdk') + } catch { + throw new Error('dependency "@metamask/sdk" not found') + } + })() if (typeof SDK !== 'function' && typeof SDK.default === 'function') return SDK.default return SDK as unknown as typeof SDK.default @@ -253,12 +257,12 @@ export function metaMask(parameters: MetaMaskParameters = {}) { })?.[0] sdk = new MetaMaskSDK({ + // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'` + ...(parameters as RemoveUndefined), _source: 'wagmi', forceDeleteProvider: false, forceInjectProvider: false, injectProvider: false, - // Workaround cast since MetaMask SDK does not support `'exactOptionalPropertyTypes'` - ...(parameters as RemoveUndefined), readonlyRPCMap, dappMetadata: { ...parameters.dappMetadata, @@ -272,7 +276,7 @@ export function metaMask(parameters: MetaMaskParameters = {}) { ? window.location.origin : 'https://wagmi.sh', }, - useDeeplink: parameters.useDeeplink ?? true, + useDeeplink: true, }) const result = await sdk.init() // On initial load, sometimes `sdk.getProvider` does not return provider. diff --git a/packages/connectors/src/porto.test.ts b/packages/connectors/src/porto.test.ts new file mode 100644 index 0000000000..1946aab587 --- /dev/null +++ b/packages/connectors/src/porto.test.ts @@ -0,0 +1,10 @@ +import { config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { porto } from './porto.js' + +test('setup', () => { + const connectorFn = porto() + const connector = config._internal.connectors.setup(connectorFn) + expect(connector.name).toEqual('Porto') +}) diff --git a/packages/connectors/src/porto.ts b/packages/connectors/src/porto.ts new file mode 100644 index 0000000000..52675701a3 --- /dev/null +++ b/packages/connectors/src/porto.ts @@ -0,0 +1,323 @@ +import { + ChainNotConfiguredError, + type Connector, + createConnector, +} from '@wagmi/core' +import type { ExactPartial } from '@wagmi/core/internal' +import type { Porto, RpcSchema } from 'porto' +import { + type Address, + getAddress, + numberToHex, + type ProviderConnectInfo, + type RpcError, + SwitchChainError, + UserRejectedRequestError, + withRetry, +} from 'viem' + +export type PortoParameters = ExactPartial + +export function porto(parameters: PortoParameters = {}) { + type Provider = ReturnType['provider'] + type Properties = { + connect(parameters?: { + chainId?: number | undefined + capabilities?: + | (RpcSchema.wallet_connect.Capabilities & { + force?: boolean | undefined + }) + | undefined + isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined + }): Promise<{ + accounts: withCapabilities extends true + ? readonly { + address: Address + capabilities: RpcSchema.wallet_connect.ResponseCapabilities + }[] + : readonly Address[] + chainId: number + }> + getPortoInstance(): Promise + onConnect(connectInfo: ProviderConnectInfo): void + } + + return createConnector((wagmiConfig) => { + const chains = wagmiConfig.chains ?? parameters.chains ?? [] + + const transports = (() => { + if (wagmiConfig.transports) return wagmiConfig.transports + return parameters.transports + })() + + let porto_promise: Promise | undefined + + let accountsChanged: Connector['onAccountsChanged'] | undefined + let chainChanged: Connector['onChainChanged'] | undefined + let connect: Connector['onConnect'] | undefined + let disconnect: Connector['onDisconnect'] | undefined + + return { + async connect({ chainId = chains[0].id, ...rest } = {}) { + const isReconnecting = + ('isReconnecting' in rest && rest.isReconnecting) || false + const withCapabilities = + ('withCapabilities' in rest && rest.withCapabilities) || false + + let accounts: readonly (Address | { address: Address })[] = [] + let currentChainId: number | undefined + + if (isReconnecting) { + ;[accounts, currentChainId] = await Promise.all([ + this.getAccounts().catch(() => []), + this.getChainId().catch(() => undefined), + ]) + 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 + } + } + + const provider = (await this.getProvider()) as Provider + + try { + if (!accounts?.length && !isReconnecting) { + const { RpcSchema } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('porto') + } catch { + throw new Error('dependency "porto" not found') + } + })() + const { z } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('porto/internal') + } catch { + throw new Error('dependency "porto/internal" not found') + } + })() + const res = await provider.request({ + method: 'wallet_connect', + params: [ + { + ...('capabilities' in rest + ? { + capabilities: z.encode( + RpcSchema.wallet_connect.Capabilities, + rest.capabilities ?? {}, + ), + } + : {}), + chainIds: [ + numberToHex(chainId), + ...chains + .filter((x) => x.id !== chainId) + .map((x) => numberToHex(x.id)), + ], + }, + ], + }) + accounts = res.accounts + currentChainId = Number(res.chainIds[0]) + } + + if (!currentChainId) throw new ChainNotConfiguredError() + + // 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) + // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`, + // while Connector `accountsChanged` is `string[]` + provider.on('accountsChanged', accountsChanged as never) + } + if (!chainChanged) { + chainChanged = this.onChainChanged.bind(this) + provider.on('chainChanged', chainChanged) + } + if (!disconnect) { + disconnect = this.onDisconnect.bind(this) + provider.on('disconnect', disconnect) + } + + return { + accounts: accounts.map((account) => { + if (typeof account === 'object') + return withCapabilities ? account : account.address + return withCapabilities + ? { address: account, capabilities: {} } + : account + }) as never, + chainId: currentChainId, + } + } catch (err) { + const error = err as RpcError + if (error.code === UserRejectedRequestError.code) + throw new UserRejectedRequestError(error) + throw error + } + }, + async disconnect() { + const provider = await this.getProvider() + + 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) + } + + await provider.request({ method: 'wallet_disconnect' }) + }, + async getAccounts() { + const provider = await this.getProvider() + const accounts = await provider.request({ + method: 'eth_accounts', + }) + return accounts.map((x) => getAddress(x)) + }, + async getChainId() { + const provider = await this.getProvider() + const hexChainId = await provider.request({ + method: 'eth_chainId', + }) + return Number(hexChainId) + }, + async getPortoInstance() { + porto_promise ??= (async () => { + const { Porto } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('porto') + } catch { + throw new Error('dependency "porto" not found') + } + })() + return Porto.create({ + ...parameters, + announceProvider: false, + // @ts-ignore + chains, + // @ts-ignore + transports, + }) + })() + return await porto_promise + }, + async getProvider() { + return (await this.getPortoInstance()).provider + }, + icon: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDIyIiBoZWlnaHQ9IjQyMiIgdmlld0JveD0iMCAwIDQyMiA0MjIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI0MjIiIGhlaWdodD0iNDIyIiBmaWxsPSJibGFjayIvPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMV8xNSkiPgo8cGF0aCBkPSJNODEgMjg2LjM2NkM4MSAyODAuODkzIDg1LjQ1MDUgMjc2LjQ1NSA5MC45NDA0IDI3Ni40NTVIMzI5LjUxMUMzMzUuMDAxIDI3Ni40NTUgMzM5LjQ1MiAyODAuODkzIDMzOS40NTIgMjg2LjM2NlYzMDYuMTg4QzMzOS40NTIgMzExLjY2MiAzMzUuMDAxIDMxNi4wOTkgMzI5LjUxMSAzMTYuMDk5SDkwLjk0MDRDODUuNDUwNSAzMTYuMDk5IDgxIDMxMS42NjIgODEgMzA2LjE4OFYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAyMzQuODI4Qzg1LjQ1MDUgMjM0LjgyOCA4MSAyMzkuMjY2IDgxIDI0NC43MzlWMjcxLjUzMUM4My44NDMyIDI2OS42MzMgODcuMjYyMiAyNjguNTI2IDkwLjk0MDQgMjY4LjUyNkgzMjkuNTExQzMzMy4xODggMjY4LjUyNiAzMzYuNjA4IDI2OS42MzMgMzM5LjQ1MiAyNzEuNTMxVjI0NC43MzlDMzM5LjQ1MiAyMzkuMjY2IDMzNS4wMDEgMjM0LjgyOCAzMjkuNTExIDIzNC44MjhIOTAuOTQwNFpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgwLjg5MyAzMzUuMDAxIDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTlDODEgMzExLjY2NCA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2NCAzMzkuNDUyIDMwNi4xOVYyODYuMzY2WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTAuOTQwNCAxOTMuMjAxQzg1LjQ1MDUgMTkzLjIwMSA4MSAxOTcuNjM4IDgxIDIwMy4xMTJWMjI5LjkwM0M4My44NDMyIDIyOC4wMDYgODcuMjYyMiAyMjYuODk5IDkwLjk0MDQgMjI2Ljg5OUgzMjkuNTExQzMzMy4xODggMjI2Ljg5OSAzMzYuNjA4IDIyOC4wMDYgMzM5LjQ1MiAyMjkuOTAzVjIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNFpNMzM5LjQ1MiAyNDQuNzM5QzMzOS40NTIgMjM5LjI2NSAzMzUuMDAxIDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNDODEuMjE3NSAyNzEuMzg1IDgxLjQzODMgMjcxLjI0NSA4MS42NjI0IDI3MS4xMDlDODMuODMyNSAyNjkuNzk0IDg2LjMwNTQgMjY4LjkyNyA4OC45NTIzIDI2OC42MzVDODkuNjA1MSAyNjguNTYzIDkwLjI2ODQgMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMzAuMTgzIDI2OC41MjYgMzMwLjg0NiAyNjguNTYzIDMzMS40OTggMjY4LjYzNUMzMzQuNDE5IDI2OC45NTcgMzM3LjEyOCAyNjkuOTggMzM5LjQ1MiAyNzEuNTNWMjQ0LjczOVpNMzM5LjQ1MiAyODYuMzY2QzMzOS40NTIgMjgxLjAyMSAzMzUuMjA2IDI3Ni42NjMgMzI5Ljg5MyAyNzYuNDYyQzMyOS43NjcgMjc2LjQ1NyAzMjkuNjQgMjc2LjQ1NSAzMjkuNTExIDI3Ni40NTVIOTAuOTQwNEM4NS40NTA1IDI3Ni40NTUgODEgMjgwLjg5MyA4MSAyODYuMzY2VjMwNi4xODhDODEgMzExLjY2MiA4NS40NTA1IDMxNi4xMDEgOTAuOTQwNCAzMTYuMTAxSDMyOS41MTFDMzM1LjAwMSAzMTYuMTAxIDMzOS40NTIgMzExLjY2MiAzMzkuNDUyIDMwNi4xODhWMjg2LjM2NloiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8cGF0aCBvcGFjaXR5PSIwLjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNOTguMDE0NiAxMDRDODguNjE3NyAxMDQgODEgMTExLjU5NSA4MSAxMjAuOTY1VjE4OC4yNzZDODMuODQzMiAxODYuMzc5IDg3LjI2MjIgMTg1LjI3MiA5MC45NDA0IDE4NS4yNzJIMzI5LjUxMUMzMzMuMTg4IDE4NS4yNzIgMzM2LjYwOCAxODYuMzc5IDMzOS40NTIgMTg4LjI3NlYxMjAuOTY1QzMzOS40NTIgMTExLjU5NSAzMzEuODMzIDEwNCAzMjIuNDM3IDEwNEg5OC4wMTQ2Wk0zMzkuNDUyIDIwMy4xMTJDMzM5LjQ1MiAxOTcuNjM4IDMzNS4wMDEgMTkzLjIwMSAzMjkuNTExIDE5My4yMDFIOTAuOTQwNEM4NS40NTA1IDE5My4yMDEgODEgMTk3LjYzOCA4MSAyMDMuMTEyVjIyOS45MDNDODEuMjE3NSAyMjkuNzU4IDgxLjQzODMgMjI5LjYxOCA4MS42NjI0IDIyOS40ODJDODMuODMyNSAyMjguMTY3IDg2LjMwNTQgMjI3LjMgODguOTUyMyAyMjcuMDA4Qzg5LjYwNTEgMjI2LjkzNiA5MC4yNjg0IDIyNi44OTkgOTAuOTQwNCAyMjYuODk5SDMyOS41MTFDMzMwLjE4MyAyMjYuODk5IDMzMC44NDYgMjI2LjkzNiAzMzEuNDk4IDIyNy4wMDhDMzM0LjQxOSAyMjcuMzMgMzM3LjEyOCAyMjguMzUyIDMzOS40NTIgMjI5LjkwM1YyMDMuMTEyWk0zMzkuNDUyIDI0NC43MzlDMzM5LjQ1MiAyMzkuMzkzIDMzNS4yMDYgMjM1LjAzNiAzMjkuODkzIDIzNC44MzVDMzI5Ljc2NyAyMzQuODMgMzI5LjY0IDIzNC44MjggMzI5LjUxMSAyMzQuODI4SDkwLjk0MDRDODUuNDUwNSAyMzQuODI4IDgxIDIzOS4yNjUgODEgMjQ0LjczOVYyNzEuNTNMODEuMDcwNyAyNzEuNDgzQzgxLjI2NTMgMjcxLjM1NSA4MS40NjI1IDI3MS4yMyA4MS42NjI0IDI3MS4xMDlDODEuOTA4MyAyNzAuOTYgODIuMTU4MSAyNzAuODE3IDgyLjQxMTcgMjcwLjY3OUM4NC4zOTUzIDI2OS42MDUgODYuNjA1NCAyNjguODk0IDg4Ljk1MjMgMjY4LjYzNUM4OS4wMDUyIDI2OC42MjkgODkuMDU4IDI2OC42MjQgODkuMTExIDI2OC42MThDODkuNzEyNSAyNjguNTU3IDkwLjMyMjggMjY4LjUyNiA5MC45NDA0IDI2OC41MjZIMzI5LjUxMUMzMjkuNzM4IDI2OC41MjYgMzI5Ljk2NSAyNjguNTMgMzMwLjE5MiAyNjguNTM5QzMzMC42MzEgMjY4LjU1NSAzMzEuMDY3IDI2OC41ODcgMzMxLjQ5OCAyNjguNjM1QzMzNC40MTkgMjY4Ljk1NyAzMzcuMTI4IDI2OS45OCAzMzkuNDUyIDI3MS41M1YyNDQuNzM5Wk0zMzkuNDUyIDI4Ni4zNjZDMzM5LjQ1MiAyODEuMDIxIDMzNS4yMDYgMjc2LjY2MyAzMjkuODkzIDI3Ni40NjJMMzI5Ljg2NSAyNzYuNDYxQzMyOS43NDggMjc2LjQ1NyAzMjkuNjI5IDI3Ni40NTUgMzI5LjUxMSAyNzYuNDU1SDkwLjk0MDRDODUuNDUwNSAyNzYuNDU1IDgxIDI4MC44OTMgODEgMjg2LjM2NlYzMDYuMTg4QzgxIDMxMS42NjIgODUuNDUwNSAzMTYuMTAxIDkwLjk0MDQgMzE2LjEwMUgzMjkuNTExQzMzNS4wMDEgMzE2LjEwMSAzMzkuNDUyIDMxMS42NjIgMzM5LjQ1MiAzMDYuMTg4VjI4Ni4zNjZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY5Ljg2OCAxMzEuNzUyQzI2OS44NjggMTI2LjI3OCAyNzQuMzE4IDEyMS44NCAyNzkuODA4IDEyMS44NEgzMTEuNjE4QzMxNy4xMDggMTIxLjg0IDMyMS41NTggMTI2LjI3OCAzMjEuNTU4IDEzMS43NTJWMTYxLjQ4NUMzMjEuNTU4IDE2Ni45NTkgMzE3LjEwOCAxNzEuMzk2IDMxMS42MTggMTcxLjM5NkgyNzkuODA4QzI3NC4zMTggMTcxLjM5NiAyNjkuODY4IDE2Ni45NTkgMjY5Ljg2OCAxNjEuNDg1VjEzMS43NTJaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzFfMTUiPgo8cmVjdCB3aWR0aD0iMjU5IiBoZWlnaHQ9IjIxMyIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgxIDEwNCkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K', + id: 'xyz.ithaca.porto', + async isAuthorized() { + try { + // Use retry strategy as some injected wallets (e.g. MetaMask) fail to + // immediately resolve JSON-RPC requests on page load. + const accounts = await withRetry(() => this.getAccounts()) + return !!accounts.length + } catch { + return false + } + }, + name: 'Porto', + async onAccountsChanged(accounts) { + wagmiConfig.emitter.emit('change', { + accounts: accounts.map((x) => getAddress(x)), + }) + }, + onChainChanged(chain) { + const chainId = Number(chain) + wagmiConfig.emitter.emit('change', { chainId }) + }, + async onConnect(connectInfo) { + const accounts = await this.getAccounts() + if (accounts.length === 0) return + + const chainId = Number(connectInfo.chainId) + wagmiConfig.emitter.emit('connect', { accounts, chainId }) + + // Manage EIP-1193 event listeners + const provider = await this.getProvider() + if (provider) { + if (connect) { + provider.removeListener('connect', connect) + connect = undefined + } + if (!accountsChanged) { + accountsChanged = this.onAccountsChanged.bind(this) + // Porto Provider uses Ox, which uses `readonly Address.Address[]` for `accountsChanged`, + // while Connector `accountsChanged` is `string[]` + provider.on('accountsChanged', accountsChanged as never) + } + if (!chainChanged) { + chainChanged = this.onChainChanged.bind(this) + provider.on('chainChanged', chainChanged) + } + if (!disconnect) { + disconnect = this.onDisconnect.bind(this) + provider.on('disconnect', disconnect) + } + } + }, + async onDisconnect(_error) { + const provider = await this.getProvider() + + wagmiConfig.emitter.emit('disconnect') + + // Manage EIP-1193 event listeners + if (provider) { + 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) + } + } + }, + async setup() { + if (!connect) { + const provider = await this.getProvider() + connect = this.onConnect.bind(this) + provider.on('connect', connect) + } + }, + async switchChain({ chainId }) { + const chain = chains.find((x) => x.id === chainId) + if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) + + const provider = await this.getProvider() + await provider.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: numberToHex(chainId) }], + }) + + return chain + }, + type: 'injected', + } + }) +} diff --git a/packages/connectors/src/safe.ts b/packages/connectors/src/safe.ts index 13153e106f..8fd6117d1d 100644 --- a/packages/connectors/src/safe.ts +++ b/packages/connectors/src/safe.ts @@ -2,8 +2,8 @@ import type { SafeAppProvider } from '@safe-global/safe-apps-provider' import type { Opts } from '@safe-global/safe-apps-sdk' import { type Connector, - ProviderNotFoundError, createConnector, + ProviderNotFoundError, } from '@wagmi/core' import type { Compute } from '@wagmi/core/internal' import { getAddress, withTimeout } from 'viem' @@ -45,7 +45,7 @@ export function safe(parameters: SafeParameters = {}) { id: 'safe', name: 'Safe', type: safe.type, - async connect() { + async connect({ withCapabilities } = {}) { const provider = await this.getProvider() if (!provider) throw new ProviderNotFoundError() @@ -60,7 +60,13 @@ export function safe(parameters: SafeParameters = {}) { // Remove disconnected shim if it exists if (shimDisconnect) await config.storage?.removeItem('safe.disconnected') - return { accounts, chainId } + return { + // TODO(v3): Make `withCapabilities: true` default behavior + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + chainId, + } }, async disconnect() { const provider = await this.getProvider() @@ -89,7 +95,14 @@ export function safe(parameters: SafeParameters = {}) { if (!isIframe) return if (!provider_) { - const { default: SDK } = await import('@safe-global/safe-apps-sdk') + const { default: SDK } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@safe-global/safe-apps-sdk') + } catch { + throw new Error('dependency "@safe-global/safe-apps-sdk" not found') + } + })() const sdk = new SDK(parameters) // `getInfo` hangs when not used in Safe App iFrame @@ -101,7 +114,16 @@ export function safe(parameters: SafeParameters = {}) { // 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') + const Provider = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@safe-global/safe-apps-provider') + } catch { + throw new Error( + 'dependency "@safe-global/safe-apps-provider" not found', + ) + } + })() if ( typeof Provider.SafeAppProvider !== 'function' && typeof Provider.default.SafeAppProvider === 'function' diff --git a/packages/connectors/src/version.ts b/packages/connectors/src/version.ts index d44e5a92df..668b35113e 100644 --- a/packages/connectors/src/version.ts +++ b/packages/connectors/src/version.ts @@ -1 +1 @@ -export const version = '5.7.12' +export const version = '7.1.2' diff --git a/packages/connectors/src/walletConnect.test.ts b/packages/connectors/src/walletConnect.test.ts index 4e8a74ebfe..960d02a18b 100644 --- a/packages/connectors/src/walletConnect.test.ts +++ b/packages/connectors/src/walletConnect.test.ts @@ -1,5 +1,5 @@ import { config, walletConnectProjectId } from '@wagmi/test' -import { http, HttpResponse } from 'msw' +import { HttpResponse, http } from 'msw' import { setupServer } from 'msw/node' import { afterAll, diff --git a/packages/connectors/src/walletConnect.ts b/packages/connectors/src/walletConnect.ts index fc4f794c1f..d5a3d622df 100644 --- a/packages/connectors/src/walletConnect.ts +++ b/packages/connectors/src/walletConnect.ts @@ -1,22 +1,22 @@ import { ChainNotConfiguredError, type Connector, - ProviderNotFoundError, createConnector, extractRpcUrls, + ProviderNotFoundError, } from '@wagmi/core' import type { Compute, ExactPartial, Omit } from '@wagmi/core/internal' import type { EthereumProvider } from '@walletconnect/ethereum-provider' import { type AddEthereumChainParameter, type Address, + getAddress, + numberToHex, type ProviderConnectInfo, type ProviderRpcError, type RpcError, SwitchChainError, UserRejectedRequestError, - getAddress, - numberToHex, } from 'viem' type WalletConnectConnector = Connector & { @@ -78,12 +78,16 @@ export function walletConnect(parameters: WalletConnectParameters) { type Provider = Awaited> type Properties = { - connect(parameters?: { + // TODO(v3): Make `withCapabilities: true` default behavior + connect(parameters?: { chainId?: number | undefined isReconnecting?: boolean | undefined pairingTopic?: string | undefined + withCapabilities?: withCapabilities | boolean | undefined }): Promise<{ - accounts: readonly Address[] + accounts: withCapabilities extends true + ? readonly { address: Address }[] + : readonly Address[] chainId: number }> getNamespaceChainsIds(): number[] @@ -126,7 +130,7 @@ export function walletConnect(parameters: WalletConnectParameters) { provider.on('session_delete', sessionDelete) } }, - async connect({ chainId, ...rest } = {}) { + async connect({ chainId, withCapabilities, ...rest } = {}) { try { const provider = await this.getProvider() if (!provider) throw new ProviderNotFoundError() @@ -167,7 +171,23 @@ export function walletConnect(parameters: WalletConnectParameters) { // 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() + + // Switch to chain if provided + let currentChainId = await this.getChainId() + if (chainId && currentChainId !== chainId) { + const chain = await this.switchChain!({ chainId }).catch( + (error: RpcError) => { + if ( + error.code === UserRejectedRequestError.code && + (error.cause as RpcError | undefined)?.message !== + 'Missing or invalid. request() method: wallet_addEthereumChain' + ) + throw error + return { id: currentChainId } + }, + ) + currentChainId = chain?.id ?? currentChainId + } if (displayUri) { provider.removeListener('display_uri', displayUri) @@ -194,7 +214,12 @@ export function walletConnect(parameters: WalletConnectParameters) { provider.on('session_delete', sessionDelete) } - return { accounts, chainId: currentChainId } + return { + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + chainId: currentChainId, + } } catch (error) { if ( /(user rejected|connection request reset)/i.test( @@ -245,9 +270,16 @@ export function walletConnect(parameters: WalletConnectParameters) { async function initProvider() { const optionalChains = config.chains.map((x) => x.id) as [number] if (!optionalChains.length) return - const { EthereumProvider } = await import( - '@walletconnect/ethereum-provider' - ) + const { EthereumProvider } = await (() => { + // safe webpack optional peer dependency dynamic import + try { + return import('@walletconnect/ethereum-provider') + } catch { + throw new Error( + 'dependency "@walletconnect/ethereum-provider" not found', + ) + } + })() return await EthereumProvider.init({ ...parameters, disableProviderPing: true, @@ -311,7 +343,9 @@ export function walletConnect(parameters: WalletConnectParameters) { new Promise((resolve) => { const listener = ({ chainId: currentChainId, - }: { chainId?: number | undefined }) => { + }: { + chainId?: number | undefined + }) => { if (currentChainId === chainId) { config.emitter.off('change', listener) resolve() @@ -424,7 +458,7 @@ export function walletConnect(parameters: WalletConnectParameters) { getNamespaceChainsIds() { if (!provider_) return [] const chainIds = provider_.session?.namespaces[NAMESPACE]?.accounts?.map( - (account) => Number.parseInt(account.split(':')[1] || ''), + (account) => Number.parseInt(account.split(':')[1] || '', 10), ) return chainIds ?? [] }, diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2747e5b253..65aebaeff8 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,217 @@ # @wagmi/core +## 3.2.2 + +### Patch Changes + +- Updated query internals. ([`4fefa57`](https://github.com/wevm/wagmi/commit/4fefa576014820b454344b579282ddecde5c7994)) + +## 3.2.1 + +### Patch Changes + +- `wagmi/tempo`: Fixed issue where `webAuthn` connector was not adhering to chain-specific `prepareTransactionRequest` phases. ([#4939](https://github.com/wevm/wagmi/pull/4939)) + +## 3.2.0 + +### Minor Changes + +- Updated to `viem@2.44.0` with Tempo Moderato support. ([#4940](https://github.com/wevm/wagmi/pull/4940)) + + **Breaking Changes (Tempo)** + + - Renamed `reward.start` → `reward.distribute` (no longer supports streaming) + - Renamed `reward.startSync` → `reward.distributeSync` + - Renamed `reward.getTotalPerSecond` → `reward.getGlobalRewardPerToken` + - Renamed `reward.watchRewardScheduled` → `reward.watchRewardDistributed` + - Removed `nonce.getNonceKeyCount` + - Removed `nonce.watchActiveKeyCountChanged` + - Removed `amm.watchFeeSwap` (FeeSwap event no longer emitted by protocol) + + **New Features (Tempo)** + + - Added `dex.cancelStale` action to cancel stale orders from restricted makers + - Added `dex.cancelStaleSync` action + - Added `salt` parameter to `token.create` + +## 3.1.0 + +### Minor Changes + +- Added first-class support and extension for [Tempo](https://docs.tempo.xyz) via `/tempo` entrypoint. ([#4922](https://github.com/wevm/wagmi/pull/4922)) + +## 3.0.2 + +### Patch Changes + +- Fixed `config.connectors` type inference ([#4923](https://github.com/wevm/wagmi/pull/4923)) + +## 3.0.1 + +### Patch Changes + +- Fixed `readContract` return type inference for ABI function overloads. ([`058c8c1`](https://github.com/wevm/wagmi/commit/058c8c18459a69a4aa2141e34640273a06a819f4)) + +## 3.0.0 + +### Major Changes + +- All connector dependencies are now optional peer dependencies. This means that if you want to use a specific connector, you need to install its required dependencies. ([#4857](https://github.com/wevm/wagmi/pull/4857)) + + #### baseAccount + + [`baseAccount`](https://wagmi.sh/core/api/connectors/baseAccount) requires `@base-org/account` + + ``` + pnpm add @base-org/account@~2.4.0 + ``` + + #### coinbaseWallet + + [`coinbaseWallet`](https://wagmi.sh/core/api/connectors/coinbaseWallet) requires `@coinbase/wallet-sdk` + + ``` + pnpm add @coinbase/wallet-sdk@~4.3.6 + ``` + + #### gemini + + [`gemini`](https://wagmi.sh/core/api/connectors/gemini) requires `@gemini-wallet/core` + + ``` + pnpm add @gemini-wallet/core@~0.3.1 + ``` + + #### metaMask + + [`metaMask`](https://wagmi.sh/core/api/connectors/metaMask) requires `@metamask/sdk` + + ``` + pnpm add @metamask/sdk@~0.33.1 + ``` + + #### porto + + [`porto`](https://wagmi.sh/core/api/connectors/porto) requires `porto` + + ``` + pnpm add porto@~0.2.35 + ``` + + #### safe + + [`safe`](https://wagmi.sh/core/api/connectors/safe) requires `@safe-global/safe-apps-provider` and `@safe-global/safe-apps-sdk` + + ``` + pnpm add @safe-global/safe-apps-provider@~0.18.6 @safe-global/safe-apps-sdk@~9.1.0 + ``` + + #### walletConnect + + [`walletConnect`](https://wagmi.sh/core/api/connectors/walletConnect) requires `walletconnect/ethereum-provider` + + ``` + pnpm add @walletconnect/ethereum-provider@~2.21.1 + ``` + +## 2.22.1 + +### Patch Changes + +- Fixed passing `account` in `waitForTransactionReceipt` for reverted transaction. ([#4832](https://github.com/wevm/wagmi/pull/4832)) + +## 2.22.0 + +### Minor Changes + +- Added `sendTransactionSync` and `sendCallsSync` Actions. ([#4823](https://github.com/wevm/wagmi/pull/4823)) + +## 2.21.2 + +### Patch Changes + +- Added `assertChainId` parameter to `getConnectorClient`. ([`866aeb0`](https://github.com/wevm/wagmi/commit/866aeb0e6361ef9114246e50149c1077bc05bf10)) + +## 2.21.1 + +### Patch Changes + +- Fixed `getConnectors` comparison ([#4792](https://github.com/wevm/wagmi/pull/4792)) + +## 2.21.0 + +### Minor Changes + +- [#4784](https://github.com/wevm/wagmi/pull/4784) [`8736133a13eb82099e20468b735525a266fdfd6c`](https://github.com/wevm/wagmi/commit/8736133a13eb82099e20468b735525a266fdfd6c) Thanks [@tmm](https://github.com/tmm)! - Added `withCapabilities` option to `connect` for exposing response capabilities. + +## 2.20.3 + +### Patch Changes + +- [#4752](https://github.com/wevm/wagmi/pull/4752) [`ce06e137e7bfaf000464b1cecd6c86e19a66ebcf`](https://github.com/wevm/wagmi/commit/ce06e137e7bfaf000464b1cecd6c86e19a66ebcf) Thanks [@iamakulov](https://github.com/iamakulov)! - Fixed `deepEqual` crashing for objects with no prototype + +## 2.20.2 + +### Patch Changes + +- [#4733](https://github.com/wevm/wagmi/pull/4733) [`986b96427a4bb743d2673dfbc7e8cb5041316db3`](https://github.com/wevm/wagmi/commit/986b96427a4bb743d2673dfbc7e8cb5041316db3) Thanks [@effie-ms](https://github.com/effie-ms)! - Fixed `getConnectorClient` chain ID race condition. + +## 2.20.1 + +### Patch Changes + +- [#4773](https://github.com/wevm/wagmi/pull/4773) [`d4c367ca46c508598c997cf229a31593a1e2b8b8`](https://github.com/wevm/wagmi/commit/d4c367ca46c508598c997cf229a31593a1e2b8b8) Thanks [@tmm](https://github.com/tmm)! - Fixed issue with codegen actions/hooks, where `syncConnectedChain: false` did not work as intended. + +## 2.20.0 + +### Minor Changes + +- [#4770](https://github.com/wevm/wagmi/pull/4770) [`a13aa2b68890f180f6ac3f741cbb9817494cb66c`](https://github.com/wevm/wagmi/commit/a13aa2b68890f180f6ac3f741cbb9817494cb66c) Thanks [@tmm](https://github.com/tmm)! - Added internal `revalidate` function. + +## 2.19.0 + +### Minor Changes + +- [#4756](https://github.com/wevm/wagmi/pull/4756) [`b5f017dbc707729eb0b36d617352be224d1139d4`](https://github.com/wevm/wagmi/commit/b5f017dbc707729eb0b36d617352be224d1139d4) Thanks [@plusminushalf](https://github.com/plusminushalf)! - Added `getAction` to `sendCalls` and `getCallsStatus` + +## 2.18.1 + +### Patch Changes + +- [#4704](https://github.com/wevm/wagmi/pull/4704) [`6514ba29a5acb918773235fed0238d7d679d06d5`](https://github.com/wevm/wagmi/commit/6514ba29a5acb918773235fed0238d7d679d06d5) Thanks [@iceanddust](https://github.com/iceanddust)! - Added missing `from` address to the `wallet_sendCalls` handler in the `mock` connector + +## 2.18.0 + +### Minor Changes + +- [#4734](https://github.com/wevm/wagmi/pull/4734) [`eac550ae5b49f96a7e3404a6d88adc62d3889013`](https://github.com/wevm/wagmi/commit/eac550ae5b49f96a7e3404a6d88adc62d3889013) Thanks [@jxom](https://github.com/jxom)! - Added `baseAccount` connector. + +## 2.17.3 + +### Patch Changes + +- [#4700](https://github.com/wevm/wagmi/pull/4700) [`7ce242b549d8cc78e6c319d9ee419693da36704c`](https://github.com/wevm/wagmi/commit/7ce242b549d8cc78e6c319d9ee419693da36704c) Thanks [@jade-u410](https://github.com/jade-u410)! - Updated `@coinbase/wallet-sdk` to 4.3.3 + +## 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 diff --git a/packages/core/package.json b/packages/core/package.json index a63d491953..ef21b86308 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@wagmi/core", "description": "VanillaJS library for Ethereum", - "version": "2.16.7", + "version": "3.2.2", "license": "MIT", "repository": { "type": "git", @@ -9,10 +9,10 @@ "directory": "packages/core" }, "scripts": { - "build": "pnpm run clean && pnpm run build:esm+types", + "build": "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", + "clean": "rm -rf dist tsconfig.tsbuildinfo actions chains codegen internal query tempo", "test:build": "publint --strict && attw --pack --ignore-rules cjs-resolves-to-esm" }, "files": [ @@ -23,9 +23,9 @@ "!src/**/*.test-d.ts", "/actions", "/chains", - "/experimental", "/internal", - "/query" + "/query", + "/tempo" ], "sideEffects": false, "type": "module", @@ -49,10 +49,6 @@ "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" @@ -61,27 +57,47 @@ "types": "./dist/types/exports/query.d.ts", "default": "./dist/esm/exports/query.js" }, + "./tempo": { + "types": "./dist/types/exports/tempo.d.ts", + "default": "./dist/esm/exports/tempo.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"] + "actions": [ + "./dist/types/exports/actions.d.ts" + ], + "chains": [ + "./dist/types/exports/chains.d.ts" + ], + "codegen": [ + "./dist/types/exports/codegen.d.ts" + ], + "internal": [ + "./dist/types/exports/internal.d.ts" + ], + "query": [ + "./dist/types/exports/query.d.ts" + ], + "tempo": [ + "./dist/types/exports/tempo.d.ts" + ] } }, "peerDependencies": { "@tanstack/query-core": ">=5.0.0", - "typescript": ">=5.0.4", + "ox": ">=0.11.1", + "typescript": ">=5.7.3", "viem": "2.x" }, "peerDependenciesMeta": { "@tanstack/query-core": { "optional": true }, + "ox": { + "optional": true + }, "typescript": { "optional": true } @@ -92,9 +108,20 @@ "zustand": "5.0.0" }, "devDependencies": { - "@tanstack/query-core": "catalog:" + "@tanstack/query-core": "catalog:", + "ox": "catalog:" }, - "contributors": ["awkweb.eth ", "jxom.eth "], + "contributors": [ + "awkweb.eth ", + "jxom.eth " + ], "funding": "https://github.com/sponsors/wevm", - "keywords": ["wagmi", "eth", "ethereum", "dapps", "wallet", "web3"] + "keywords": [ + "wagmi", + "eth", + "ethereum", + "dapps", + "wallet", + "web3" + ] } diff --git a/packages/core/src/actions/call.test.ts b/packages/core/src/actions/call.test.ts index fb8cfc9030..c0024c90d6 100644 --- a/packages/core/src/actions/call.test.ts +++ b/packages/core/src/actions/call.test.ts @@ -76,12 +76,12 @@ test('insufficient funds', async () => { - \`value\` is the amount of ether to send to the recipient. Raw Call Arguments: - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 - to: 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 + to: 0x1D5D7e139A994CeE7f360be398Ef032fE5D74fce value: 100000 ETH Details: Insufficient funds for gas * price + value - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) @@ -98,13 +98,13 @@ test('maxFeePerGas less than maxPriorityFeePerGas', async () => { [CallExecutionError: The provided tip (\`maxPriorityFeePerGas\` = 22 gwei) cannot be higher than the fee cap (\`maxFeePerGas\` = 20 gwei). Raw Call Arguments: - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2 data: 0x06fdde03 maxFeePerGas: 20 gwei maxPriorityFeePerGas: 22 gwei - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) @@ -116,15 +116,15 @@ test('contract revert (contract error)', async () => { to: address.wagmiMintExample, }), ).rejects.toThrowErrorMatchingInlineSnapshot(` - [CallExecutionError: Execution reverted with reason: revert: Token ID is taken. + [CallExecutionError: Execution reverted with reason: Token ID is taken. Raw Call Arguments: - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2 data: 0xa0712d6800000000000000000000000000000000000000000000000000000000000001a4 - Details: execution reverted: revert: Token ID is taken - Version: viem@2.23.12] + Details: execution reverted: Token ID is taken + Version: viem@2.44.0] `) }) @@ -139,11 +139,11 @@ test('contract revert (insufficient params)', async () => { [CallExecutionError: Execution reverted for an unknown reason. Raw Call Arguments: - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 to: 0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2 data: 0xa0712d68 Details: execution reverted - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) diff --git a/packages/core/src/actions/codegen/createReadContract.test.ts b/packages/core/src/actions/codegen/createReadContract.test.ts index 9de7ae718f..d43856e936 100644 --- a/packages/core/src/actions/codegen/createReadContract.test.ts +++ b/packages/core/src/actions/codegen/createReadContract.test.ts @@ -14,7 +14,7 @@ test('default', async () => { functionName: 'balanceOf', args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], }), - ).resolves.toMatchInlineSnapshot('4n') + ).resolves.toMatchInlineSnapshot('10n') }) test('multichain', async () => { @@ -32,7 +32,7 @@ test('multichain', async () => { args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], chainId: chain.mainnet2.id, }), - ).resolves.toMatchInlineSnapshot('4n') + ).resolves.toMatchInlineSnapshot('10n') }) test('functionName', async () => { @@ -46,5 +46,5 @@ test('functionName', async () => { readWagmiMintExampleBalanceOf(config, { args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], }), - ).resolves.toMatchInlineSnapshot('4n') + ).resolves.toMatchInlineSnapshot('10n') }) diff --git a/packages/core/src/actions/codegen/createReadContract.ts b/packages/core/src/actions/codegen/createReadContract.ts index f7dbfbed45..32c14da4bb 100644 --- a/packages/core/src/actions/codegen/createReadContract.ts +++ b/packages/core/src/actions/codegen/createReadContract.ts @@ -7,7 +7,6 @@ import type { 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, @@ -76,11 +75,8 @@ export function createReadContract< 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 + (parameters as { chainId?: number })?.chainId ?? configChainId return readContract(config, { ...(parameters as any), ...(c.functionName ? { functionName: c.functionName } : {}), diff --git a/packages/core/src/actions/codegen/createSimulateContract.test-d.ts b/packages/core/src/actions/codegen/createSimulateContract.test-d.ts index 91e5998977..764d3075f9 100644 --- a/packages/core/src/actions/codegen/createSimulateContract.test-d.ts +++ b/packages/core/src/actions/codegen/createSimulateContract.test-d.ts @@ -1,5 +1,5 @@ import { abi, config, mainnet, optimism } from '@wagmi/test' -import { http, type Address } from 'viem' +import { type Address, http } from 'viem' import { celo } from 'viem/chains' import { assertType, expectTypeOf, test } from 'vitest' diff --git a/packages/core/src/actions/codegen/createSimulateContract.test.ts b/packages/core/src/actions/codegen/createSimulateContract.test.ts index bd37d13770..94fc041d30 100644 --- a/packages/core/src/actions/codegen/createSimulateContract.test.ts +++ b/packages/core/src/actions/codegen/createSimulateContract.test.ts @@ -3,6 +3,7 @@ import { expect, test } from 'vitest' import { connect } from '../connect.js' import { disconnect } from '../disconnect.js' +import { switchChain } from '../switchChain.js' import { createSimulateContract } from './createSimulateContract.js' const connector = config.connectors[0]! @@ -33,7 +34,7 @@ test('default', async () => { }, ], "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "json-rpc", }, "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -60,6 +61,15 @@ test('multichain', async () => { abi: abi.wagmiMintExample, }) + await expect( + simulateWagmiMintExample(config, { + functionName: 'mint', + }), + ).resolves.toMatchObject({ + chainId: 1, + }) + + await switchChain(config, { chainId: chain.mainnet2.id }) await expect( simulateWagmiMintExample(config, { functionName: 'mint', @@ -79,7 +89,7 @@ test('multichain', async () => { }, ], "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "json-rpc", }, "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -92,6 +102,7 @@ test('multichain', async () => { } `) + await switchChain(config, { chainId: chain.mainnet.id }) await disconnect(config, { connector }) }) @@ -120,7 +131,7 @@ test('functionName', async () => { }, ], "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "json-rpc", }, "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", diff --git a/packages/core/src/actions/codegen/createSimulateContract.ts b/packages/core/src/actions/codegen/createSimulateContract.ts index 016384e245..efdbe0cd39 100644 --- a/packages/core/src/actions/codegen/createSimulateContract.ts +++ b/packages/core/src/actions/codegen/createSimulateContract.ts @@ -15,7 +15,6 @@ import type { 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, @@ -98,11 +97,8 @@ export function createSimulateContract< 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 + (parameters as { chainId?: number })?.chainId ?? configChainId return simulateContract(config, { ...(parameters as any), ...(c.functionName ? { functionName: c.functionName } : {}), diff --git a/packages/core/src/actions/codegen/createWatchContractEvent.test.ts b/packages/core/src/actions/codegen/createWatchContractEvent.test.ts index 19ba09b2a2..9dd13bafbb 100644 --- a/packages/core/src/actions/codegen/createWatchContractEvent.test.ts +++ b/packages/core/src/actions/codegen/createWatchContractEvent.test.ts @@ -1,4 +1,4 @@ -import { abi, address, chain, config } from '@wagmi/test' +import { abi, address, chain, config, wait } from '@wagmi/test' import type { WatchEventOnLogsParameter } from 'viem' import { test } from 'vitest' @@ -17,7 +17,9 @@ test('default', async () => { logs = logs.concat(next) }, }) + await wait(500) unwatch() + await wait(500) }) test('multichain', async () => { @@ -37,5 +39,7 @@ test('multichain', async () => { logs = logs.concat(next) }, }) + await wait(500) unwatch() + await wait(500) }) diff --git a/packages/core/src/actions/codegen/createWatchContractEvent.ts b/packages/core/src/actions/codegen/createWatchContractEvent.ts index 2817efc704..f9c701018c 100644 --- a/packages/core/src/actions/codegen/createWatchContractEvent.ts +++ b/packages/core/src/actions/codegen/createWatchContractEvent.ts @@ -2,7 +2,6 @@ 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, @@ -64,11 +63,8 @@ export function createWatchContractEvent< 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 + (parameters as { chainId?: number })?.chainId ?? configChainId return watchContractEvent(config, { ...(parameters as any), ...(c.eventName ? { eventName: c.eventName } : {}), diff --git a/packages/core/src/actions/codegen/createWriteContract.ts b/packages/core/src/actions/codegen/createWriteContract.ts index 6c1d891a3f..e02b51db94 100644 --- a/packages/core/src/actions/codegen/createWriteContract.ts +++ b/packages/core/src/actions/codegen/createWriteContract.ts @@ -19,7 +19,6 @@ import type { UnionCompute, UnionStrictOmit, } from '../../types/utils.js' -import { getAccount } from '../getAccount.js' import { getChainId } from '../getChainId.js' import { type WriteContractReturnType, @@ -86,10 +85,7 @@ export type CreateWriteContractReturnType< | undefined } : Compute>) & - ConnectorParameter & { - /** @deprecated */ - __mode?: 'prepared' - } + ConnectorParameter >, ) => Promise @@ -107,25 +103,10 @@ export function createWriteContract< ): 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 - + const chainId = (() => { + if (parameters.chainId) return parameters.chainId + return getChainId(config) + })() return writeContract(config, { ...(parameters as any), ...(c.functionName ? { functionName: c.functionName } : {}), diff --git a/packages/core/src/actions/connect.test-d.ts b/packages/core/src/actions/connect.test-d.ts index ad790b1209..00ff13b76c 100644 --- a/packages/core/src/actions/connect.test-d.ts +++ b/packages/core/src/actions/connect.test-d.ts @@ -1,5 +1,5 @@ -import { accounts } from '@wagmi/test' -import { http } from 'viem' +import { accounts, config as testConfig } from '@wagmi/test' +import { type Address, type Hex, http } from 'viem' import { mainnet } from 'viem/chains' import { expectTypeOf, test } from 'vitest' @@ -46,3 +46,46 @@ test('parameters: connector (Connector)', () => { > expectTypeOf().toEqualTypeOf() }) + +test('parameters: withCapabilities', async () => { + const connectorFn = mock({ accounts }) + + const res0 = await connect(config, { connector: connectorFn }) + expectTypeOf(res0.accounts).toEqualTypeOf() + + const res1 = await connect(config, { + connector: connectorFn, + withCapabilities: false, + }) + expectTypeOf(res1.accounts).toEqualTypeOf() + + const res2 = await connect(config, { + connector: connectorFn, + withCapabilities: true, + }) + expectTypeOf(res2.accounts).toEqualTypeOf< + readonly [ + { + address: Address + capabilities: { + foo: { bar: Hex } + } + }, + ...{ + address: Address + capabilities: { + foo: { bar: Hex } + } + }[], + ] + >() +}) + +test('behavior: with config', () => { + connect(testConfig, { + connector: testConfig.connectors[0]!, + foo: 'bar', + }) + // @ts-expect-error + testConfig.connectors[4] +}) diff --git a/packages/core/src/actions/connect.test.ts b/packages/core/src/actions/connect.test.ts index a9c591895a..810a9a85c5 100644 --- a/packages/core/src/actions/connect.test.ts +++ b/packages/core/src/actions/connect.test.ts @@ -15,7 +15,7 @@ beforeEach(async () => { test('default', async () => { await expect(connect(config, { connector })).resolves.toMatchObject( expect.objectContaining({ - accounts: expect.any(Array), + accounts: expect.arrayContaining([expect.any(String)]), chainId: expect.any(Number), }), ) @@ -25,7 +25,7 @@ test('parameters: chainId', async () => { const chainId = chain.mainnet2.id await expect(connect(config, { connector, chainId })).resolves.toMatchObject( expect.objectContaining({ - accounts: expect.any(Array), + accounts: expect.arrayContaining([expect.any(String)]), chainId, }), ) @@ -37,13 +37,30 @@ test('parameters: connector', async () => { connect(config, { connector: connector_ }), ).resolves.toMatchObject( expect.objectContaining({ - accounts: expect.any(Array), + accounts: expect.arrayContaining([expect.any(String)]), chainId: expect.any(Number), }), ) await disconnect(config, { connector: connector_ }) }) +test('parameters: withCapabilities', async () => { + await expect( + connect(config, { connector, withCapabilities: true }), + ).resolves.toMatchObject( + expect.objectContaining({ + accounts: expect.arrayContaining([ + expect.objectContaining({ + address: expect.any(String), + capabilities: expect.objectContaining({ + foo: expect.objectContaining({ bar: expect.any(String) }), + }), + }), + ]), + }), + ) +}) + test('behavior: user rejected request', async () => { const connector_ = config._internal.connectors.setup( mock({ @@ -57,7 +74,7 @@ test('behavior: user rejected request', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to connect. - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) diff --git a/packages/core/src/actions/connect.ts b/packages/core/src/actions/connect.ts index f69809e504..ae9bf93a5c 100644 --- a/packages/core/src/actions/connect.ts +++ b/packages/core/src/actions/connect.ts @@ -19,6 +19,7 @@ export type ConnectParameters< connector extends Connector | CreateConnectorFn = | Connector | CreateConnectorFn, + withCapabilities extends boolean = false, /// parameters extends unknown | undefined = | (connector extends CreateConnectorFn @@ -36,12 +37,46 @@ export type ConnectParameters< > = Compute< ChainIdParameter & { connector: connector | CreateConnectorFn + withCapabilities?: withCapabilities | boolean | undefined } > & parameters -export type ConnectReturnType = { - accounts: readonly [Address, ...Address[]] +export type ConnectReturnType< + config extends Config = Config, + connector extends Connector | CreateConnectorFn = + | Connector + | CreateConnectorFn, + withCapabilities extends boolean = false, + /// + capabilities extends unknown | undefined = + | (connector extends CreateConnectorFn + ? Awaited< + ReturnType['connect']> + >['accounts'] extends + | readonly Address[] + | readonly { + capabilities: infer capabilities + }[] + ? capabilities + : Record + : never) + | (connector extends Connector + ? Awaited>['accounts'] extends + | readonly Address[] + | readonly { + capabilities: infer capabilities + }[] + ? capabilities + : Record + : never), +> = { + accounts: withCapabilities extends true + ? readonly [ + { address: Address; capabilities: capabilities }, + ...{ address: Address; capabilities: capabilities }[], + ] + : readonly [Address, ...Address[]] chainId: | config['chains'][number]['id'] | (number extends config['chains'][number]['id'] ? number : number & {}) @@ -60,10 +95,11 @@ export type ConnectErrorType = export async function connect< config extends Config, connector extends Connector | CreateConnectorFn, + withCapabilities extends boolean = false, >( config: config, - parameters: ConnectParameters, -): Promise> { + parameters: ConnectParameters, +): Promise> { // "Register" connector if not already created let connector: Connector if (typeof parameters.connector === 'function') { @@ -80,7 +116,6 @@ export async function connect< 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) @@ -90,7 +125,11 @@ export async function connect< config.setState((x) => ({ ...x, connections: new Map(x.connections).set(connector.uid, { - accounts, + accounts: (rest.withCapabilities + ? data.accounts.map((account) => + typeof account === 'object' ? account.address : account, + ) + : data.accounts) as readonly [Address, ...Address[]], chainId: data.chainId, connector: connector, }), @@ -98,7 +137,18 @@ export async function connect< status: 'connected', })) - return { accounts, chainId: data.chainId } + return { + // TODO(v3): Remove `withCapabilities: true` default behavior so remove compat marshalling + // Workaround so downstream connectors work with `withCapabilities` without any changes required + accounts: (rest.withCapabilities + ? data.accounts.map((address) => + typeof address === 'object' + ? address + : { address, capabilities: {} }, + ) + : data.accounts) as never, + chainId: data.chainId, + } } catch (error) { config.setState((x) => ({ ...x, diff --git a/packages/core/src/actions/deployContract.test.ts b/packages/core/src/actions/deployContract.test.ts index 06b545a77e..9a97f1394b 100644 --- a/packages/core/src/actions/deployContract.test.ts +++ b/packages/core/src/actions/deployContract.test.ts @@ -56,11 +56,11 @@ test('behavior: no funds', async () => { Request Arguments: chain: undefined (id: 1) - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 data: 0x608060405260405180602001604052806000815250600b90805190602001906200002b92919062000484565b506000600f60006101000a81548160ff0219169083151502179055503480156200005457600080fd5b50604051620046d0380380620046d0833981810160405260808110156200007a57600080fd5b81019080805160405193929190846401000000008211156200009b57600080fd5b83820191506020820185811115620000b257600080fd5b8251866001820283011164010000000082111715620000d057600080fd5b8083526020830192505050908051906020019080838360005b8381101562000106578082015181840152602081019050620000e9565b50505050905090810190601f168015620001345780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200015857600080fd5b838201915060208201858111156200016f57600080fd5b82518660018202830111640100000000821117156200018d57600080fd5b8083526020830192505050908051906020019080838360005b83811015620001c3578082015181840152602081019050620001a6565b50505050905090810190601f168015620001f15780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291905050508383620002296301ffc9a760e01b6200037360201b60201c565b81600690805190602001906200024192919062000484565b5080600790805190602001906200025a92919062000484565b50620002736380ac58cd60e01b6200037360201b60201c565b6200028b635b5e139f60e01b6200037360201b60201c565b620002a363780e9d6360e01b6200037360201b60201c565b50506000620002b76200047c60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600e81905550620bdd808101601081905550505050506200052a565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433136353a20696e76616c696420696e746572666163652069640000000081525060200191505060405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620004c757805160ff1916838001178555620004f8565b82800160010185558215620004f8579182015b82811115620004f7578251825591602001919060010190620004da565b5b5090506200050791906200050b565b5090565b5b80821115620005265760008160009055506001016200050c565b5090565b614196806200053a6000396000f3fe60806040526004361061021a5760003560e01c80636c0360eb11610123578063b0f67427116100ab578063e36d64981161006f578063e36d649814610ddf578063e985e9c514610e0a578063e986655014610e91578063eb8d244414610ea8578063f2fde38b14610ed55761021a565b8063b0f6742714610bac578063b88d4fde14610bc3578063bb8a16bd14610cd5578063c87b56dd14610d00578063cb774d4714610db45761021a565b80637d17fcbe116100f25780637d17fcbe14610a395780638da5cb5b14610a5057806395d89b4114610a91578063a22cb46514610b21578063a723533e14610b7e5761021a565b80636c0360eb1461090257806370a0823114610992578063715018a6146109f75780637a3f451e14610a0e5761021a565b80632f745c59116101a65780634f6ccce7116101755780634f6ccce7146106cb57806355f804b31461071a578063571dff3b146107e2578063607e20e31461080d5780636352211e1461089d5761021a565b80632f745c59146105b357806334918dfd146106225780633ccfd60b1461063957806342842e0e146106505761021a565b8063095ea7b3116101ed578063095ea7b3146103bf578063109695231461041a57806318160ddd146104e257806318e20a381461050d57806323b872dd146105385761021a565b8063018a2c371461021f57806301ffc9a71461025a57806306fdde03146102ca578063081812fc1461035a575b600080fd5b34801561022b57600080fd5b506102586004803603602081101561024257600080fd5b8101908080359060200190929190505050610f26565b005b34801561026657600080fd5b506102b26004803603602081101561027d57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610fdf565b60405180821515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611046565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561031f578082015181840152602081019050610304565b50505050905090810190601f16801561034c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036657600080fd5b506103936004803603602081101561037d57600080fd5b81019080803590602001909291905050506110e8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103cb57600080fd5b50610418600480360360408110156103e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611183565b005b34801561042657600080fd5b506104e06004803603602081101561043d57600080fd5b810190808035906020019064010000000081111561045a57600080fd5b82018360208201111561046c57600080fd5b8035906020019184600183028401116401000000008311171561048e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506112c7565b005b3480156104ee57600080fd5b506104f7611390565b6040518082815260200191505060405180910390f35b34801561051957600080fd5b506105226113a1565b6040518082815260200191505060405180910390f35b34801561054457600080fd5b506105b16004803603606081101561055b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156105bf57600080fd5b5061060c600480360360408110156105d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141d565b6040518082815260200191505060405180910390f35b34801561062e57600080fd5b50610637611478565b005b34801561064557600080fd5b5061064e611553565b005b34801561065c57600080fd5b506106c96004803603606081101561067357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611651565b005b3480156106d757600080fd5b50610704600480360360208110156106ee57600080fd5b8101908080359060200190929190505050611671565b6040518082815260200191505060405180910390f35b34801561072657600080fd5b506107e06004803603602081101561073d57600080fd5b810190808035906020019064010000000081111561075a57600080fd5b82018360208201111561076c57600080fd5b8035906020019184600183028401116401000000008311171561078e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611694565b005b3480156107ee57600080fd5b506107f761174f565b6040518082815260200191505060405180910390f35b34801561081957600080fd5b50610822611754565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610862578082015181840152602081019050610847565b50505050905090810190601f16801561088f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108a957600080fd5b506108d6600480360360208110156108c057600080fd5b81019080803590602001909291905050506117f2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561090e57600080fd5b50610917611829565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561095757808201518184015260208101905061093c565b50505050905090810190601f1680156109845780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099e57600080fd5b506109e1600480360360208110156109b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118cb565b6040518082815260200191505060405180910390f35b348015610a0357600080fd5b50610a0c6119a0565b005b348015610a1a57600080fd5b50610a23611b10565b6040518082815260200191505060405180910390f35b348015610a4557600080fd5b50610a4e611b1c565b005b348015610a5c57600080fd5b50610a65611c4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a9d57600080fd5b50610aa6611c76565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ae6578082015181840152602081019050610acb565b50505050905090810190601f168015610b135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b2d57600080fd5b50610b7c60048036036040811015610b4457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611d18565b005b610baa60048036036020811015610b9457600080fd5b8101908080359060200190929190505050611ece565b005b348015610bb857600080fd5b50610bc1612127565b005b348015610bcf57600080fd5b50610cd360048036036080811015610be657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610c4d57600080fd5b820183602082011115610c5f57600080fd5b80359060200191846001830284011164010000000083111715610c8157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061220b565b005b348015610ce157600080fd5b50610cea612283565b6040518082815260200191505060405180910390f35b348015610d0c57600080fd5b50610d3960048036036020811015610d2357600080fd5b8101908080359060200190929190505050612289565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d79578082015181840152602081019050610d5e565b50505050905090810190601f168015610da65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dc057600080fd5b50610dc961255a565b6040518082815260200191505060405180910390f35b348015610deb57600080fd5b50610df4612560565b6040518082815260200191505060405180910390f35b348015610e1657600080fd5b50610e7960048036036040811015610e2d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612566565b60405180821515815260200191505060405180910390f35b348015610e9d57600080fd5b50610ea66125fa565b005b348015610eb457600080fd5b50610ebd612764565b60405180821515815260200191505060405180910390f35b348015610ee157600080fd5b50610f2460048036036020811015610ef857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612777565b005b610f2e61296c565b73ffffffffffffffffffffffffffffffffffffffff16610f4c611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614610fd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8060108190555050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b5050505050905090565b60006110f382612974565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061408b602c913960400191505060405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061118e826117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061410f6021913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661123461296c565b73ffffffffffffffffffffffffffffffffffffffff16148061126357506112628161125d61296c565b612566565b5b6112b8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526038815260200180613f956038913960400191505060405180910390fd5b6112c28383612991565b505050565b6112cf61296c565b73ffffffffffffffffffffffffffffffffffffffff166112ed611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600b908051906020019061138c929190613de6565b5050565b600061139c6002612a4a565b905090565b60105481565b6113b86113b261296c565b82612a5f565b61140d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b611418838383612b53565b505050565b600061147082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d9690919063ffffffff16565b905092915050565b61148061296c565b73ffffffffffffffffffffffffffffffffffffffff1661149e611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611527576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b61155b61296c565b73ffffffffffffffffffffffffffffffffffffffff16611579611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561164d573d6000803e3d6000fd5b5050565b61166c8383836040518060200160405280600081525061220b565b505050565b600080611688836002612db090919063ffffffff16565b50905080915050919050565b61169c61296c565b73ffffffffffffffffffffffffffffffffffffffff166116ba611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61174c81612ddc565b50565b601481565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117ea5780601f106117bf576101008083540402835291602001916117ea565b820191906000526020600020905b8154815290600101906020018083116117cd57829003601f168201915b505050505081565b600061182282604051806060016040528060298152602001613ff7602991396002612df69092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118c15780601f10611896576101008083540402835291602001916118c1565b820191906000526020600020905b8154815290600101906020018083116118a457829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613fcd602a913960400191505060405180910390fd5b611999600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e15565b9050919050565b6119a861296c565b73ffffffffffffffffffffffffffffffffffffffff166119c6611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611a4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b67011c37937e08000081565b611b2461296c565b73ffffffffffffffffffffffffffffffffffffffff16611b42611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614611bcb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600d5414611c43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b43600c81905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d0e5780601f10611ce357610100808354040283529160200191611d0e565b820191906000526020600020905b815481529060010190602001808311611cf157829003601f168201915b5050505050905090565b611d2061296c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4552433732313a20617070726f766520746f2063616c6c65720000000000000081525060200191505060405180910390fd5b8060056000611dce61296c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e7b61296c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b600f60009054906101000a900460ff16611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53616c65206d7573742062652061637469766520746f206d696e74204170650081525060200191505060405180910390fd5b6014811115611faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613f746021913960400191505060405180910390fd5b600e54611fc782611fb9611390565b612e2a90919063ffffffff16565b111561201e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806140426028913960400191505060405180910390fd5b3461203a8267011c37937e080000612eb290919063ffffffff16565b11156120ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45746865722076616c75652073656e74206973206e6f7420636f72726563740081525060200191505060405180910390fd5b60005b818110156120ef5760006120c3611390565b9050600e546120d0611390565b10156120e1576120e03382612f38565b5b5080806001019150506120b1565b506000600c541480156121175750600e54612108611390565b148061211657506010544210155b5b156121245743600c819055505b50565b61212f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661214d611c4c565b73ffffffffffffffffffffffffffffffffffffffff16146121d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006121e0611390565b905060005b601e811015612207576121fa33828401612f38565b80806001019150506121e5565b5050565b61221c61221661296c565b83612a5f565b612271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806141306031913960400191505060405180910390fd5b61227d84848484612f56565b50505050565b600e5481565b606061229482612974565b6122e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806140e0602f913960400191505060405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123925780601f1061236757610100808354040283529160200191612392565b820191906000526020600020905b81548152906001019060200180831161237557829003601f168201915b5050505050905060606123a3611829565b90506000815114156123b9578192505050612555565b60008251111561248a5780826040516020018083805190602001908083835b602083106123fb57805182526020820191506020810190506020830392506123d8565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061244c5780518252602082019150602081019050602083039250612429565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405292505050612555565b8061249485612fc8565b6040516020018083805190602001908083835b602083106124ca57805182526020820191506020810190506020830392506124a7565b6001836020036101000a03801982511681845116808217855250505050505090500182805190602001908083835b6020831061251b57805182526020820191506020810190506020830392506124f8565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052925050505b919050565b600d5481565b600c5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600d5414612672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5374617274696e6720696e64657820697320616c72656164792073657400000081525060200191505060405180910390fd5b6000600c5414156126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5374617274696e6720696e64657820626c6f636b206d7573742062652073657481525060200191505060405180910390fd5b600e54600c544060001c816126fc57fe5b06600d8190555060ff61271a600c544361310f90919063ffffffff16565b111561273a57600e54600143034060001c8161273257fe5b06600d819055505b6000600d5414156127625761275b6001600d54612e2a90919063ffffffff16565b600d819055505b565b600f60009054906101000a900460ff1681565b61277f61296c565b73ffffffffffffffffffffffffffffffffffffffff1661279d611c4c565b73ffffffffffffffffffffffffffffffffffffffff1614612826576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613ed86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600061298a82600261319290919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a04836117f2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612a58826000016131ac565b9050919050565b6000612a6a82612974565b612abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613f48602c913960400191505060405180910390fd5b6000612aca836117f2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b3957508373ffffffffffffffffffffffffffffffffffffffff16612b21846110e8565b73ffffffffffffffffffffffffffffffffffffffff16145b80612b4a5750612b498185612566565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b73826117f2565b73ffffffffffffffffffffffffffffffffffffffff1614612bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806140b76029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613efe6024913960400191505060405180910390fd5b612c708383836131bd565b612c7b600082612991565b612ccc81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131c290919063ffffffff16565b50612d1e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50612d35818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612da5836000018361322b565b60001c905092915050565b600080600080612dc386600001866132ae565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612df2929190613de6565b5050565b6000612e09846000018460001b84613347565b60001c90509392505050565b6000612e238260000161343d565b9050919050565b600080828401905083811015612ea8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080831415612ec55760009050612f32565b6000828402905082848281612ed657fe5b0414612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061406a6021913960400191505060405180910390fd5b809150505b92915050565b612f5282826040518060200160405280600081525061344e565b5050565b612f61848484612b53565b612f6d848484846134bf565b612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b50505050565b60606000821415613010576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061310a565b600082905060005b6000821461303a578080600101915050600a828161303257fe5b049150613018565b60608167ffffffffffffffff8111801561305357600080fd5b506040519080825280601f01601f1916602001820160405280156130865781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461310257600a84816130a757fe5b0660300160f81b828280600190039350815181106130c157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84816130fa57fe5b049350613095565b819450505050505b919050565b600082821115613187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525060200191505060405180910390fd5b818303905092915050565b60006131a4836000018360001b6136d8565b905092915050565b600081600001805490509050919050565b505050565b60006131d4836000018360001b6136fb565b905092915050565b60006131ee836000018360001b6137e3565b905092915050565b6000613222846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613853565b90509392505050565b60008183600001805490501161328c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613e846022913960400191505060405180910390fd5b82600001828154811061329b57fe5b9060005260206000200154905092915050565b60008082846000018054905011613310576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140206022913960400191505060405180910390fd5b600084600001848154811061332157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000808460010160008581526020019081526020016000205490506000811415839061340e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133d35780820151818401526020810190506133b8565b50505050905090810190601f1680156134005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061342157fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613458838361392f565b61346560008484846134bf565b6134ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613ea66032913960400191505060405180910390fd5b505050565b60006134e08473ffffffffffffffffffffffffffffffffffffffff16613b23565b6134ed57600190506136d0565b606061365763150b7a0260e01b61350261296c565b888787604051602401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561358657808201518184015260208101905061356b565b50505050905090810190601f1680156135b35780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613ea6603291398773ffffffffffffffffffffffffffffffffffffffff16613b369092919063ffffffff16565b9050600081806020019051602081101561367057600080fd5b8101908080519060200190929190505050905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146137d7576000600182039050600060018660000180549050039050600086600001828154811061374657fe5b906000526020600020015490508087600001848154811061376357fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061379b57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506137dd565b60009150505b92915050565b60006137ef8383613b4e565b61384857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061384d565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156138fa57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613928565b8285600001600183038154811061390d57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552433732313a206d696e7420746f20746865207a65726f206164647265737381525060200191505060405180910390fd5b6139db81612974565b15613a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000081525060200191505060405180910390fd5b613a5a600083836131bd565b613aab81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206131dc90919063ffffffff16565b50613ac2818360026131f69092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6060613b458484600085613b71565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606082471015613bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613f226026913960400191505060405180910390fd5b613bd585613b23565b613c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613c975780518252602082019150602081019050602083039250613c74565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cf9576040519150601f19603f3d011682016040523d82523d6000602084013e613cfe565b606091505b5091509150613d0e828286613d1a565b92505050949350505050565b60608315613d2a57829050613ddf565b600083511115613d3d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613da4578082015181840152602081019050613d89565b50505050905090810190601f168015613dd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613e2757805160ff1916838001178555613e55565b82800160010185558215613e55579182015b82811115613e54578251825591602001919060010190613e39565b5b509050613e629190613e66565b5090565b5b80821115613e7f576000816000905550600101613e67565b509056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d654552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e6473507572636861736520776f756c6420657863656564206d617820737570706c79206f662041706573536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b0e64d1fa6c4dbeb9c6f54607d7e1996943fe27624a80652f57b53fda084621b64736f6c63430007000033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006080e6d70000000000000000000000000000000000000000000000000000000000000011426f7265644170655961636874436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000010f2c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014426f72656420417065205761676d6920436c756200000000000000000000000000000000000000000000000000000000000000000000000000000000000000044241594300000000000000000000000000000000000000000000000000000000 Details: Insufficient funds for gas * price + value - Version: viem@2.23.12] + Version: viem@2.44.0] `) await disconnect(config, { connector }) diff --git a/packages/core/src/actions/deployContract.ts b/packages/core/src/actions/deployContract.ts index a688dd7cfd..34e476b098 100644 --- a/packages/core/src/actions/deployContract.ts +++ b/packages/core/src/actions/deployContract.ts @@ -72,6 +72,7 @@ export async function deployContract< else client = await getConnectorClient(config, { account: account ?? undefined, + assertChainId: false, chainId, connector, }) diff --git a/packages/core/src/actions/estimateFeesPerGas.test-d.ts b/packages/core/src/actions/estimateFeesPerGas.test-d.ts index dada2ea311..ad1f12e9aa 100644 --- a/packages/core/src/actions/estimateFeesPerGas.test-d.ts +++ b/packages/core/src/actions/estimateFeesPerGas.test-d.ts @@ -3,39 +3,36 @@ 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: { + // default + { + const result = await estimateFeesPerGas(config, {}) + expectTypeOf(result).toEqualTypeOf<{ gasPrice?: undefined - maxFeePerGas: string - maxPriorityFeePerGas: string - } - }>() + maxFeePerBlobGas?: undefined + maxFeePerGas: bigint + maxPriorityFeePerGas: bigint + }>() + } - const legacy = await estimateFeesPerGas(config, { type: 'legacy' }) - expectTypeOf(legacy).toMatchTypeOf<{ - gasPrice: bigint - maxFeePerGas?: undefined - maxPriorityFeePerGas?: undefined - formatted: { - gasPrice: string + // legacy + { + const result = await estimateFeesPerGas(config, { type: 'legacy' }) + expectTypeOf(result).toEqualTypeOf<{ + gasPrice: bigint + maxFeePerBlobGas?: undefined maxFeePerGas?: undefined maxPriorityFeePerGas?: undefined - } - }>() + }>() + } - const eip1559 = await estimateFeesPerGas(config, { type: 'eip1559' }) - expectTypeOf(eip1559).toMatchTypeOf<{ - gasPrice?: undefined - maxFeePerGas: bigint - maxPriorityFeePerGas: bigint - formatted: { + // eip1559 + { + const result = await estimateFeesPerGas(config, { type: 'eip1559' }) + expectTypeOf(result).toEqualTypeOf<{ gasPrice?: undefined - maxFeePerGas: string - maxPriorityFeePerGas: string - } - }>() + maxFeePerBlobGas?: undefined + maxFeePerGas: bigint + maxPriorityFeePerGas: bigint + }>() + } }) diff --git a/packages/core/src/actions/estimateFeesPerGas.test.ts b/packages/core/src/actions/estimateFeesPerGas.test.ts index 4c5d668b83..318cbec16c 100644 --- a/packages/core/src/actions/estimateFeesPerGas.test.ts +++ b/packages/core/src/actions/estimateFeesPerGas.test.ts @@ -7,7 +7,6 @@ test('default', async () => { const result = await estimateFeesPerGas(config) expect(Object.keys(result)).toMatchInlineSnapshot(` [ - "formatted", "gasPrice", "maxFeePerGas", "maxPriorityFeePerGas", diff --git a/packages/core/src/actions/estimateFeesPerGas.ts b/packages/core/src/actions/estimateFeesPerGas.ts index 66915f010a..cfe7119114 100644 --- a/packages/core/src/actions/estimateFeesPerGas.ts +++ b/packages/core/src/actions/estimateFeesPerGas.ts @@ -1,10 +1,4 @@ -import { - type Chain, - type FeeValuesEIP1559, - type FeeValuesLegacy, - type FeeValuesType, - formatUnits, -} from 'viem' +import type { Chain, FeeValuesType } from 'viem' import { type EstimateFeesPerGasErrorType as viem_EstimateFeesPerGasErrorType, type EstimateFeesPerGasParameters as viem_EstimateFeesPerGasParameters, @@ -14,11 +8,8 @@ import { 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 type { Compute, 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, @@ -28,23 +19,12 @@ export type EstimateFeesPerGasParameters< viem_EstimateFeesPerGasParameters, 'chain' > & - ChainIdParameter & { - /** @deprecated */ - formatUnits?: Unit | undefined - } + ChainIdParameter > export type EstimateFeesPerGasReturnType< type extends FeeValuesType = FeeValuesType, -> = Compute< - viem_EstimateFeesPerGasReturnType & { - /** @deprecated */ - formatted: UnionCompute< - | (type extends 'legacy' ? FeeValuesLegacy : never) - | (type extends 'eip1559' ? FeeValuesEIP1559 : never) - > - } -> +> = Compute> export type EstimateFeesPerGasErrorType = viem_EstimateFeesPerGasErrorType @@ -55,7 +35,7 @@ export async function estimateFeesPerGas< config: config, parameters: EstimateFeesPerGasParameters = {}, ): Promise> { - const { chainId, formatUnits: units = 'gwei', ...rest } = parameters + const { chainId, ...rest } = parameters const client = config.getClient({ chainId }) const action = getAction( @@ -69,17 +49,7 @@ export async function estimateFeesPerGas< 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, diff --git a/packages/core/src/actions/estimateGas.ts b/packages/core/src/actions/estimateGas.ts index c049fa42f8..391e84bc0d 100644 --- a/packages/core/src/actions/estimateGas.ts +++ b/packages/core/src/actions/estimateGas.ts @@ -61,6 +61,7 @@ export async function estimateGas< else { const connectorClient = await getConnectorClient(config, { account: parameters.account, + assertChainId: false, chainId, connector, }) diff --git a/packages/core/src/actions/getBalance.test.ts b/packages/core/src/actions/getBalance.test.ts index 954c09c2e6..df6c0632c1 100644 --- a/packages/core/src/actions/getBalance.test.ts +++ b/packages/core/src/actions/getBalance.test.ts @@ -21,82 +21,34 @@ beforeEach(async () => { test('default', async () => { await expect(getBalance(config, { address })).resolves.toMatchInlineSnapshot(` - { - "decimals": 18, - "formatted": "10000", - "symbol": "ETH", - "value": 10000000000000000000000n, - } - `) + { + "decimals": 18, + "symbol": "ETH", + "value": 10000000000000000000000n, + } + `) await testClient.mainnet.setBalance({ address, value: parseEther('6969.12222215666'), }) await expect(getBalance(config, { address })).resolves.toMatchInlineSnapshot(` - { - "decimals": 18, - "formatted": "6969.12222215666", - "symbol": "ETH", - "value": 6969122222156660000000n, - } - `) + { + "decimals": 18, + "symbol": "ETH", + "value": 6969122222156660000000n, + } + `) }) test('parameters: chainId', async () => { await expect( getBalance(config, { address, chainId: chain.mainnet2.id }), - ).resolves.toMatchInlineSnapshot(` - { - "decimals": 18, - "formatted": "420", - "symbol": "WAG", - "value": 420000000000000000000n, - } - `) -}) - -test('parameters: token', async () => { - await expect( - getBalance(config, { - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - token: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - }), - ).resolves.toMatchInlineSnapshot(` - { - "decimals": 18, - "formatted": "0.559062564299199392", - "symbol": "DAI", - "value": 559062564299199392n, - } - `) -}) - -test('parameters: token (bytes32 symbol)', async () => { - await expect( - getBalance(config, { - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - token: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', - }), ).resolves.toMatchInlineSnapshot(` { "decimals": 18, - "formatted": "0", - "symbol": "MKR", - "value": 0n, + "symbol": "WAG", + "value": 420000000000000000000n, } `) }) - -test('parameters: unit', async () => { - await expect( - getBalance(config, { address, unit: 'wei' }), - ).resolves.toMatchInlineSnapshot(` - { - "decimals": 18, - "formatted": "10000000000000000000000", - "symbol": "ETH", - "value": 10000000000000000000000n, - } - `) -}) diff --git a/packages/core/src/actions/getBalance.ts b/packages/core/src/actions/getBalance.ts index 1aae5667b1..ff1e79c6c0 100644 --- a/packages/core/src/actions/getBalance.ts +++ b/packages/core/src/actions/getBalance.ts @@ -1,4 +1,3 @@ -import { type Address, type Hex, formatUnits, hexToString, trim } from 'viem' import { type GetBalanceErrorType as viem_GetBalanceErrorType, type GetBalanceParameters as viem_GetBalanceParameters, @@ -7,26 +6,15 @@ import { 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 { getAction } from '../utils/getAction.js' -import { getUnit } from '../utils/getUnit.js' -import { type ReadContractsErrorType, readContracts } from './readContracts.js' export type GetBalanceParameters = Compute< - ChainIdParameter & - viem_GetBalanceParameters & { - /** @deprecated */ - token?: Address | undefined - /** @deprecated */ - unit?: Unit | undefined - } + ChainIdParameter & viem_GetBalanceParameters > export type GetBalanceReturnType = { decimals: number - /** @deprecated */ - formatted: string symbol: string value: bigint } @@ -38,45 +26,7 @@ export async function getBalance( config: config, parameters: GetBalanceParameters, ): Promise { - const { - address, - blockNumber, - blockTag, - chainId, - token: tokenAddress, - unit = 'ether', - } = parameters - - if (tokenAddress) { - try { - return await getTokenBalance(config, { - balanceAddress: address, - chainId, - symbolType: 'string', - tokenAddress, - }) - } catch (error) { - // In the chance that there is an error upon decoding the contract result, - // it could be likely that the contract data is represented as bytes32 instead - // of a string. - if ( - (error as ReadContractsErrorType).name === - 'ContractFunctionExecutionError' - ) { - const balance = await getTokenBalance(config, { - balanceAddress: address, - chainId, - symbolType: 'bytes32', - tokenAddress, - }) - const symbol = hexToString( - trim(balance.symbol as Hex, { dir: 'right' }), - ) - return { ...balance, symbol } - } - throw error - } - } + const { address, blockNumber, blockTag, chainId } = parameters const client = config.getClient({ chainId }) const action = getAction(client, viem_getBalance, 'getBalance') @@ -86,64 +36,7 @@ export async function getBalance( const chain = config.chains.find((x) => x.id === chainId) ?? client.chain! return { decimals: chain.nativeCurrency.decimals, - formatted: formatUnits(value, getUnit(unit)), symbol: chain.nativeCurrency.symbol, value, } } - -type GetTokenBalanceParameters = { - balanceAddress: Address - chainId?: number | undefined - symbolType: 'bytes32' | 'string' - tokenAddress: Address - unit?: Unit | undefined -} - -async function getTokenBalance( - config: Config, - parameters: GetTokenBalanceParameters, -) { - const { balanceAddress, chainId, symbolType, tokenAddress, unit } = parameters - const contract = { - abi: [ - { - type: 'function', - name: 'balanceOf', - stateMutability: 'view', - inputs: [{ type: 'address' }], - outputs: [{ type: 'uint256' }], - }, - { - type: 'function', - name: 'decimals', - stateMutability: 'view', - inputs: [], - outputs: [{ type: 'uint8' }], - }, - { - type: 'function', - name: 'symbol', - stateMutability: 'view', - inputs: [], - outputs: [{ type: symbolType }], - }, - ], - address: tokenAddress, - } as const - const [value, decimals, symbol] = await readContracts(config, { - allowFailure: false, - contracts: [ - { - ...contract, - functionName: 'balanceOf', - args: [balanceAddress], - chainId, - }, - { ...contract, functionName: 'decimals', chainId }, - { ...contract, functionName: 'symbol', chainId }, - ] as const, - }) - const formatted = formatUnits(value ?? '0', getUnit(unit ?? decimals)) - return { decimals, formatted, symbol, value } -} diff --git a/packages/core/src/actions/getBlock.test-d.ts b/packages/core/src/actions/getBlock.test-d.ts index 8c59f6e277..4041c841af 100644 --- a/packages/core/src/actions/getBlock.test-d.ts +++ b/packages/core/src/actions/getBlock.test-d.ts @@ -1,4 +1,4 @@ -import { http } from 'viem' +import { type Hex, http } from 'viem' import { celo, mainnet } from 'viem/chains' import { expectTypeOf, test } from 'vitest' @@ -12,18 +12,11 @@ test('chain formatters', async () => { }) const result = await getBlock(config) if (result.chainId === celo.id) { - expectTypeOf(result.difficulty).toEqualTypeOf() - expectTypeOf(result.gasLimit).toEqualTypeOf() - expectTypeOf(result.mixHash).toEqualTypeOf() + expectTypeOf(result.difficulty).toEqualTypeOf() + expectTypeOf(result.gasLimit).toEqualTypeOf() + expectTypeOf(result.mixHash).toEqualTypeOf() expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>() - expectTypeOf(result.uncles).toEqualTypeOf() - expectTypeOf(result.randomness).toEqualTypeOf< - | { - committed: `0x${string}` - revealed: `0x${string}` - } - | undefined - >() + expectTypeOf(result.uncles).toEqualTypeOf() } }) @@ -35,16 +28,8 @@ test('chainId', async () => { const result = await getBlock(config, { chainId: celo.id, }) - expectTypeOf(result.difficulty).toEqualTypeOf() - expectTypeOf(result.gasLimit).toEqualTypeOf() - expectTypeOf(result.mixHash).toEqualTypeOf() + expectTypeOf(result.difficulty).toEqualTypeOf() + expectTypeOf(result.gasLimit).toEqualTypeOf() + expectTypeOf(result.mixHash).toEqualTypeOf() expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>() - expectTypeOf(result.uncles).toEqualTypeOf() - expectTypeOf(result.randomness).toEqualTypeOf< - | { - committed: `0x${string}` - revealed: `0x${string}` - } - | undefined - >() }) diff --git a/packages/core/src/actions/getBlock.test.ts b/packages/core/src/actions/getBlock.test.ts index b1e92ba364..da8b6a361b 100644 --- a/packages/core/src/actions/getBlock.test.ts +++ b/packages/core/src/actions/getBlock.test.ts @@ -16,128 +16,130 @@ test('args: blockNumber', async () => { ) expect(block).toMatchInlineSnapshot(` { - "baseFeePerGas": 24076814055n, - "blobGasUsed": undefined, + "baseFeePerGas": 194923488n, + "blobGasUsed": 786432n, "chainId": 1, "difficulty": 0n, - "excessBlobGas": undefined, + "excessBlobGas": 0n, "extraData": "0x546974616e2028746974616e6275696c6465722e78797a29", - "gasLimit": 30000000n, - "gasUsed": 26325393n, - "hash": "0xcfa5df46abf1521f68ae72a7f7c4661949f4fb08a3d1296fe8082f6580a414e0", - "logsBloom": "0x2df3b5a24d2d57e7d73f96dbfea3577b1d5fbaacfcb9b5fb86db74d2e4ffd1e48bba050c33edada84fe477213937158c1e95d3da9f457f6f36e3ff0afdffcb667c5ee5f9e3ddffa9db1af6bbf15fcbbca5139717d5eedab4daa63cd8bb7dfa3e976b1e7023e2dc4586cef3caa0b73d6ff2ba3afb989c9f58f6b67bb4ed596c5aeb78cef51f69ad3675df70ffbd2aa6576d7c9e3debd00cccec3b69fc617b8568bfe588f7e126ef591f34ddd0d8b68c28b7ed45b46af3a7bb75c0e2fe4bec54fb772c87ae6f7efcdfb13139b758cfda4d98dffe426fef6d1c2e55f36b5bb1f0a2aef7bcbdf83d31ea646cf6ef3fe9d8b9af2ad4197f7ea2de462bd029fdef7e6f", + "gasLimit": 45000000n, + "gasUsed": 30531630n, + "hash": "0xe38d4bb2060a54519508612f40ef737a09c5b20488c12b0bec2d4f5ea7073c15", + "logsBloom": "0x3effc77fb16497fa74fffeb6ef65dfbd7b97f8dd7f198ff37abfcf5fdeb329e7bdbc9d8caffdf765f7b75df9e737eff773fbf639ff9ffb376fb726a7ff2f68dffea0de7fafd3f7fbff8d5fdff57becf3e76f3f73fefc1ff9bbf9df7fb3fffff13f577b7fdffeb7f7ffb8cd71ff93fff3bfffd7e3bfbe576daefdfff6fb5afedf8ffbbd7d7baf977f46fbffceebfbe86fc6ffb6f1eff3fbbfbeb9eefbf954ffe3fbff9d73b8f9ecfdcfdf7df3fdd9ff3bbfdfe9efe8ffee6ff7fe4a3ff7a5fefbfffffcffcd7f2bc04bdf7c52d3fdfeff3f7dfe7b4fefa9f46edb53c2de9ffb7f3ffdff6fefa67f64f6e7f7bff5af1dffffeff9b99ff86fef589e3bbfffdfffb7", "miner": "0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97", - "mixHash": "0x92ac9cd6e57bacd7c7d3e9b087c3907b1c085e284eec2dce7379a847cb4c9940", + "mixHash": "0x15350a0cad9bc5cb1298b3710db038850f1df5d8ac00c4ca3b03fb64c7e8ab78", "nonce": "0x0000000000000000", - "number": 19258213n, - "parentHash": "0x40cb7885ad596d0397d664a4dc9ef5c2011c09e9a62b386f838f5f5362582ebb", - "receiptsRoot": "0x910a69ba396ab4f59c2c77aa413e941fc4da97a021b8d8bbf12c125bfc42d9d3", + "number": 23535880n, + "parentBeaconBlockRoot": "0x2bd55d2f0e1a3d3e181659ebc21bb167527e517de88b39b0d7ebbeeb3e28eebc", + "parentHash": "0x1fab238a9630a2e95c8b735ebc63bc2751bc6492f409ee16a7b5a532985196eb", + "receiptsRoot": "0x01d0a60dd8fd8de710a191aba91f82e2a437ac21a6e77b21b2f745809e7feadf", + "requestsHash": "0x965c860907968cab126093a785436ad747495ae45b21dac1b6a92ae0f4866ce0", "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "size": 158252n, - "stateRoot": "0x6e27207d219b0251dbc2fde71f3cde8e33703261f032056453c27275500dddbc", - "timestamp": 1708302299n, + "size": 155442n, + "stateRoot": "0xd3c86549e5d57f14bd0b28630b70cb68038ac3334251bd194c93a18d96492f39", + "timestamp": 1759960991n, "totalDifficulty": null, - "transactionsRoot": "0x897dba26a3a940b62f86da6e5fec5f71312ad7c871a4031db79dee67442c9d1e", + "transactionsRoot": "0x9da0226f723a9da4b8df8782930c0e83bd73c4a393069ee7861465188eed989b", "uncles": [], "withdrawals": [ { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x112da72", - "index": "0x21ec946", - "validatorIndex": "0x5cd8e", + "amount": "0x11a6bd6", + "index": "0x633236b", + "validatorIndex": "0xb8688", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1119345", - "index": "0x21ec947", - "validatorIndex": "0x5cd8f", + "amount": "0x119ebba", + "index": "0x633236c", + "validatorIndex": "0xb8689", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x110e2ca", - "index": "0x21ec948", - "validatorIndex": "0x5cd90", + "amount": "0x11a167c", + "index": "0x633236d", + "validatorIndex": "0xb868a", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1119245", - "index": "0x21ec949", - "validatorIndex": "0x5cd91", + "amount": "0x11a2017", + "index": "0x633236e", + "validatorIndex": "0xb868b", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1115a03", - "index": "0x21ec94a", - "validatorIndex": "0x5cd92", + "amount": "0x11a5b81", + "index": "0x633236f", + "validatorIndex": "0xb868c", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x111cf3f", - "index": "0x21ec94b", - "validatorIndex": "0x5cd93", + "amount": "0x11a4908", + "index": "0x6332370", + "validatorIndex": "0xb868d", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1106006", - "index": "0x21ec94c", - "validatorIndex": "0x5cd94", + "amount": "0x11a74ca", + "index": "0x6332371", + "validatorIndex": "0xb868e", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1115bb3", - "index": "0x21ec94d", - "validatorIndex": "0x5cd95", + "amount": "0x11a5a90", + "index": "0x6332372", + "validatorIndex": "0xb868f", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x111e0d9", - "index": "0x21ec94e", - "validatorIndex": "0x5cd96", + "amount": "0x11a512b", + "index": "0x6332373", + "validatorIndex": "0xb8690", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x110829f", - "index": "0x21ec94f", - "validatorIndex": "0x5cd97", + "amount": "0x11a0ba7", + "index": "0x6332374", + "validatorIndex": "0xb8691", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11029ab", - "index": "0x21ec950", - "validatorIndex": "0x5cd98", + "amount": "0x11a313b", + "index": "0x6332375", + "validatorIndex": "0xb8692", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11140a6", - "index": "0x21ec951", - "validatorIndex": "0x5cd99", + "amount": "0x3e72765", + "index": "0x6332376", + "validatorIndex": "0xb8693", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x111396c", - "index": "0x21ec952", - "validatorIndex": "0x5cd9a", + "amount": "0x119c821", + "index": "0x6332377", + "validatorIndex": "0xb8694", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x110de16", - "index": "0x21ec953", - "validatorIndex": "0x5cd9b", + "amount": "0x119e921", + "index": "0x6332378", + "validatorIndex": "0xb8695", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x1121062", - "index": "0x21ec954", - "validatorIndex": "0x5cd9c", + "amount": "0x119f302", + "index": "0x6332379", + "validatorIndex": "0xb8696", }, { "address": "0xb9d7934878b5fb9610b3fe8a5e441e8fad7e293f", - "amount": "0x11188bc", - "index": "0x21ec955", - "validatorIndex": "0x5cd9d", + "amount": "0x11a38a8", + "index": "0x633237a", + "validatorIndex": "0xb8697", }, ], - "withdrawalsRoot": "0x26638497bd55075025ac2362d92bd789ac1232fd50c4b3866565280318027950", + "withdrawalsRoot": "0x0740ba007069960b2d60f77b0ce2648cffa3573accd055d4803eb771e32903e7", } `) }) diff --git a/packages/core/src/actions/getBytecode.test.ts b/packages/core/src/actions/getBytecode.test.ts index 4fdeb4ef17..1d5b6bdff9 100644 --- a/packages/core/src/actions/getBytecode.test.ts +++ b/packages/core/src/actions/getBytecode.test.ts @@ -14,9 +14,7 @@ test('default', async () => { getBytecode(config, { address: address.wagmiMintExample, }), - ).resolves.toBe( - '0x608060405234801561001057600080fd5b50600436106101005760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610215578063b88d4fde14610228578063c87b56dd1461023b578063e985e9c51461024e57600080fd5b80636352211e146101d457806370a08231146101e757806395d89b41146101fa578063a0712d681461020257600080fd5b80631249c58b116100d35780631249c58b1461018f57806318160ddd1461019757806323b872dd146101ae57806342842e0e146101c157600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610142578063095ea7b31461017a575b600080fd5b61011861011336600461178f565b610297565b60405190151581526020015b60405180910390f35b61013561037c565b6040516101249190611829565b61015561015036600461183c565b61040e565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610124565b61018d61018836600461187e565b6104d3565b005b61018d61062b565b6101a060065481565b604051908152602001610124565b61018d6101bc3660046118a8565b61067d565b61018d6101cf3660046118a8565b610704565b6101556101e236600461183c565b61071f565b6101a06101f53660046118e4565b6107b7565b61013561086b565b61018d61021036600461183c565b61087a565b61018d6102233660046118ff565b610902565b61018d61023636600461196a565b610911565b61013561024936600461183c565b61099f565b61011861025c366004611a64565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061032a57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061037657507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461038b90611a97565b80601f01602080910402602001604051908101604052809291908181526020018280546103b790611a97565b80156104045780601f106103d957610100808354040283529160200191610404565b820191906000526020600020905b8154815290600101906020018083116103e757829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff166104aa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006104de8261071f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105815760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016104a1565b3373ffffffffffffffffffffffffffffffffffffffff821614806105aa57506105aa813361025c565b61061c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016104a1565b6106268383610b07565b505050565b6007545b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156106615760010161062f565b61066b3382610ba7565b60068054600190810190915501600755565b6106873382610bc1565b6106f95760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b610626838383610d17565b61062683838360405180602001604052806000815250610911565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806103765760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff82166108425760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016104a1565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b60606001805461038b90611a97565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156108ec5760405162461bcd60e51b815260206004820152601160248201527f546f6b656e2049442069732074616b656e00000000000000000000000000000060448201526064016104a1565b6108f63382610ba7565b50600680546001019055565b61090d338383610f4a565b5050565b61091b3383610bc1565b61098d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016104a1565b6109998484848461105d565b50505050565b6040517f666f726567726f756e64000000000000000000000000000000000000000000006020820152602a810182905260609060009061016890604a016040516020818303038152906040528051906020012060001c6109ff9190611b19565b6040517f6261636b67726f756e64000000000000000000000000000000000000000000006020820152602a810185905290915060009061016890604a016040516020818303038152906040528051906020012060001c610a5f9190611b19565b90506000610aba610a6f866110e6565b610aa9610a7b866110e6565b610a84866110e6565b604051602001610a95929190611b2d565b60405160208183030381529060405261121b565b604051602001610a959291906125ba565b9050600081604051602001610acf919061268b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529695505050505050565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610b618261071f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61090d82826040518060200160405280600081525061136e565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610c585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016104a1565b6000610c638361071f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610cd1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610d0f57508373ffffffffffffffffffffffffffffffffffffffff16610cf78461040e565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610d378261071f565b73ffffffffffffffffffffffffffffffffffffffff1614610dc05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016104a1565b73ffffffffffffffffffffffffffffffffffffffff8216610e485760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016104a1565b610e53600082610b07565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290610e899084906126ff565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290610ec4908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fc55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611068848484610d17565b611074848484846113f7565b6109995760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b60608160000361112957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611153578061113d8161272e565b915061114c9050600a83612766565b915061112d565b60008167ffffffffffffffff81111561116e5761116e61193b565b6040519080825280601f01601f191660200182016040528015611198576020820181803683370190505b5090505b8415610d0f576111ad6001836126ff565b91506111ba600a86611b19565b6111c5906030612716565b60f81b8183815181106111da576111da61277a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611214600a86612766565b945061119c565b6060815160000361123a57505060408051602081019091526000815290565b600060405180606001604052806040815260200161284d60409139905060006003845160026112699190612716565b6112739190612766565b61127e9060046127a9565b67ffffffffffffffff8111156112965761129661193b565b6040519080825280601f01601f1916602001820160405280156112c0576020820181803683370190505b509050600182016020820185865187015b8082101561132c576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f81168501518453506001830192506112d1565b5050600386510660018114611348576002811461135b57611363565b603d6001830353603d6002830353611363565b603d60018303535b509195945050505050565b61137883836115d0565b61138560008484846113f7565b6106265760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b600073ffffffffffffffffffffffffffffffffffffffff84163b156115c5576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061146e9033908990889088906004016127e6565b6020604051808303816000875af19250505080156114c7575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526114c49181019061282f565b60015b61157a573d8080156114f5576040519150601f19603f3d011682016040523d82523d6000602084013e6114fa565b606091505b5080516000036115725760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016104a1565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610d0f565b506001949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166116335760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016104a1565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156116a55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016104a1565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906116db908490612716565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461178c57600080fd5b50565b6000602082840312156117a157600080fd5b81356117ac8161175e565b9392505050565b60005b838110156117ce5781810151838201526020016117b6565b838111156109995750506000910152565b600081518084526117f78160208601602086016117b3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006117ac60208301846117df565b60006020828403121561184e57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461187957600080fd5b919050565b6000806040838503121561189157600080fd5b61189a83611855565b946020939093013593505050565b6000806000606084860312156118bd57600080fd5b6118c684611855565b92506118d460208501611855565b9150604084013590509250925092565b6000602082840312156118f657600080fd5b6117ac82611855565b6000806040838503121561191257600080fd5b61191b83611855565b91506020830135801515811461193057600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561198057600080fd5b61198985611855565b935061199760208601611855565b925060408501359150606085013567ffffffffffffffff808211156119bb57600080fd5b818701915087601f8301126119cf57600080fd5b8135818111156119e1576119e161193b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611a2757611a2761193b565b816040528281528a6020848701011115611a4057600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a7757600080fd5b611a8083611855565b9150611a8e60208401611855565b90509250929050565b600181811c90821680611aab57607f821691505b602082108103611ae4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611b2857611b28611aea565b500690565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222077696474683d223130323422206865696768743d2231303260208201527f34222066696c6c3d226e6f6e65223e3c706174682066696c6c3d2268736c2800604082015260008351611bb181605f8501602088016117b3565b7f2c20313030252c20313025292220643d224d3020306831303234763130323448605f918401918201527f307a22202f3e3c672066696c6c3d2268736c2800000000000000000000000000607f8201528351611c148160928401602088016117b3565b7f2c20313030252c2039302529223e3c7061746820643d224d393033203433372e609292909101918201527f35633020392e3131332d372e3338382031362e352d31362e352031362e35732d60b28201527f31362e352d372e3338372d31362e352d31362e3520372e3338382d31362e352060d28201527f31362e352d31362e352031362e3520372e3338372031362e352031362e357a4d60f28201527f3639382e3532392035363663362e39323120302031322e35332d352e353936206101128201527f31322e35332d31322e35762d353063302d362e39303420352e3630392d31322e6101328201527f352031322e3532392d31322e356832352e30353963362e393220302031322e356101528201527f323920352e3539362031322e3532392031322e35763530633020362e393034206101728201527f352e3630392031322e352031322e35332031322e357331322e3532392d352e356101928201527f39362031322e3532392d31322e35762d353063302d362e39303420352e3630396101b28201527f2d31322e352031322e35332d31322e356832352e30353963362e3932203020316101d28201527f322e35323920352e3539362031322e3532392031322e35763530633020362e396101f28201527f303420352e3630392031322e352031322e3532392031322e356833372e3538396102128201527f63362e393220302031322e3532392d352e3539362031322e3532392d31322e356102328201527f762d373563302d362e3930342d352e3630392d31322e352d31322e3532392d316102528201527f322e35732d31322e353320352e3539362d31322e35332031322e357635362e326102728201527f3561362e32363420362e3236342030203120312d31322e3532392030563437386102928201527f2e3563302d362e3930342d352e3630392d31322e352d31322e35332d31322e356102b28201527f483639382e353239632d362e393220302d31322e35323920352e3539362d31326102d28201527f2e3532392031322e35763735633020362e39303420352e3630392031322e35206102f28201527f31322e3532392031322e357a22202f3e3c7061746820643d224d3135372e36356103128201527f3520353431632d362e39333220302d31322e3535322d352e3539362d31322e356103328201527f35322d31322e35762d353063302d362e3930342d352e3631392d31322e352d316103528201527f322e3535312d31322e3553313230203437312e35393620313230203437382e356103728201527f763735633020362e39303420352e36322031322e352031322e3535322031322e6103928201527f35683135302e363263362e39333320302031322e3535322d352e3539362031326103b28201527f2e3535322d31322e35762d353063302d362e39303420352e3631392d31322e356103d28201527f2031322e3535322d31322e35683134342e33343563332e343635203020362e326103f28201527f373620322e37393820362e32373620362e3235732d322e38313120362e32352d6104128201527f362e32373620362e3235483332302e383238632d362e39333320302d31322e356104328201527f353220352e3539362d31322e3535322031322e357633372e35633020362e39306104528201527f3420352e3631392031322e352031322e3535322031322e35683135302e3632636104728201527f362e39333320302031322e3535322d352e3539362031322e3535322d31322e356104928201527f762d373563302d362e3930342d352e3631392d31322e352d31322e3535322d316104b28201527f322e35483238332e313732632d362e39333220302d31322e35353120352e35396104d28201527f362d31322e3535312031322e35763530633020362e3930342d352e36313920316104f28201527f322e352d31322e3535322031322e35682d32352e313033632d362e39333320306105128201527f2d31322e3535322d352e3539362d31322e3535322d31322e35762d353063302d6105328201527f362e3930342d352e36322d31322e352d31322e3535322d31322e35732d31322e6105528201527f35353220352e3539362d31322e3535322031322e35763530633020362e3930346105728201527f2d352e3631392031322e352d31322e3535312031322e35682d32352e3130347a6105928201527f6d3330312e3234322d362e3235633020332e3435322d322e38313120362e32356105b28201527f2d362e32373620362e3235483333392e363535632d332e34363520302d362e326105d28201527f37362d322e3739382d362e3237362d362e323573322e3831312d362e323520366105f28201527f2e3237362d362e3235683131322e39363663332e343635203020362e323736206106128201527f322e37393820362e32373620362e32357a4d343937203535332e3831386330206106328201527f362e39323920352e3632382031322e3534362031322e3537312031322e3534366106528201527f6831333261362e323820362e323820302030203120362e32383620362e3237326106728201527f20362e323820362e32382030203020312d362e32383620362e323733682d31336106928201527f32632d362e39343320302d31322e35373120352e3631362d31322e35373120316106b28201527f322e3534364131322e35362031322e3536203020302030203530392e353731206106d28201527f363034683135302e38353863362e39343320302031322e3537312d352e3631366106f28201527f2031322e3537312d31322e353435762d3131322e393163302d362e3932382d356107128201527f2e3632382d31322e3534352d31322e3537312d31322e353435483530392e35376107328201527f31632d362e39343320302d31322e35373120352e3631372d31322e35373120316107528201527f322e3534357637352e3237337a6d33372e3731342d36322e373237632d362e396107728201527f343320302d31322e35373120352e3631372d31322e3537312031322e353435766107928201527f32352e303931633020362e39323920352e3632382031322e3534362031322e356107b28201527f37312031322e353436683130302e35373263362e39343320302031322e3537316107d28201527f2d352e3631372031322e3537312d31322e353436762d32352e30393163302d366107f28201527f2e3932382d352e3632382d31322e3534352d31322e3537312d31322e353435486108128201527f3533342e3731347a222066696c6c2d72756c653d226576656e6f646422202f3e6108328201527f3c2f673e3c2f7376673e0000000000000000000000000000000000000000000061085282015261085c01949350505050565b7f7b226e616d65223a20227761676d6920230000000000000000000000000000008152600083516125f28160118501602088016117b3565b7f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6011918401918201527f6261736536342c00000000000000000000000000000000000000000000000000603182015283516126558160388401602088016117b3565b7f227d00000000000000000000000000000000000000000000000000000000000060389290910191820152603a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516126c381601d8501602087016117b3565b91909101601d0192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612711576127116126d0565b500390565b60008219821115612729576127296126d0565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361275f5761275f6126d0565b5060010190565b60008261277557612775611aea565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156127e1576127e16126d0565b500290565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261282560808301846117df565b9695505050505050565b60006020828403121561284157600080fd5b81516117ac8161175e56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212201665a4f9111990d7529375848d3fd02c0121091a940da59e763eba826e7b077064736f6c634300080d0033', - ) + ).resolves.toMatch(/^0x.*/) }) test('parameters: blockNumber', async () => { diff --git a/packages/core/src/experimental/actions/getCallsStatus.test.ts b/packages/core/src/actions/getCallsStatus.test.ts similarity index 67% rename from packages/core/src/experimental/actions/getCallsStatus.test.ts rename to packages/core/src/actions/getCallsStatus.test.ts index 367c33c303..badd3478ee 100644 --- a/packages/core/src/experimental/actions/getCallsStatus.test.ts +++ b/packages/core/src/actions/getCallsStatus.test.ts @@ -2,8 +2,8 @@ import { accounts, config, testClient } from '@wagmi/test' import { parseEther } from 'viem' import { expect, test } from 'vitest' -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' import { getCallsStatus } from './getCallsStatus.js' import { sendCalls } from './sendCalls.js' @@ -11,7 +11,7 @@ const connector = config.connectors[0]! test('default', async () => { await connect(config, { connector }) - const id = await sendCalls(config, { + const { id } = await sendCalls(config, { calls: [ { data: '0xdeadbeef', @@ -33,7 +33,7 @@ test('default', async () => { id, }) - expect(status).toBe('CONFIRMED') + expect(status).toBe('success') expect( receipts?.map((x) => ({ ...x, blockHash: undefined })), ).toMatchInlineSnapshot( @@ -41,27 +41,27 @@ test('default', async () => { [ { "blockHash": undefined, - "blockNumber": 19258214n, - "gasUsed": 21064n, + "blockNumber": 23535881n, + "gasUsed": 21160n, "logs": [], "status": "success", - "transactionHash": "0x13c53b2d4d9da424835525349cd66e553330f323d6fb19458b801ae1f7989a41", + "transactionHash": "0x7add018cb41f4b86d793758248d20cb8394364d9379d201cb7747db29c4aac18", }, { "blockHash": undefined, - "blockNumber": 19258214n, + "blockNumber": 23535881n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0xd8397b3e82b061c26a0c2093f1ceca0c3662a512614f7d6370349e89d0eea007", + "transactionHash": "0x5019ef03b9ee83c6398d1a68490b56878300c1f83697c3b3eeaf666baf63abff", }, { "blockHash": undefined, - "blockNumber": 19258214n, + "blockNumber": 23535881n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0x4d26e346593d9ea265bb164b115e89aa92df43b0b8778ac75d4ad28e2a22b101", + "transactionHash": "0xe61204827da836e4bc51fbfe15f04e5b1307c50f160d1add15675c8654663f20", }, ] `, diff --git a/packages/core/src/experimental/actions/getCallsStatus.ts b/packages/core/src/actions/getCallsStatus.ts similarity index 69% rename from packages/core/src/experimental/actions/getCallsStatus.ts rename to packages/core/src/actions/getCallsStatus.ts index 214a6c8cae..0d560421b7 100644 --- a/packages/core/src/experimental/actions/getCallsStatus.ts +++ b/packages/core/src/actions/getCallsStatus.ts @@ -3,11 +3,12 @@ import { type GetCallsStatusParameters as viem_GetCallsStatusParameters, type GetCallsStatusReturnType as viem_GetCallsStatusReturnType, getCallsStatus as viem_getCallsStatus, -} from 'viem/experimental' +} from 'viem/actions' -import { getConnectorClient } from '../../actions/getConnectorClient.js' -import type { Config } from '../../createConfig.js' -import type { ConnectorParameter } from '../../types/properties.js' +import type { Config } from '../createConfig.js' +import type { ConnectorParameter } from '../types/properties.js' +import { getAction } from '../utils/getAction.js' +import { getConnectorClient } from './getConnectorClient.js' export type GetCallsStatusParameters = viem_GetCallsStatusParameters & ConnectorParameter @@ -23,5 +24,6 @@ export async function getCallsStatus( ): Promise { const { connector, id } = parameters const client = await getConnectorClient(config, { connector }) - return viem_getCallsStatus(client, { id }) + const action = getAction(client, viem_getCallsStatus, 'getCallsStatus') + return action({ id }) } diff --git a/packages/core/src/experimental/actions/getCapabilities.test.ts b/packages/core/src/actions/getCapabilities.test.ts similarity index 92% rename from packages/core/src/experimental/actions/getCapabilities.test.ts rename to packages/core/src/actions/getCapabilities.test.ts index 2946e27a5c..e7c02ec444 100644 --- a/packages/core/src/experimental/actions/getCapabilities.test.ts +++ b/packages/core/src/actions/getCapabilities.test.ts @@ -1,8 +1,8 @@ import { accounts, config } from '@wagmi/test' import { expect, test } from 'vitest' -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' import { getCapabilities } from './getCapabilities.js' const connector = config.connectors[0]! diff --git a/packages/core/src/actions/getCapabilities.ts b/packages/core/src/actions/getCapabilities.ts new file mode 100644 index 0000000000..ab8ea82bfb --- /dev/null +++ b/packages/core/src/actions/getCapabilities.ts @@ -0,0 +1,39 @@ +import type { Account } from 'viem' +import { + type GetCapabilitiesErrorType as viem_GetCapabilitiesErrorType, + type GetCapabilitiesParameters as viem_GetCapabilitiesParameters, + type GetCapabilitiesReturnType as viem_GetCapabilitiesReturnType, + getCapabilities as viem_getCapabilities, +} from 'viem/actions' + +import type { Config } from '../createConfig.js' +import type { ConnectorParameter } from '../types/properties.js' +import { getConnectorClient } from './getConnectorClient.js' + +export type GetCapabilitiesParameters< + config extends Config = Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +> = viem_GetCapabilitiesParameters & ConnectorParameter + +export type GetCapabilitiesReturnType< + config extends Config = Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +> = viem_GetCapabilitiesReturnType + +export type GetCapabilitiesErrorType = viem_GetCapabilitiesErrorType + +/** https://wagmi.sh/core/api/actions/getCapabilities */ +export async function getCapabilities< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +>( + config: config, + parameters: GetCapabilitiesParameters = {}, +): Promise> { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { account, connector }) + return viem_getCapabilities(client as any, { + account: account as Account, + chainId, + }) +} diff --git a/packages/core/src/actions/getChains.test-d.ts b/packages/core/src/actions/getChains.test-d.ts index cd5f04c9c5..56e33f9955 100644 --- a/packages/core/src/actions/getChains.test-d.ts +++ b/packages/core/src/actions/getChains.test-d.ts @@ -1,5 +1,4 @@ import { type chain, config } from '@wagmi/test' -import type { Chain } from 'viem' import { expectTypeOf, test } from 'vitest' import { getChains } from './getChains.js' @@ -8,5 +7,4 @@ test('default', async () => { const chains = getChains(config) expectTypeOf(chains[0]).toEqualTypeOf() expectTypeOf(chains[2]).toEqualTypeOf() - expectTypeOf(chains[3]).toEqualTypeOf() }) diff --git a/packages/core/src/actions/getChains.ts b/packages/core/src/actions/getChains.ts index a91e6e89b4..bd9ba468a5 100644 --- a/packages/core/src/actions/getChains.ts +++ b/packages/core/src/actions/getChains.ts @@ -2,10 +2,8 @@ import type { Chain } from 'viem' import type { Config } from '../createConfig.js' import { deepEqual } from '../utils/deepEqual.js' -export type GetChainsReturnType = readonly [ - ...config['chains'], - ...Chain[], -] +export type GetChainsReturnType = + config['chains'] let previousChains: readonly Chain[] = [] diff --git a/packages/core/src/actions/getClient.ts b/packages/core/src/actions/getClient.ts index 82f1c6c171..ba78cafa34 100644 --- a/packages/core/src/actions/getClient.ts +++ b/packages/core/src/actions/getClient.ts @@ -44,9 +44,9 @@ export function getClient< config: config, parameters: GetClientParameters = {}, ): GetClientReturnType { - let client = undefined try { - client = config.getClient(parameters) - } catch {} - return client as GetClientReturnType + return config.getClient(parameters) as GetClientReturnType + } catch { + return undefined as never + } } diff --git a/packages/core/src/actions/getAccount.test-d.ts b/packages/core/src/actions/getConnection.test-d.ts similarity index 95% rename from packages/core/src/actions/getAccount.test-d.ts rename to packages/core/src/actions/getConnection.test-d.ts index 728468039b..9c7540a6ac 100644 --- a/packages/core/src/actions/getAccount.test-d.ts +++ b/packages/core/src/actions/getConnection.test-d.ts @@ -3,10 +3,10 @@ import type { Address } from 'viem' import { expectTypeOf, test } from 'vitest' import type { Connector } from '../createConfig.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' test('states', () => { - const result = getAccount(config) + const result = getConnection(config) switch (result.status) { case 'reconnecting': { diff --git a/packages/core/src/actions/getAccount.test.ts b/packages/core/src/actions/getConnection.test.ts similarity index 79% rename from packages/core/src/actions/getAccount.test.ts rename to packages/core/src/actions/getConnection.test.ts index a538357875..d49f831054 100644 --- a/packages/core/src/actions/getAccount.test.ts +++ b/packages/core/src/actions/getConnection.test.ts @@ -3,10 +3,10 @@ import { expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' test('default', () => { - expect(getAccount(config)).toMatchInlineSnapshot(` + expect(getConnection(config)).toMatchInlineSnapshot(` { "address": undefined, "addresses": undefined, @@ -23,15 +23,15 @@ test('default', () => { }) test('behavior: connected', async () => { - let result = getAccount(config) + let result = getConnection(config) expect(result.status).toEqual('disconnected') await connect(config, { connector: config.connectors[0]! }) - result = getAccount(config) + result = getConnection(config) expect(result.address).toBeDefined() expect(result.status).toEqual('connected') await disconnect(config) - result = getAccount(config) + result = getConnection(config) expect(result.status).toEqual('disconnected') }) diff --git a/packages/core/src/actions/getAccount.ts b/packages/core/src/actions/getConnection.ts similarity index 93% rename from packages/core/src/actions/getAccount.ts rename to packages/core/src/actions/getConnection.ts index af5daea028..f7dc4d0600 100644 --- a/packages/core/src/actions/getAccount.ts +++ b/packages/core/src/actions/getConnection.ts @@ -2,7 +2,7 @@ import type { Address, Chain } from 'viem' import type { Config, Connector } from '../createConfig.js' -export type GetAccountReturnType< +export type GetConnectionReturnType< config extends Config = Config, /// chain = Config extends config ? Chain : config['chains'][number], @@ -56,17 +56,17 @@ export type GetAccountReturnType< status: 'disconnected' } -/** https://wagmi.sh/core/api/actions/getAccount */ -export function getAccount( +/** https://wagmi.sh/core/api/actions/getConnection */ +export function getConnection( config: config, -): GetAccountReturnType { +): GetConnectionReturnType { const uid = config.state.current! const connection = config.state.connections.get(uid) const addresses = connection?.accounts const address = addresses?.[0] const chain = config.chains.find( (chain) => chain.id === connection?.chainId, - ) as GetAccountReturnType['chain'] + ) as GetConnectionReturnType['chain'] const status = config.state.status switch (status) { diff --git a/packages/core/src/actions/getConnectorClient.test.ts b/packages/core/src/actions/getConnectorClient.test.ts index a9d60f5142..465db5d8ce 100644 --- a/packages/core/src/actions/getConnectorClient.test.ts +++ b/packages/core/src/actions/getConnectorClient.test.ts @@ -1,6 +1,6 @@ import { address, config } from '@wagmi/test' +import type { Address } from 'viem' import { expect, test } from 'vitest' - import type { Connector } from '../createConfig.js' import { connect } from './connect.js' import { disconnect } from './disconnect.js' @@ -27,10 +27,11 @@ test.todo('custom connector client') test('behavior: account address is checksummed', async () => { await connect(config, { connector }) - const account = '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266' + const account = + '0x95132632579b073D12a6673e18Ab05777a6B86f8'.toLowerCase() as Address const client = await getConnectorClient(config, { account }) expect(client.account.address).toMatchInlineSnapshot( - '"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"', + '"0x95132632579b073D12a6673e18Ab05777a6B86f8"', ) expect(client.account.address).not.toBe(account) await disconnect(config, { connector }) diff --git a/packages/core/src/actions/getConnectorClient.ts b/packages/core/src/actions/getConnectorClient.ts index 534ba76bc6..913cbb53f5 100644 --- a/packages/core/src/actions/getConnectorClient.ts +++ b/packages/core/src/actions/getConnectorClient.ts @@ -43,6 +43,10 @@ export type GetConnectorClientParameters< * an account within the wallet). */ account?: Address | Account | null | undefined + /** + * Assert that the current chain ID matches the connector's chain ID. + */ + assertChainId?: boolean | undefined } > @@ -75,6 +79,8 @@ export async function getConnectorClient< config: config, parameters: GetConnectorClientParameters = {}, ): Promise> { + const { assertChainId = true } = parameters + // Get connection let connection: Connection | undefined if (parameters.connector) { @@ -105,9 +111,9 @@ export async function getConnectorClient< // Check connector using same chainId as connection const connectorChainId = await connection.connector.getChainId() - if (connectorChainId !== connection.chainId) + if (assertChainId && connectorChainId !== chainId) throw new ConnectorChainMismatchError({ - connectionChainId: connection.chainId, + connectionChainId: chainId, connectorChainId, }) diff --git a/packages/core/src/actions/getConnectors.test.ts b/packages/core/src/actions/getConnectors.test.ts index d15f5fbb08..9a568668f6 100644 --- a/packages/core/src/actions/getConnectors.test.ts +++ b/packages/core/src/actions/getConnectors.test.ts @@ -5,4 +5,5 @@ import { getConnectors } from './getConnectors.js' test('default', () => { expect(getConnectors(config)).toEqual(config.connectors) + expect(getConnectors(config)).toEqual(config.connectors) }) diff --git a/packages/core/src/actions/getConnectors.ts b/packages/core/src/actions/getConnectors.ts index 439362d3f4..d4786484ed 100644 --- a/packages/core/src/actions/getConnectors.ts +++ b/packages/core/src/actions/getConnectors.ts @@ -1,5 +1,4 @@ import type { Config, Connector } from '../createConfig.js' -import { deepEqual } from '../utils/deepEqual.js' export type GetConnectorsReturnType = config['connectors'] @@ -11,7 +10,13 @@ export function getConnectors( config: config, ): GetConnectorsReturnType { const connectors = config.connectors - if (deepEqual(previousConnectors, connectors)) return previousConnectors + if ( + previousConnectors.length === connectors.length && + previousConnectors.every( + (connector, index) => connector === connectors[index], + ) + ) + return previousConnectors previousConnectors = connectors return connectors } diff --git a/packages/core/src/actions/getEnsAvatar.test.ts b/packages/core/src/actions/getEnsAvatar.test.ts index ed1e830481..790c6a8a46 100644 --- a/packages/core/src/actions/getEnsAvatar.test.ts +++ b/packages/core/src/actions/getEnsAvatar.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest' import { getEnsAvatar } from './getEnsAvatar.js' -test('default', async () => { +test.skip('default', async () => { await expect( getEnsAvatar(config, { name: 'wevm.eth', diff --git a/packages/core/src/actions/getProof.test.ts b/packages/core/src/actions/getProof.test.ts index 5ff0af2828..49fff585d7 100644 --- a/packages/core/src/actions/getProof.test.ts +++ b/packages/core/src/actions/getProof.test.ts @@ -3,7 +3,7 @@ import { expect, test } from 'vitest' import { getProof } from './getProof.js' -test('default', async () => { +test.skip('default', async () => { await expect( getProof(config, { chainId: chain.optimism.id, diff --git a/packages/core/src/actions/getToken.test.ts b/packages/core/src/actions/getToken.test.ts deleted file mode 100644 index 8af08736a7..0000000000 --- a/packages/core/src/actions/getToken.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { config } from '@wagmi/test' -import { expect, test } from 'vitest' - -import { getToken } from './getToken.js' - -test('default', async () => { - await expect( - getToken(config, { - address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - }), - ).resolves.toMatchInlineSnapshot(` - { - "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", - "decimals": 18, - "name": "Uniswap", - "symbol": "UNI", - "totalSupply": { - "formatted": "1000000000", - "value": 1000000000000000000000000000n, - }, - } - `) -}) - -test('parameters: formatUnits', async () => { - await expect( - getToken(config, { - address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984', - formatUnits: 'gwei', - }), - ).resolves.toMatchInlineSnapshot(` - { - "address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", - "decimals": 18, - "name": "Uniswap", - "symbol": "UNI", - "totalSupply": { - "formatted": "1000000000000000000", - "value": 1000000000000000000000000000n, - }, - } - `) -}) - -test('behavior: bytes32 token', async () => { - await expect( - getToken(config, { - address: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2', - }), - ).resolves.toMatchInlineSnapshot(` - { - "address": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2", - "decimals": 18, - "name": "Maker", - "symbol": "MKR", - "totalSupply": { - "formatted": "977631.036950888222010062", - "value": 977631036950888222010062n, - }, - } - `) -}) - -test('behavior: bogus token', async () => { - await expect( - getToken(config, { - address: '0xa0cf798816d4b9b9866b5330eea46a18382f251e', - }), - ).rejects.toThrowErrorMatchingInlineSnapshot(` - [ContractFunctionExecutionError: The contract function "decimals" returned no data ("0x"). - - This could be due to any of the following: - - The contract does not have the function "decimals", - - The parameters passed to the contract function may be invalid, or - - The address is not a contract. - - Contract Call: - address: 0xa0cf798816d4b9b9866b5330eea46a18382f251e - function: decimals() - - Docs: https://viem.sh/docs/contract/multicall - Version: viem@2.23.12] - `) -}) diff --git a/packages/core/src/actions/getToken.ts b/packages/core/src/actions/getToken.ts deleted file mode 100644 index 480a742820..0000000000 --- a/packages/core/src/actions/getToken.ts +++ /dev/null @@ -1,141 +0,0 @@ -import type { Address, Hex } from 'viem' -import { - ContractFunctionExecutionError, - formatUnits, - hexToString, - trim, -} from 'viem' - -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 { getUnit } from '../utils/getUnit.js' -import { type ReadContractsErrorType, readContracts } from './readContracts.js' - -export type GetTokenParameters = Compute< - ChainIdParameter & { - address: Address - formatUnits?: Unit | undefined - } -> - -export type GetTokenReturnType = { - address: Address - decimals: number - name: string | undefined - symbol: string | undefined - totalSupply: { - formatted: string - value: bigint - } -} - -export type GetTokenErrorType = ReadContractsErrorType - -/** @deprecated */ -export async function getToken( - config: config, - parameters: GetTokenParameters, -): Promise { - const { address, chainId, formatUnits: unit = 18 } = parameters - - function getAbi(type: type) { - return [ - { - type: 'function', - name: 'decimals', - stateMutability: 'view', - inputs: [], - outputs: [{ type: 'uint8' }], - }, - { - type: 'function', - name: 'name', - stateMutability: 'view', - inputs: [], - outputs: [{ type }], - }, - { - type: 'function', - name: 'symbol', - stateMutability: 'view', - inputs: [], - outputs: [{ type }], - }, - { - type: 'function', - name: 'totalSupply', - stateMutability: 'view', - inputs: [], - outputs: [{ type: 'uint256' }], - }, - ] as const - } - - try { - const abi = getAbi('string') - const contractConfig = { address, abi, chainId } as const - const [decimals, name, symbol, totalSupply] = await readContracts(config, { - allowFailure: true, - contracts: [ - { ...contractConfig, functionName: 'decimals' }, - { ...contractConfig, functionName: 'name' }, - { ...contractConfig, functionName: 'symbol' }, - { ...contractConfig, functionName: 'totalSupply' }, - ] as const, - }) - - // throw if `name` or `symbol` failed - if (name.error instanceof ContractFunctionExecutionError) throw name.error - if (symbol.error instanceof ContractFunctionExecutionError) - throw symbol.error - - // `decimals` and `totalSupply` are required - if (decimals.error) throw decimals.error - if (totalSupply.error) throw totalSupply.error - - return { - address, - decimals: decimals.result, - name: name.result, - symbol: symbol.result, - totalSupply: { - formatted: formatUnits(totalSupply.result!, getUnit(unit)), - value: totalSupply.result, - }, - } - } catch (error) { - // In the chance that there is an error upon decoding the contract result, - // it could be likely that the contract data is represented as bytes32 instead - // of a string. - if (error instanceof ContractFunctionExecutionError) { - const abi = getAbi('bytes32') - const contractConfig = { address, abi, chainId } as const - const [decimals, name, symbol, totalSupply] = await readContracts( - config, - { - allowFailure: false, - contracts: [ - { ...contractConfig, functionName: 'decimals' }, - { ...contractConfig, functionName: 'name' }, - { ...contractConfig, functionName: 'symbol' }, - { ...contractConfig, functionName: 'totalSupply' }, - ] as const, - }, - ) - return { - address, - decimals, - name: hexToString(trim(name as Hex, { dir: 'right' })), - symbol: hexToString(trim(symbol as Hex, { dir: 'right' })), - totalSupply: { - formatted: formatUnits(totalSupply, getUnit(unit)), - value: totalSupply, - }, - } - } - - throw error - } -} diff --git a/packages/core/src/actions/getTransaction.test-d.ts b/packages/core/src/actions/getTransaction.test-d.ts index 9476b781c1..c5ab9b37c3 100644 --- a/packages/core/src/actions/getTransaction.test-d.ts +++ b/packages/core/src/actions/getTransaction.test-d.ts @@ -11,6 +11,8 @@ test('chain formatters', async () => { transports: { [celo.id]: http(), [mainnet.id]: http() }, }) const result = await getTransaction(config, { hash: '0x123' }) + // @ts-expect-error + result.feeCurrency if (result.chainId === celo.id) { expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>() } diff --git a/packages/core/src/actions/getTransactionConfirmations.test-d.ts b/packages/core/src/actions/getTransactionConfirmations.test-d.ts index fd9168dfa2..42474ca6c7 100644 --- a/packages/core/src/actions/getTransactionConfirmations.test-d.ts +++ b/packages/core/src/actions/getTransactionConfirmations.test-d.ts @@ -1,8 +1,7 @@ import { config } from '@wagmi/test' +import { http } from 'viem' import { mainnet, zkSync } from 'viem/chains' import { test } from 'vitest' - -import { http } from 'viem' import { createConfig } from '../createConfig.js' import { getTransactionConfirmations } from './getTransactionConfirmations.js' diff --git a/packages/core/src/actions/getTransactionCount.test.ts b/packages/core/src/actions/getTransactionCount.test.ts index 95f0e6ddee..7f4561571e 100644 --- a/packages/core/src/actions/getTransactionCount.test.ts +++ b/packages/core/src/actions/getTransactionCount.test.ts @@ -1,7 +1,6 @@ import { accounts, chain, config, testClient } from '@wagmi/test' -import { expect, test } from 'vitest' - import type { BlockTag } from 'viem' +import { expect, test } from 'vitest' import { getTransactionCount } from './getTransactionCount.js' const address = accounts[0] diff --git a/packages/core/src/actions/getWalletClient.test-d.ts b/packages/core/src/actions/getWalletClient.test-d.ts index d1d87f5e97..8f1d20ebba 100644 --- a/packages/core/src/actions/getWalletClient.test-d.ts +++ b/packages/core/src/actions/getWalletClient.test-d.ts @@ -1,7 +1,6 @@ import { chain, config } from '@wagmi/test' -import { expectTypeOf, test } from 'vitest' - import type { Account } from 'viem' +import { expectTypeOf, test } from 'vitest' import { getWalletClient } from './getWalletClient.js' test('default', async () => { diff --git a/packages/core/src/actions/multicall.bench-d.ts b/packages/core/src/actions/multicall.bench-d.ts new file mode 100644 index 0000000000..000efc9e27 --- /dev/null +++ b/packages/core/src/actions/multicall.bench-d.ts @@ -0,0 +1,76 @@ +import { attest } from '@ark/attest' +import { abi, config } from '@wagmi/test' +import { test } from 'vitest' +import { multicall } from './multicall.js' + +test('default', () => { + multicall(config, { + chainId: 1, + contracts: [ + { + address: '0x', + abi: abi.erc20, + functionName: 'balanceOf', + args: ['0x'], + }, + { + address: '0x', + abi: abi.wagmiMintExample, + functionName: 'tokenURI', + args: [123n], + }, + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + }, + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x'], + }, + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x', '0x'], + }, + { + abi: abi.wagmigotchi, + address: '0x', + functionName: 'love', + args: ['0x'], + }, + { + abi: abi.wagmigotchi, + address: '0x', + functionName: 'love', + args: ['0x'], + }, + { + abi: abi.wagmigotchi, + address: '0x', + functionName: 'getAlive', + }, + { + abi: abi.mloot, + address: '0x', + functionName: 'tokenOfOwnerByIndex', + args: ['0x', 0n], + }, + { + abi: abi.erc20, + address: '0x', + functionName: 'symbol', + }, + { + abi: abi.erc20, + address: '0x', + functionName: 'balanceOf', + args: ['0x'], + }, + ], + }) + attest.instantiations([523679, 'instantiations']) +}) diff --git a/packages/core/src/actions/multicall.test.ts b/packages/core/src/actions/multicall.test.ts index cf2d7c0ddf..a4cca18f60 100644 --- a/packages/core/src/actions/multicall.test.ts +++ b/packages/core/src/actions/multicall.test.ts @@ -18,7 +18,7 @@ test('default', async () => { ).resolves.toMatchInlineSnapshot(` [ { - "result": 4n, + "result": 10n, "status": "success", }, ] @@ -40,7 +40,7 @@ test('allowFailure', async () => { }), ).resolves.toMatchInlineSnapshot(` [ - 4n, + 10n, ] `) }) diff --git a/packages/core/src/actions/prepareTransactionRequest.test.ts b/packages/core/src/actions/prepareTransactionRequest.test.ts index 1411011e3e..bc4a9befc9 100644 --- a/packages/core/src/actions/prepareTransactionRequest.test.ts +++ b/packages/core/src/actions/prepareTransactionRequest.test.ts @@ -1,8 +1,7 @@ import { accounts, config, privateKey } from '@wagmi/test' -import { expect, test } from 'vitest' - import { parseEther } from 'viem' import { privateKeyToAccount } from 'viem/accounts' +import { expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' import { prepareTransactionRequest } from './prepareTransactionRequest.js' @@ -19,6 +18,7 @@ test('default', async () => { const { gas: _gas, + gasPrice: _gasPrice, maxFeePerGas: _mfpg, maxPriorityFeePerGas: _mpfpg, nonce: _nonce, @@ -26,9 +26,9 @@ test('default', async () => { } = request expect(rest).toMatchInlineSnapshot(` { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 1, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "from": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", "type": "eip1559", "value": 1000000000000000000n, @@ -49,6 +49,7 @@ test('parameters: account', async () => { const { gas: _gas, + gasPrice: _gasPrice, maxFeePerGas: _mfpg, maxPriorityFeePerGas: _mpfpg, nonce: _nonce, @@ -56,9 +57,9 @@ test('parameters: account', async () => { } = request expect(rest).toMatchInlineSnapshot(` { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 1, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "from": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", "type": "eip1559", "value": 1000000000000000000n, @@ -79,6 +80,7 @@ test('behavior: local account', async () => { const { gas: _gas, + gasPrice: _gasPrice, maxFeePerGas: _mfpg, maxPriorityFeePerGas: _mpfpg, nonce: _nonce, @@ -87,11 +89,11 @@ test('behavior: local account', async () => { expect(rest).toMatchInlineSnapshot(` { "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "experimental_signAuthorization": [Function], + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "nonceManager": undefined, - "publicKey": "0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5", + "publicKey": "0x04e997cee8adb07b5269f375399109f53c94ddb7ac9cdb9252b74ba33fd471392fc563102ff7b38c85ee9d0a88c8819e6c97ea8b0db791d59c89086f62f5516863", "sign": [Function], + "signAuthorization": [Function], "signMessage": [Function], "signTransaction": [Function], "signTypedData": [Function], @@ -99,7 +101,7 @@ test('behavior: local account', async () => { "type": "local", }, "chainId": 1, - "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "from": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", "type": "eip1559", "value": 1000000000000000000n, diff --git a/packages/core/src/actions/prepareTransactionRequest.ts b/packages/core/src/actions/prepareTransactionRequest.ts index 36ed81f774..3f62f73e72 100644 --- a/packages/core/src/actions/prepareTransactionRequest.ts +++ b/packages/core/src/actions/prepareTransactionRequest.ts @@ -13,13 +13,12 @@ import type { Config } from '../createConfig.js' import type { SelectChains } from '../types/chain.js' import type { ChainIdParameter } from '../types/properties.js' import type { - Compute, IsNarrowable, UnionCompute, UnionStrictOmit, } from '../types/utils.js' import { getAction } from '../utils/getAction.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' export type PrepareTransactionRequestParameters< config extends Config = Config, @@ -73,19 +72,17 @@ export type PrepareTransactionRequestReturnType< /// chains extends readonly Chain[] = SelectChains, > = { - [key in keyof chains]: Compute< - viem_PrepareTransactionRequestReturnType< + [key in keyof chains]: viem_PrepareTransactionRequestReturnType< + IsNarrowable extends true ? chains[key] : undefined, + Account, + chains[key], + Account, + request extends viem_PrepareTransactionRequestRequest< IsNarrowable extends true ? chains[key] : undefined, - Account, - chains[key], - Account, - request extends viem_PrepareTransactionRequestRequest< - IsNarrowable extends true ? chains[key] : undefined, - chains[key] - > - ? request - : never + chains[key] > + ? request + : never > & { chainId: chains[key]['id'] } @@ -108,7 +105,7 @@ export async function prepareTransactionRequest< ): Promise> { const { account: account_, chainId, ...rest } = parameters - const account = account_ ?? getAccount(config).address + const account = account_ ?? getConnection(config).address const client = config.getClient({ chainId }) const action = getAction( diff --git a/packages/core/src/actions/readContract.bench-d.ts b/packages/core/src/actions/readContract.bench-d.ts new file mode 100644 index 0000000000..11f899abd6 --- /dev/null +++ b/packages/core/src/actions/readContract.bench-d.ts @@ -0,0 +1,41 @@ +import { attest } from '@ark/attest' +import type { abi } from '@wagmi/test' +import { parseAbi } from 'viem' +import viemPackageJson from 'viem/package.json' with { type: 'json' } +import { test } from 'vitest' +import type { ReadContractParameters } from './readContract.js' + +test('default', () => { + type Result = ReadContractParameters<(typeof abi)['erc20'], 'balanceOf'> + const res = {} as Result + attest.instantiations([132033, 'instantiations']) + attest(res.args) + if (viemPackageJson.version.startsWith('2.43')) + attest(res.args).type.toString.snap( + // biome-ignore lint/style/noUnusedTemplateLiteral: stable + `readonly [account: \`0x\${string}\`]`, + ) +}) + +const abiOverload = parseAbi([ + 'function foo() view returns (int8)', + 'function foo(address account) view returns (string)', + 'function foo(address sender, address account) view returns ((address foo, address bar))', + 'function bar() view returns (int8)', +]) +test('overloads', () => { + type Result = ReadContractParameters + const res = {} as Result + attest.instantiations([12984, 'instantiations']) + attest< + | readonly [] + | readonly [account: `0x${string}`] + | readonly [sender: `0x${string}`, account: `0x${string}`] + | undefined + >(res.args) + if (viemPackageJson.version.startsWith('2.43')) + attest(res.args).type.toString.snap(` | readonly [] + | readonly [account: \`0x\${string}\`] + | readonly [sender: \`0x\${string}\`, account: \`0x\${string}\`] + | undefined`) +}) diff --git a/packages/core/src/actions/readContract.test-d.ts b/packages/core/src/actions/readContract.test-d.ts index a667ec03e8..99c6c2f2d9 100644 --- a/packages/core/src/actions/readContract.test-d.ts +++ b/packages/core/src/actions/readContract.test-d.ts @@ -35,7 +35,6 @@ test('overloads', async () => { functionName: 'foo', args: ['0x'], }) - // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916 assertType(result3) const result4 = await readContract(config, { @@ -47,7 +46,6 @@ test('overloads', async () => { assertType<{ foo: `0x${string}` bar: `0x${string}` - // @ts-ignore – TODO: Fix https://github.com/wevm/viem/issues/1916 }>(result4) }) diff --git a/packages/core/src/actions/readContract.test.ts b/packages/core/src/actions/readContract.test.ts index 37f0db7e0c..c121070e31 100644 --- a/packages/core/src/actions/readContract.test.ts +++ b/packages/core/src/actions/readContract.test.ts @@ -11,7 +11,7 @@ test('default', async () => { functionName: 'balanceOf', args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], }), - ).resolves.toMatchInlineSnapshot('4n') + ).resolves.toMatchInlineSnapshot('10n') }) test('parameters: chainId', async () => { @@ -23,7 +23,7 @@ test('parameters: chainId', async () => { args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], chainId: chain.mainnet2.id, }), - ).resolves.toMatchInlineSnapshot('4n') + ).resolves.toMatchInlineSnapshot('10n') }) test('parameters: deployless read (bytecode)', async () => { diff --git a/packages/core/src/actions/readContract.ts b/packages/core/src/actions/readContract.ts index e01e74e9f2..9fce8fd899 100644 --- a/packages/core/src/actions/readContract.ts +++ b/packages/core/src/actions/readContract.ts @@ -1,5 +1,4 @@ -import type { Abi } from 'viem' -import type { ContractFunctionArgs, ContractFunctionName } from 'viem' +import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem' import { type ReadContractErrorType as viem_ReadContractErrorType, type ReadContractParameters as viem_ReadContractParameters, @@ -46,7 +45,7 @@ export function readContract< config extends Config, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, - args extends ContractFunctionArgs, + const args extends ContractFunctionArgs, >( config: config, parameters: ReadContractParameters, diff --git a/packages/core/src/actions/readContracts.test.ts b/packages/core/src/actions/readContracts.test.ts index c5e85ff3a8..b7da42c0b6 100644 --- a/packages/core/src/actions/readContracts.test.ts +++ b/packages/core/src/actions/readContracts.test.ts @@ -84,7 +84,7 @@ test('default', async () => { `) }) -test.skip('falls back to readContract if multicall is not available', async () => { +test('falls back to readContract if multicall is not available', async () => { const spy = vi.spyOn(readContract, 'readContract') const config = createConfig({ chains: [mainnet, { ...mainnet2, contracts: { multicall3: undefined } }], @@ -158,7 +158,7 @@ test.skip('falls back to readContract if multicall is not available', async () = `) }) -test.skip('multichain', async () => { +test('multichain', async () => { const config = createConfig({ chains: [mainnet, mainnet2, optimism], transports: { @@ -207,28 +207,28 @@ test.skip('multichain', async () => { args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', 0n], }, ] as const - const optimismContracts = [ - { - abi: abi.erc20, - address: address.optimism.usdc, - chainId: optimism.id, - functionName: 'symbol', - }, - { - abi: abi.erc20, - address: address.optimism.usdc, - chainId: optimism.id, - functionName: 'balanceOf', - args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], - }, - ] as const + // const optimismContracts = [ + // { + // abi: abi.erc20, + // address: address.optimism.usdc, + // chainId: optimism.id, + // functionName: 'symbol', + // }, + // { + // abi: abi.erc20, + // address: address.optimism.usdc, + // chainId: optimism.id, + // functionName: 'balanceOf', + // args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], + // }, + // ] as const const results = await readContracts(config, { contracts: [ mainnetContracts[0]!, - optimismContracts[0]!, + // optimismContracts[0]!, mainnetContracts[1]!, mainnet2Contracts[0]!, - optimismContracts[1]!, + // optimismContracts[1]!, mainnet2Contracts[1]!, mainnetContracts[2]!, ], @@ -236,10 +236,10 @@ test.skip('multichain', async () => { expectTypeOf(results).toEqualTypeOf< [ MulticallResponse, - MulticallResponse, + // MulticallResponse, MulticallResponse, MulticallResponse, - MulticallResponse, + // MulticallResponse, MulticallResponse, MulticallResponse, ] @@ -263,10 +263,6 @@ test.skip('multichain', async () => { "result": 2n, "status": "success", }, - { - "result": "USDC", - "status": "success", - }, { "result": 1n, "status": "success", @@ -275,10 +271,6 @@ test.skip('multichain', async () => { "result": false, "status": "success", }, - { - "result": 10959340n, - "status": "success", - }, { "result": 370395n, "status": "success", @@ -289,11 +281,11 @@ test.skip('multichain', async () => { }, ] `) -}) +}, 60_000) -test('multi-chain: falls back to readContract if multicall is not available', async () => { +test('multichain: falls back to readContract if multicall is not available', async () => { const config = createConfig({ - chains: [mainnet, { ...optimism, contracts: { multicall3: undefined } }], + chains: [{ ...mainnet, contracts: { multicall3: undefined } }, optimism], transports: { [mainnet.id]: http(), [optimism.id]: http(), @@ -317,39 +309,39 @@ test('multi-chain: falls back to readContract if multicall is not available', as args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], }, ] as const - const optimismContracts = [ - { - abi: abi.erc20, - address: address.optimism.usdc, - chainId: optimism.id, - functionName: 'symbol', - }, - { - abi: abi.erc20, - address: address.optimism.usdc, - chainId: optimism.id, - functionName: 'balanceOf', - args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], - }, - ] as const + // const optimismContracts = [ + // { + // abi: abi.erc20, + // address: address.optimism.usdc, + // chainId: optimism.id, + // functionName: 'symbol', + // }, + // { + // abi: abi.erc20, + // address: address.optimism.usdc, + // chainId: optimism.id, + // functionName: 'balanceOf', + // args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC'], + // }, + // ] as const const results = await readContracts(config, { - contracts: [...mainnetContracts, ...optimismContracts], + contracts: [...mainnetContracts /** ...optimismContracts */], }) expectTypeOf(results).toEqualTypeOf< [ MulticallResponse, MulticallResponse, - MulticallResponse, - MulticallResponse, + // MulticallResponse, + // MulticallResponse, ] >() for (const contract of mainnetContracts) { expect(spy).toBeCalledWith(config, { ...contract, chainId: mainnet.id }) } - for (const contract of optimismContracts) { - expect(spy).toBeCalledWith(config, { ...contract, chainId: optimism.id }) - } + // for (const contract of optimismContracts) { + // expect(spy).toBeCalledWith(config, { ...contract, chainId: optimism.id }) + // } expect(results).toMatchInlineSnapshot(` [ { @@ -360,17 +352,9 @@ test('multi-chain: falls back to readContract if multicall is not available', as "result": 1n, "status": "success", }, - { - "result": "USDC", - "status": "success", - }, - { - "result": 10959340n, - "status": "success", - }, ] `) -}) +}, 15_000) test('throws if allowFailure=false & a contract method fails', async () => { await expect( @@ -397,7 +381,7 @@ test('throws if allowFailure=false & a contract method fails', async () => { args: (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69420) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12] + Version: viem@2.44.0] `, ) }) @@ -450,7 +434,7 @@ test('allowFailure=true & a contract method fails', async () => { args: (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69420) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12], + Version: viem@2.44.0], "result": undefined, "status": "failure", }, @@ -464,7 +448,7 @@ test('allowFailure=true & a contract method fails', async () => { args: (0xA0Cf798816D4b9b9866b5330EEa46a18382f251e, 69421) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12], + Version: viem@2.44.0], "result": undefined, "status": "failure", }, @@ -502,7 +486,7 @@ test('throws if allowFailure=false & encoding contract function data fails', asy args: (1e+31) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12] + Version: viem@2.44.0] `, ) }) @@ -561,7 +545,7 @@ test('allowFailure=true & encoding contract function data fails', async () => { args: (1e+31) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12], + Version: viem@2.44.0], "result": undefined, "status": "failure", }, @@ -579,7 +563,7 @@ test('allowFailure=true & encoding contract function data fails', async () => { args: (1e+31) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12], + Version: viem@2.44.0], "result": undefined, "status": "failure", }, @@ -617,7 +601,7 @@ test('should throw if allowFailure=false & a contract has no response', async () args: (0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12] + Version: viem@2.44.0] `, ) }) @@ -669,7 +653,7 @@ test('allowFailure=true & a contract has no response', async () => { args: (0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC) Docs: https://viem.sh/docs/contract/readContract - Version: viem@2.23.12], + Version: viem@2.44.0], "result": undefined, "status": "failure", }, diff --git a/packages/core/src/actions/readContracts.ts b/packages/core/src/actions/readContracts.ts index 45f2a0cef4..4f433df513 100644 --- a/packages/core/src/actions/readContracts.ts +++ b/packages/core/src/actions/readContracts.ts @@ -59,7 +59,7 @@ export async function readContracts< allowFailure, blockNumber, blockTag, - chainId: Number.parseInt(chainId), + chainId: Number.parseInt(chainId, 10), contracts: contracts.map(({ contract }) => contract), }), ) diff --git a/packages/core/src/experimental/actions/sendCalls.test.ts b/packages/core/src/actions/sendCalls.test.ts similarity index 89% rename from packages/core/src/experimental/actions/sendCalls.test.ts rename to packages/core/src/actions/sendCalls.test.ts index 34e0db028e..54dd2b9d7f 100644 --- a/packages/core/src/experimental/actions/sendCalls.test.ts +++ b/packages/core/src/actions/sendCalls.test.ts @@ -2,8 +2,8 @@ import { accounts, config } from '@wagmi/test' import { parseEther } from 'viem' import { expect, test } from 'vitest' -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' import { sendCalls } from './sendCalls.js' const connector = config.connectors[0]! @@ -29,7 +29,11 @@ test('default', async () => { ], }), ).resolves.toMatchInlineSnapshot( - `"0x5dedb5a4ff8968db37459b52b83cbdc92b01c9c709c9cff26e345ef5cf27f92e"`, + ` + { + "id": "0xb24b52a86aa2b0bae6f1e44868c3a13d2572e766a1f6364afd93d1757839b8a1", + } + `, ) await disconnect(config, { connector }) }) @@ -80,7 +84,11 @@ test('behavior: nullish account (account filled by wallet)', async () => { ], }), ).resolves.toMatchInlineSnapshot( - `"0x035b56a56a5b2fea10e194bae4c846b415de48a8288c7eb704ba7880edcc29a0"`, + ` + { + "id": "0x0a8b20024fae14dd9e854accfc8496b9d18c291206647c842a96a954133401f3", + } + `, ) }) diff --git a/packages/core/src/experimental/actions/sendCalls.ts b/packages/core/src/actions/sendCalls.ts similarity index 67% rename from packages/core/src/experimental/actions/sendCalls.ts rename to packages/core/src/actions/sendCalls.ts index cabce545d9..456eb96532 100644 --- a/packages/core/src/experimental/actions/sendCalls.ts +++ b/packages/core/src/actions/sendCalls.ts @@ -4,30 +4,35 @@ import { type SendCallsParameters as viem_SendCallsParameters, type SendCallsReturnType as viem_SendCallsReturnType, sendCalls as viem_sendCalls, -} from 'viem/experimental' +} from 'viem/actions' -import { - type GetConnectorClientErrorType, - getConnectorClient, -} from '../../actions/getConnectorClient.js' -import type { Config } from '../../createConfig.js' -import type { BaseErrorType, ErrorType } from '../../errors/base.js' -import type { SelectChains } from '../../types/chain.js' +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' +} 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 SendCallsParameters< config extends Config = Config, chainId extends config['chains'][number]['id'] = config['chains'][number]['id'], + calls extends readonly unknown[] = readonly unknown[], /// chains extends readonly Chain[] = SelectChains, > = { [key in keyof chains]: Compute< - Omit, 'chain'> & + Omit< + viem_SendCallsParameters, + 'chain' + > & ChainIdParameter & ConnectorParameter > @@ -46,21 +51,24 @@ export type SendCallsErrorType = /** https://wagmi.sh/core/api/actions/sendCalls */ export async function sendCalls< + const calls extends readonly unknown[], config extends Config, chainId extends config['chains'][number]['id'], >( config: config, - parameters: SendCallsParameters, + parameters: SendCallsParameters, ): Promise { const { account, chainId, connector, calls, ...rest } = parameters const client = await getConnectorClient(config, { account, + assertChainId: false, chainId, connector, }) - return viem_sendCalls(client, { + const action = getAction(client, viem_sendCalls, 'sendCalls') + return action({ ...(rest as any), ...(typeof account !== 'undefined' ? { account } : {}), calls, diff --git a/packages/core/src/actions/sendCallsSync.test.ts b/packages/core/src/actions/sendCallsSync.test.ts new file mode 100644 index 0000000000..9ff1c727d0 --- /dev/null +++ b/packages/core/src/actions/sendCallsSync.test.ts @@ -0,0 +1,95 @@ +import { accounts, config, testClient, wait } from '@wagmi/test' +import { parseEther } from 'viem' +import { beforeEach, expect, test } from 'vitest' + +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' +import { sendCallsSync } from './sendCallsSync.js' + +const connector = config.connectors[0]! + +beforeEach(async () => { + await disconnect(config).catch(() => {}) +}) + +test('default', async () => { + await connect(config, { connector }) + const [status] = await Promise.all([ + sendCallsSync(config, { + calls: [ + { + data: '0xdeadbeef', + to: accounts[1], + value: parseEther('1'), + }, + { + to: accounts[2], + value: parseEther('2'), + }, + { + to: accounts[3], + value: parseEther('3'), + }, + ], + }), + (async () => { + await wait(1000) + await testClient.mainnet.mine({ blocks: 1 }) + })(), + ]) + expect(status).toBeDefined() + await disconnect(config, { connector }) +}) + +test('behavior: not connected', async () => { + await expect( + sendCallsSync(config, { + calls: [ + { + to: accounts[1], + value: parseEther('1'), + }, + { + to: accounts[2], + value: parseEther('2'), + }, + { + to: accounts[3], + value: parseEther('3'), + }, + ], + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [ConnectorNotConnectedError: Connector not connected. + + Version: @wagmi/core@x.y.z] + `) +}) + +test('behavior: account does not exist on connector', async () => { + await connect(config, { connector }) + await expect( + sendCallsSync(config, { + account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', + calls: [ + { + to: accounts[1], + value: parseEther('1'), + }, + { + to: accounts[2], + value: parseEther('2'), + }, + { + to: accounts[3], + value: parseEther('3'), + }, + ], + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [ConnectorAccountNotFoundError: Account "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e" not found for connector "Mock Connector". + + Version: @wagmi/core@x.y.z] + `) + await disconnect(config, { connector }) +}) diff --git a/packages/core/src/actions/sendCallsSync.ts b/packages/core/src/actions/sendCallsSync.ts new file mode 100644 index 0000000000..6ec708c8fb --- /dev/null +++ b/packages/core/src/actions/sendCallsSync.ts @@ -0,0 +1,77 @@ +import type { Account, Chain } from 'viem' +import { + type SendCallsSyncErrorType as viem_SendCallsSyncErrorType, + type SendCallsSyncParameters as viem_SendCallsSyncParameters, + type SendCallsSyncReturnType as viem_SendCallsSyncReturnType, + sendCallsSync as viem_sendCallsSync, +} 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 SendCallsSyncParameters< + config extends Config = Config, + chainId extends + config['chains'][number]['id'] = config['chains'][number]['id'], + calls extends readonly unknown[] = readonly unknown[], + /// + chains extends readonly Chain[] = SelectChains, +> = { + [key in keyof chains]: Compute< + Omit< + viem_SendCallsSyncParameters, + 'chain' + > & + ChainIdParameter & + ConnectorParameter + > +}[number] + +export type SendCallsSyncReturnType = viem_SendCallsSyncReturnType + +export type SendCallsSyncErrorType = + // getConnectorClient() + | GetConnectorClientErrorType + // base + | BaseErrorType + | ErrorType + // viem + | viem_SendCallsSyncErrorType + +/** https://wagmi.sh/core/api/actions/sendCallsSync */ +export async function sendCallsSync< + const calls extends readonly unknown[], + config extends Config, + chainId extends config['chains'][number]['id'], +>( + config: config, + parameters: SendCallsSyncParameters, +): Promise { + const { account, chainId, connector, calls, ...rest } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + const action = getAction(client, viem_sendCallsSync, 'sendCallsSync') + return action({ + ...(rest as any), + ...(typeof account !== 'undefined' ? { account } : {}), + calls, + chain: chainId ? { id: chainId } : undefined, + }) +} diff --git a/packages/core/src/actions/sendTransaction.test.ts b/packages/core/src/actions/sendTransaction.test.ts index 627d29b8fd..da1bf9eded 100644 --- a/packages/core/src/actions/sendTransaction.test.ts +++ b/packages/core/src/actions/sendTransaction.test.ts @@ -1,8 +1,7 @@ import { config, privateKey, transactionHashRegex } from '@wagmi/test' import { parseEther } from 'viem' -import { beforeEach, expect, test } from 'vitest' - import { privateKeyToAccount } from 'viem/accounts' +import { beforeEach, expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' import { sendTransaction } from './sendTransaction.js' @@ -83,12 +82,12 @@ test('behavior: value exceeds balance', async () => { - \`value\` is the amount of ether to send to the recipient. Request Arguments: - from: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 to: 0xd2135CfB216b74109775236E36d4b433F1DF507B value: 99999 ETH Details: Insufficient funds for gas * price + value - Version: viem@2.23.12] + Version: viem@2.44.0] `) await disconnect(config, { connector }) }) diff --git a/packages/core/src/actions/sendTransaction.ts b/packages/core/src/actions/sendTransaction.ts index 76bc3a420a..56f6d43e4f 100644 --- a/packages/core/src/actions/sendTransaction.ts +++ b/packages/core/src/actions/sendTransaction.ts @@ -70,6 +70,7 @@ export async function sendTransaction< else client = await getConnectorClient(config, { account: account ?? undefined, + assertChainId: false, chainId, connector, }) diff --git a/packages/core/src/actions/sendTransactionSync.test.ts b/packages/core/src/actions/sendTransactionSync.test.ts new file mode 100644 index 0000000000..ab40f10165 --- /dev/null +++ b/packages/core/src/actions/sendTransactionSync.test.ts @@ -0,0 +1,97 @@ +import { config, testClient, wait } from '@wagmi/test' +import { parseEther } from 'viem' +import { beforeEach, expect, test } from 'vitest' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' +import { sendTransactionSync } from './sendTransactionSync.js' + +const connector = config.connectors[0]! + +beforeEach(async () => { + if (config.state.current === connector.uid) + await disconnect(config, { connector }) +}) + +test('default', async () => { + const result = await connect(config, { connector }) + config.state.connections.set(connector.uid, { + ...result, + // Switch up the current account because the default one is running out of funds somewhere + accounts: result.accounts.slice(1) as unknown as typeof result.accounts, + connector, + }) + const [receipt] = await Promise.all([ + sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.0001'), + }), + (async () => { + await wait(1000) + await testClient.mainnet.mine({ blocks: 1 }) + })(), + ]) + expect(receipt).toBeDefined() + await disconnect(config, { connector }) +}) + +test('behavior: connector not connected', async () => { + await connect(config, { connector }) + await expect( + sendTransactionSync(config, { + connector: config.connectors[1], + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.0001'), + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [ConnectorNotConnectedError: Connector not connected. + + Version: @wagmi/core@x.y.z] + `) + await disconnect(config, { connector }) +}) + +test('behavior: account does not exist on connector', async () => { + await connect(config, { connector }) + await expect( + sendTransactionSync(config, { + account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.0001'), + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [ConnectorAccountNotFoundError: Account "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e" not found for connector "Mock Connector". + + Version: @wagmi/core@x.y.z] + `) + await disconnect(config, { connector }) +}) + +test('behavior: value exceeds balance', async () => { + await connect(config, { connector }) + await expect( + sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('99999'), + }), + ).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: + from: 0x95132632579b073D12a6673e18Ab05777a6B86f8 + to: 0xd2135CfB216b74109775236E36d4b433F1DF507B + value: 99999 ETH + + Details: Insufficient funds for gas * price + value + Version: viem@2.44.0] + `) + await disconnect(config, { connector }) +}) diff --git a/packages/core/src/actions/sendTransactionSync.ts b/packages/core/src/actions/sendTransactionSync.ts new file mode 100644 index 0000000000..4f9c648083 --- /dev/null +++ b/packages/core/src/actions/sendTransactionSync.ts @@ -0,0 +1,91 @@ +import type { + Account, + Chain, + Client, + TransactionRequest, + SendTransactionSyncErrorType as viem_SendTransactionSyncErrorType, + SendTransactionSyncParameters as viem_SendTransactionSyncParameters, + SendTransactionSyncReturnType as viem_SendTransactionSyncReturnType, +} from 'viem' +import { sendTransactionSync as viem_sendTransactionSync } 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 SendTransactionSyncParameters< + config extends Config = Config, + chainId extends + config['chains'][number]['id'] = config['chains'][number]['id'], + /// + chains extends readonly Chain[] = SelectChains, +> = { + [key in keyof chains]: Compute< + Omit< + viem_SendTransactionSyncParameters, + 'chain' | 'gas' + > & + ChainIdParameter & + ConnectorParameter + > +}[number] & { + /** Gas provided for transaction execution. */ + gas?: TransactionRequest['gas'] | null +} + +export type SendTransactionSyncReturnType = viem_SendTransactionSyncReturnType + +export type SendTransactionSyncErrorType = + // getConnectorClient() + | GetConnectorClientErrorType + // base + | BaseErrorType + | ErrorType + // viem + | viem_SendTransactionSyncErrorType + +/** https://wagmi.sh/core/api/actions/sendTransactionSync */ +export async function sendTransactionSync< + config extends Config, + chainId extends config['chains'][number]['id'], +>( + config: config, + parameters: SendTransactionSyncParameters, +): 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, + assertChainId: false, + chainId, + connector, + }) + + const action = getAction( + client, + viem_sendTransactionSync, + 'sendTransactionSync', + ) + const hash = await action({ + ...(rest as any), + ...(account ? { account } : {}), + chain: chainId ? { id: chainId } : null, + gas: rest.gas ?? undefined, + }) + + return hash +} diff --git a/packages/core/src/experimental/actions/showCallsStatus.test.ts b/packages/core/src/actions/showCallsStatus.test.ts similarity index 83% rename from packages/core/src/experimental/actions/showCallsStatus.test.ts rename to packages/core/src/actions/showCallsStatus.test.ts index d397886e05..5822242382 100644 --- a/packages/core/src/experimental/actions/showCallsStatus.test.ts +++ b/packages/core/src/actions/showCallsStatus.test.ts @@ -2,8 +2,8 @@ import { accounts, config, testClient } from '@wagmi/test' import { parseEther } from 'viem' import { test } from 'vitest' -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' import { sendCalls } from './sendCalls.js' import { showCallsStatus } from './showCallsStatus.js' @@ -11,7 +11,7 @@ const connector = config.connectors[0]! test('default', async () => { await connect(config, { connector }) - const id = await sendCalls(config, { + const { id } = await sendCalls(config, { calls: [ { data: '0xdeadbeef', diff --git a/packages/core/src/experimental/actions/showCallsStatus.ts b/packages/core/src/actions/showCallsStatus.ts similarity index 79% rename from packages/core/src/experimental/actions/showCallsStatus.ts rename to packages/core/src/actions/showCallsStatus.ts index a170ffe163..e3c6ae067d 100644 --- a/packages/core/src/experimental/actions/showCallsStatus.ts +++ b/packages/core/src/actions/showCallsStatus.ts @@ -3,11 +3,11 @@ import { type ShowCallsStatusParameters as viem_ShowCallsStatusParameters, type ShowCallsStatusReturnType as viem_ShowCallsStatusReturnType, showCallsStatus as viem_showCallsStatus, -} from 'viem/experimental' +} from 'viem/actions' -import { getConnectorClient } from '../../actions/getConnectorClient.js' -import type { Config } from '../../createConfig.js' -import type { ConnectorParameter } from '../../types/properties.js' +import type { Config } from '../createConfig.js' +import type { ConnectorParameter } from '../types/properties.js' +import { getConnectorClient } from './getConnectorClient.js' export type ShowCallsStatusParameters = viem_ShowCallsStatusParameters & ConnectorParameter diff --git a/packages/core/src/actions/signMessage.test.ts b/packages/core/src/actions/signMessage.test.ts index 62e0abfa3d..cc319dc72f 100644 --- a/packages/core/src/actions/signMessage.test.ts +++ b/packages/core/src/actions/signMessage.test.ts @@ -6,7 +6,7 @@ import { expect, test } from 'vitest' import { mock } from '../connectors/mock.js' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' import { signMessage } from './signMessage.js' const connector = config.connectors[0]! @@ -19,7 +19,7 @@ test('default', async () => { message: 'foo bar baz', signature, }), - ).resolves.toEqual(getAccount(config).address) + ).resolves.toEqual(getConnection(config).address) await disconnect(config, { connector }) }) @@ -51,7 +51,7 @@ test('behavior: user rejected request', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to sign message. - Version: viem@2.23.12] + Version: viem@2.44.0] `) await disconnect(config, { connector: connector_ }) }) diff --git a/packages/core/src/actions/signTypedData.test.ts b/packages/core/src/actions/signTypedData.test.ts index 68a0eca25a..199d1a90eb 100644 --- a/packages/core/src/actions/signTypedData.test.ts +++ b/packages/core/src/actions/signTypedData.test.ts @@ -1,12 +1,11 @@ import { accounts, config, privateKey, typedData } from '@wagmi/test' import { recoverTypedDataAddress } from 'viem' -import { expect, test } from 'vitest' - import { privateKeyToAccount } from 'viem/accounts' +import { expect, test } from 'vitest' import { mock } from '../connectors/mock.js' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' import { signTypedData } from './signTypedData.js' const connector = config.connectors[0]! @@ -25,7 +24,7 @@ test('default', async () => { message: typedData.basic.message, signature, }), - ).resolves.toBe(getAccount(config).address) + ).resolves.toBe(getConnection(config).address) await disconnect(config, { connector }) }) @@ -47,7 +46,7 @@ test('behavior: user rejected request', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to sign typed data. - Version: viem@2.23.12] + Version: viem@2.44.0] `) await disconnect(config, { connector: connector_ }) }) diff --git a/packages/core/src/actions/simulateContract.test-d.ts b/packages/core/src/actions/simulateContract.test-d.ts index 3f893ff8f8..bb274fdec3 100644 --- a/packages/core/src/actions/simulateContract.test-d.ts +++ b/packages/core/src/actions/simulateContract.test-d.ts @@ -1,7 +1,7 @@ import { abi, config } from '@wagmi/test' -import { http, type Address } from 'viem' +import { type Address, http } from 'viem' import { celo, mainnet } from 'viem/chains' -import { expectTypeOf, test } from 'vitest' +import { assertType, expectTypeOf, test } from 'vitest' import { createConfig } from '../createConfig.js' import { @@ -158,3 +158,39 @@ test('SimulateContractReturnType', () => { } }>() }) + +test('overloads', async () => { + const result1 = await simulateContract(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + }) + assertType(result1.result) + + const result2 = await simulateContract(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: [], + }) + assertType(result2.result) + + const result3 = await simulateContract(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: ['0x'], + }) + assertType(result3.result) + + const result4 = await simulateContract(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: ['0x', '0x'], + }) + assertType<{ + foo: `0x${string}` + bar: `0x${string}` + }>(result4.result) +}) diff --git a/packages/core/src/actions/simulateContract.test.ts b/packages/core/src/actions/simulateContract.test.ts index a52cbd5568..35bd17423b 100644 --- a/packages/core/src/actions/simulateContract.test.ts +++ b/packages/core/src/actions/simulateContract.test.ts @@ -29,7 +29,7 @@ test('parameters: account', async () => { }, ], "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "json-rpc", }, "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -67,7 +67,7 @@ test('parameters: connector', async () => { }, ], "account": { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "json-rpc", }, "address": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", diff --git a/packages/core/src/actions/simulateContract.ts b/packages/core/src/actions/simulateContract.ts index e5fe5655ff..7cd5598f95 100644 --- a/packages/core/src/actions/simulateContract.ts +++ b/packages/core/src/actions/simulateContract.ts @@ -20,12 +20,7 @@ import type { ChainIdParameter, ConnectorParameter, } from '../types/properties.js' -import type { - Compute, - PartialBy, - UnionCompute, - UnionStrictOmit, -} from '../types/utils.js' +import type { Compute, PartialBy, UnionCompute } from '../types/utils.js' import { getAction } from '../utils/getAction.js' import { type GetConnectorClientErrorType, @@ -51,19 +46,16 @@ export type SimulateContractParameters< chains extends readonly Chain[] = SelectChains, > = { [key in keyof chains]: UnionCompute< - UnionStrictOmit< - viem_SimulateContractParameters< - abi, - functionName, - args, - chains[key], - chains[key], - Account | Address - >, - 'chain' + // TODO: Should use `UnionStrictOmit<..., 'chain'>` on `viem_SimulateContractParameters` result instead, but it knocks out inference for overloads + viem_SimulateContractParameters< + abi, + functionName, + args, + chains[key], + chains[key], + Account | Address > - > & - ChainIdParameter & + > & { chain?: never } & ChainIdParameter & ConnectorParameter }[number] @@ -117,7 +109,7 @@ export async function simulateContract< config extends Config, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, - args extends ContractFunctionArgs< + const args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName @@ -142,6 +134,7 @@ export async function simulateContract< if (parameters.account) account = parameters.account else { const connectorClient = await getConnectorClient(config, { + assertChainId: false, chainId, connector, }) diff --git a/packages/core/src/actions/switchChain.test.ts b/packages/core/src/actions/switchChain.test.ts index 807b443a94..8d7b438a5e 100644 --- a/packages/core/src/actions/switchChain.test.ts +++ b/packages/core/src/actions/switchChain.test.ts @@ -4,7 +4,7 @@ import { expect, test } from 'vitest' import { mock } from '../connectors/mock.js' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getAccount } from './getAccount.js' +import { getConnection } from './getConnection.js' import { switchChain } from './switchChain.js' const connector = config.connectors[0]! @@ -12,17 +12,17 @@ const connector = config.connectors[0]! test('default', async () => { await connect(config, { connector }) - const chainId1 = getAccount(config).chainId + const chainId1 = getConnection(config).chainId await switchChain(config, { chainId: chain.mainnet2.id }) - const chainId2 = getAccount(config).chainId + const chainId2 = getConnection(config).chainId expect(chainId2).toBeDefined() expect(chainId1).not.toBe(chainId2) await switchChain(config, { chainId: chain.mainnet.id }) - const chainId3 = getAccount(config).chainId + const chainId3 = getConnection(config).chainId expect(chainId3).toBeDefined() expect(chainId1).toBe(chainId3) @@ -43,7 +43,7 @@ test('behavior: user rejected request', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to switch chain. - Version: viem@2.23.12] + Version: viem@2.44.0] `) await disconnect(config, { connector: connector_ }) }) diff --git a/packages/core/src/actions/switchAccount.test.ts b/packages/core/src/actions/switchConnection.test.ts similarity index 62% rename from packages/core/src/actions/switchAccount.test.ts rename to packages/core/src/actions/switchConnection.test.ts index 97d0e84b37..733b582e39 100644 --- a/packages/core/src/actions/switchAccount.test.ts +++ b/packages/core/src/actions/switchConnection.test.ts @@ -3,8 +3,8 @@ import { expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getAccount } from './getAccount.js' -import { switchAccount } from './switchAccount.js' +import { getConnection } from './getConnection.js' +import { switchConnection } from './switchConnection.js' const connector1 = config.connectors[0]! const connector2 = config.connectors[1]! @@ -13,17 +13,17 @@ test('default', async () => { await connect(config, { connector: connector2 }) await connect(config, { connector: connector1 }) - const address1 = getAccount(config).address + const address1 = getConnection(config).address - await switchAccount(config, { connector: connector2 }) + await switchConnection(config, { connector: connector2 }) - const address2 = getAccount(config).address + const address2 = getConnection(config).address expect(address2).toBeDefined() expect(address1).not.toBe(address2) - await switchAccount(config, { connector: connector1 }) + await switchConnection(config, { connector: connector1 }) - const address3 = getAccount(config).address + const address3 = getConnection(config).address expect(address3).toBeDefined() expect(address1).toBe(address3) diff --git a/packages/core/src/actions/switchAccount.ts b/packages/core/src/actions/switchConnection.ts similarity index 71% rename from packages/core/src/actions/switchAccount.ts rename to packages/core/src/actions/switchConnection.ts index ec577a57c7..6cec5c809f 100644 --- a/packages/core/src/actions/switchAccount.ts +++ b/packages/core/src/actions/switchConnection.ts @@ -7,27 +7,27 @@ import { type ConnectorNotConnectedErrorType, } from '../errors/config.js' -export type SwitchAccountParameters = { +export type SwitchConnectionParameters = { connector: Connector } -export type SwitchAccountReturnType = { +export type SwitchConnectionReturnType = { accounts: readonly [Address, ...Address[]] chainId: | config['chains'][number]['id'] | (number extends config['chains'][number]['id'] ? number : number & {}) } -export type SwitchAccountErrorType = +export type SwitchConnectionErrorType = | ConnectorNotConnectedErrorType | BaseError | ErrorType -/** https://wagmi.sh/core/api/actions/switchAccount */ -export async function switchAccount( +/** https://wagmi.sh/core/api/actions/switchConnection */ +export async function switchConnection( config: config, - parameters: SwitchAccountParameters, -): Promise> { + parameters: SwitchConnectionParameters, +): Promise> { const { connector } = parameters const connection = config.state.connections.get(connector.uid) diff --git a/packages/core/src/actions/verifyMessage.test.ts b/packages/core/src/actions/verifyMessage.test.ts index f2766cbea4..281a4aa23f 100644 --- a/packages/core/src/actions/verifyMessage.test.ts +++ b/packages/core/src/actions/verifyMessage.test.ts @@ -1,9 +1,9 @@ -import { accounts, config } from '@wagmi/test' +import { config } from '@wagmi/test' import { expect, test } from 'vitest' import { verifyMessage } from './verifyMessage.js' -const eoaAddress = accounts[0] +const eoaAddress = '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266' const smartAccountAddress = '0x3FCf42e10CC70Fe75A62EB3aDD6D305Aa840d145' test('smart account: valid signature', async () => { diff --git a/packages/core/src/actions/verifyTypedData.test-d.ts b/packages/core/src/actions/verifyTypedData.test-d.ts new file mode 100644 index 0000000000..df51cdb861 --- /dev/null +++ b/packages/core/src/actions/verifyTypedData.test-d.ts @@ -0,0 +1,20 @@ +import { config, typedData } from '@wagmi/test' +import { test } from 'vitest' + +import { verifyTypedData } from './verifyTypedData.js' + +test('default', async () => { + verifyTypedData(config, { + ...typedData.basic, + primaryType: 'Mail', + address: '0x', + signature: '0x', + }) + verifyTypedData(config, { + ...typedData.basic, + // @ts-expect-error + primaryType: 'foobarbaz', + address: '0x', + signature: '0x', + }) +}) diff --git a/packages/core/src/actions/verifyTypedData.ts b/packages/core/src/actions/verifyTypedData.ts index 4fac5463f5..cba510e058 100644 --- a/packages/core/src/actions/verifyTypedData.ts +++ b/packages/core/src/actions/verifyTypedData.ts @@ -8,14 +8,14 @@ import { import type { Config } from '../createConfig.js' import type { ChainIdParameter } from '../types/properties.js' -import type { Compute } from '../types/utils.js' +import type { UnionCompute } from '../types/utils.js' import { getAction } from '../utils/getAction.js' export type VerifyTypedDataParameters< typedData extends TypedData | Record = TypedData, primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData, config extends Config = Config, -> = Compute< +> = UnionCompute< viem_VerifyTypedDataParameters & ChainIdParameter > diff --git a/packages/core/src/experimental/actions/waitForCallsStatus.test.ts b/packages/core/src/actions/waitForCallsStatus.test.ts similarity index 69% rename from packages/core/src/experimental/actions/waitForCallsStatus.test.ts rename to packages/core/src/actions/waitForCallsStatus.test.ts index 0d3ce44998..381362d84c 100644 --- a/packages/core/src/experimental/actions/waitForCallsStatus.test.ts +++ b/packages/core/src/actions/waitForCallsStatus.test.ts @@ -2,8 +2,8 @@ import { accounts, config, testClient, wait } from '@wagmi/test' import { parseEther } from 'viem' import { expect, test } from 'vitest' -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' +import { connect } from './connect.js' +import { disconnect } from './disconnect.js' import { sendCalls } from './sendCalls.js' import { waitForCallsStatus } from './waitForCallsStatus.js' @@ -12,7 +12,7 @@ const connector = config.connectors[0]! test('default', async () => { await connect(config, { connector }) - const id = await sendCalls(config, { + const { id } = await sendCalls(config, { calls: [ { data: '0xdeadbeef', @@ -40,7 +40,7 @@ test('default', async () => { })(), ]) - expect(status).toBe('CONFIRMED') + expect(status).toBe('success') expect( receipts?.map((x) => ({ ...x, blockHash: undefined })), ).toMatchInlineSnapshot( @@ -48,27 +48,27 @@ test('default', async () => { [ { "blockHash": undefined, - "blockNumber": 19258214n, - "gasUsed": 21064n, + "blockNumber": 23535881n, + "gasUsed": 21160n, "logs": [], "status": "success", - "transactionHash": "0x13c53b2d4d9da424835525349cd66e553330f323d6fb19458b801ae1f7989a41", + "transactionHash": "0x7add018cb41f4b86d793758248d20cb8394364d9379d201cb7747db29c4aac18", }, { "blockHash": undefined, - "blockNumber": 19258214n, + "blockNumber": 23535881n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0xd8397b3e82b061c26a0c2093f1ceca0c3662a512614f7d6370349e89d0eea007", + "transactionHash": "0x5019ef03b9ee83c6398d1a68490b56878300c1f83697c3b3eeaf666baf63abff", }, { "blockHash": undefined, - "blockNumber": 19258214n, + "blockNumber": 23535881n, "gasUsed": 21000n, "logs": [], "status": "success", - "transactionHash": "0x4d26e346593d9ea265bb164b115e89aa92df43b0b8778ac75d4ad28e2a22b101", + "transactionHash": "0xe61204827da836e4bc51fbfe15f04e5b1307c50f160d1add15675c8654663f20", }, ] `, diff --git a/packages/core/src/experimental/actions/waitForCallsStatus.ts b/packages/core/src/actions/waitForCallsStatus.ts similarity index 72% rename from packages/core/src/experimental/actions/waitForCallsStatus.ts rename to packages/core/src/actions/waitForCallsStatus.ts index 2a02df2f48..a1c5764d32 100644 --- a/packages/core/src/experimental/actions/waitForCallsStatus.ts +++ b/packages/core/src/actions/waitForCallsStatus.ts @@ -3,11 +3,11 @@ import { type WaitForCallsStatusParameters as viem_WaitForCallsStatusParameters, type WaitForCallsStatusReturnType as viem_WaitForCallsStatusReturnType, waitForCallsStatus as viem_waitForCallsStatus, -} from 'viem/experimental' +} from 'viem/actions' -import { getConnectorClient } from '../../actions/getConnectorClient.js' -import type { Config } from '../../createConfig.js' -import type { ConnectorParameter } from '../../types/properties.js' +import type { Config } from '../createConfig.js' +import type { ConnectorParameter } from '../types/properties.js' +import { getConnectorClient } from './getConnectorClient.js' export type WaitForCallsStatusParameters = viem_WaitForCallsStatusParameters & ConnectorParameter @@ -21,7 +21,7 @@ export async function waitForCallsStatus( config: config, parameters: WaitForCallsStatusParameters, ): Promise { - const { connector, id } = parameters + const { connector } = parameters const client = await getConnectorClient(config, { connector }) - return viem_waitForCallsStatus(client, { id }) + return viem_waitForCallsStatus(client, parameters) } diff --git a/packages/core/src/actions/waitForTransactionReceipt.test.ts b/packages/core/src/actions/waitForTransactionReceipt.test.ts index 2a5146d8b1..ee0e7f488f 100644 --- a/packages/core/src/actions/waitForTransactionReceipt.test.ts +++ b/packages/core/src/actions/waitForTransactionReceipt.test.ts @@ -44,6 +44,7 @@ test('behavior: transaction reverted', async () => { [CallExecutionError: Execution reverted with reason: PartyBid::claim: contribution already claimed. Raw Call Arguments: + from: 0xa0cf798816d4b9b9866b5330eea46a18382f251e to: 0xf1332f21487e74612ed3a0fb36da729b73f1ae19 value: 0 ETH data: 0x1e83409a000000000000000000000000a0cf798816d4b9b9866b5330eea46a18382f251e @@ -53,6 +54,6 @@ test('behavior: transaction reverted', async () => { nonce: 43 Details: execution reverted: PartyBid::claim: contribution already claimed - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) diff --git a/packages/core/src/actions/waitForTransactionReceipt.ts b/packages/core/src/actions/waitForTransactionReceipt.ts index 5ac8fcdb20..4efa69d27d 100644 --- a/packages/core/src/actions/waitForTransactionReceipt.ts +++ b/packages/core/src/actions/waitForTransactionReceipt.ts @@ -63,10 +63,13 @@ export async function waitForTransactionReceipt< getTransaction, 'getTransaction', ) - const txn = await action_getTransaction({ hash: receipt.transactionHash }) + const { from: account, ...txn } = await action_getTransaction({ + hash: receipt.transactionHash, + }) const action_call = getAction(client, call, 'call') const code = await action_call({ ...(txn as any), + account, data: txn.input, gasPrice: txn.type !== 'eip1559' ? txn.gasPrice : undefined, maxFeePerGas: txn.type === 'eip1559' ? txn.maxFeePerGas : undefined, diff --git a/packages/core/src/actions/watchAccount.ts b/packages/core/src/actions/watchAccount.ts deleted file mode 100644 index dfa8ae4908..0000000000 --- a/packages/core/src/actions/watchAccount.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Config } from '../createConfig.js' -import { deepEqual } from '../utils/deepEqual.js' -import { type GetAccountReturnType, getAccount } from './getAccount.js' - -export type WatchAccountParameters = { - onChange( - account: GetAccountReturnType, - prevAccount: GetAccountReturnType, - ): void -} - -export type WatchAccountReturnType = () => void - -/** https://wagmi.sh/core/api/actions/watchAccount */ -export function watchAccount( - config: config, - parameters: WatchAccountParameters, -): WatchAccountReturnType { - const { onChange } = parameters - - return config.subscribe(() => getAccount(config), onChange, { - equalityFn(a, b) { - const { connector: aConnector, ...aRest } = a - const { connector: bConnector, ...bRest } = b - return ( - deepEqual(aRest, bRest) && - // check connector separately - aConnector?.id === bConnector?.id && - aConnector?.uid === bConnector?.uid - ) - }, - }) -} diff --git a/packages/core/src/actions/watchBlockNumber.test.ts b/packages/core/src/actions/watchBlockNumber.test.ts index 0a4299db58..636d723c20 100644 --- a/packages/core/src/actions/watchBlockNumber.test.ts +++ b/packages/core/src/actions/watchBlockNumber.test.ts @@ -1,5 +1,5 @@ import { config, testClient, wait } from '@wagmi/test' -import { expect, test } from 'vitest' +import { expect, test, vi } from 'vitest' import { watchBlockNumber } from './watchBlockNumber.js' @@ -16,12 +16,10 @@ test('default', async () => { await testClient.mainnet.mine({ blocks: 1 }) await wait(100) await testClient.mainnet.mine({ blocks: 1 }) - await wait(100) + await vi.waitUntil(() => blockNumbers.length === 3, { timeout: 5_000 }) expect(blockNumbers.length).toBe(3) - expect( - blockNumbers.map((blockNumber) => blockNumber - blockNumbers[0]!), - ).toEqual([0n, 1n, 2n]) unwatch() + await wait(100) }) diff --git a/packages/core/src/actions/watchBlockNumber.ts b/packages/core/src/actions/watchBlockNumber.ts index 712849080a..75379a6927 100644 --- a/packages/core/src/actions/watchBlockNumber.ts +++ b/packages/core/src/actions/watchBlockNumber.ts @@ -1,10 +1,9 @@ +import type { Chain, Transport, WebSocketTransport } from 'viem' import { type WatchBlockNumberParameters as viem_WatchBlockNumberParameters, type WatchBlockNumberReturnType as viem_WatchBlockNumberReturnType, watchBlockNumber as viem_watchBlockNumber, } from 'viem/actions' - -import type { Chain, Transport, WebSocketTransport } from 'viem' import type { Config } from '../createConfig.js' import type { SelectChains } from '../types/chain.js' import type { diff --git a/packages/core/src/actions/watchBlocks.test.ts b/packages/core/src/actions/watchBlocks.test.ts index caf4c0dc61..62b2629586 100644 --- a/packages/core/src/actions/watchBlocks.test.ts +++ b/packages/core/src/actions/watchBlocks.test.ts @@ -1,7 +1,6 @@ import { config, testClient, wait } from '@wagmi/test' -import { expect, test } from 'vitest' - import type { Block } from 'viem' +import { expect, test, vi } from 'vitest' import { watchBlocks } from './watchBlocks.js' test('default', async () => { @@ -13,18 +12,14 @@ test('default', async () => { }) await testClient.mainnet.mine({ blocks: 1 }) - await wait(100) + await wait(500) await testClient.mainnet.mine({ blocks: 1 }) - await wait(100) + await wait(500) await testClient.mainnet.mine({ blocks: 1 }) - await wait(100) + await vi.waitUntil(() => blocks.length === 3, { timeout: 5_000 }) expect(blocks.length).toBe(3) - expect(blocks.map((block) => block.number! - blocks[0]?.number!)).toEqual([ - 0n, - 1n, - 2n, - ]) unwatch() + await wait(100) }) diff --git a/packages/core/src/actions/watchBlocks.ts b/packages/core/src/actions/watchBlocks.ts index c6f3225dc9..cd2dcf0676 100644 --- a/packages/core/src/actions/watchBlocks.ts +++ b/packages/core/src/actions/watchBlocks.ts @@ -1,10 +1,9 @@ +import type { BlockTag, Chain, Transport, WebSocketTransport } from 'viem' import { type WatchBlocksParameters as viem_WatchBlocksParameters, type WatchBlocksReturnType as viem_WatchBlocksReturnType, watchBlocks as viem_watchBlocks, } from 'viem/actions' - -import type { BlockTag, Chain, Transport, WebSocketTransport } from 'viem' import type { Config } from '../createConfig.js' import type { SelectChains } from '../types/chain.js' import type { diff --git a/packages/core/src/actions/watchAccount.test.ts b/packages/core/src/actions/watchConnection.test.ts similarity index 63% rename from packages/core/src/actions/watchAccount.test.ts rename to packages/core/src/actions/watchConnection.test.ts index c803165888..26de7a6f9f 100644 --- a/packages/core/src/actions/watchAccount.test.ts +++ b/packages/core/src/actions/watchConnection.test.ts @@ -4,27 +4,27 @@ import { expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { watchAccount } from './watchAccount.js' +import { watchConnection } from './watchConnection.js' test('default', async () => { - const accounts: { address: Address | undefined; status: string }[] = [] - const unwatch = watchAccount(config, { + const connections: { address: Address | undefined; status: string }[] = [] + const unwatch = watchConnection(config, { onChange(data) { - accounts.push({ address: data.address, status: data.status }) + connections.push({ address: data.address, status: data.status }) }, }) await connect(config, { connector: config.connectors[0]! }) await disconnect(config) - expect(accounts).toMatchInlineSnapshot(` + expect(connections).toMatchInlineSnapshot(` [ { "address": undefined, "status": "connecting", }, { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "status": "connected", }, { diff --git a/packages/core/src/actions/watchConnection.ts b/packages/core/src/actions/watchConnection.ts new file mode 100644 index 0000000000..a1b6b22e19 --- /dev/null +++ b/packages/core/src/actions/watchConnection.ts @@ -0,0 +1,33 @@ +import type { Config } from '../createConfig.js' +import { deepEqual } from '../utils/deepEqual.js' +import { type GetConnectionReturnType, getConnection } from './getConnection.js' + +export type WatchConnectionParameters = { + onChange( + connection: GetConnectionReturnType, + prevConnection: GetConnectionReturnType, + ): void +} + +export type WatchConnectionReturnType = () => void + +/** https://wagmi.sh/core/api/actions/watchConnection */ +export function watchConnection( + config: config, + parameters: WatchConnectionParameters, +): WatchConnectionReturnType { + const { onChange } = parameters + + return config.subscribe(() => getConnection(config), onChange, { + equalityFn(a, b) { + const { connector: aConnector, ...aRest } = a + const { connector: bConnector, ...bRest } = b + return ( + deepEqual(aRest, bRest) && + // check connector separately + aConnector?.id === bConnector?.id && + aConnector?.uid === bConnector?.uid + ) + }, + }) +} diff --git a/packages/core/src/actions/watchContractEvent.test-d.ts b/packages/core/src/actions/watchContractEvent.test-d.ts index e6624fff57..00ae6f4a23 100644 --- a/packages/core/src/actions/watchContractEvent.test-d.ts +++ b/packages/core/src/actions/watchContractEvent.test-d.ts @@ -60,8 +60,6 @@ test('behavior: no eventName', () => { onLogs(logs) { expectTypeOf(logs[0]!.eventName).toEqualTypeOf<'Transfer' | 'Approval'>() expectTypeOf(logs[0]!.args).toEqualTypeOf< - | Record - | readonly unknown[] | { from?: `0x${string}` | undefined to?: `0x${string}` | undefined diff --git a/packages/core/src/actions/watchContractEvent.test.ts b/packages/core/src/actions/watchContractEvent.test.ts index 759a21dd19..72486ed59d 100644 --- a/packages/core/src/actions/watchContractEvent.test.ts +++ b/packages/core/src/actions/watchContractEvent.test.ts @@ -7,13 +7,13 @@ import { transactionHashRegex, wait, } from '@wagmi/test' -import { http, createWalletClient, parseEther } from 'viem' +import { createWalletClient, erc20Abi, http, parseEther } from 'viem' import type { WatchEventOnLogsParameter } from 'viem/actions' import { beforeEach, expect, test } from 'vitest' import { connect } from './connect.js' import { disconnect } from './disconnect.js' -import { getBalance } from './getBalance.js' +import { readContract } from './readContract.js' import { watchContractEvent } from './watchContractEvent.js' import { writeContract } from './writeContract.js' @@ -53,11 +53,13 @@ test('default', async () => { address: address.usdcHolder, }) - const balance = await getBalance(config, { - address: connectedAddress, - token: address.usdc, + const balance = await readContract(config, { + address: address.usdc, + abi: erc20Abi, + functionName: 'balanceOf', + args: [connectedAddress], }) - expect(balance.value).toBeGreaterThan(0n) + expect(balance).toBeGreaterThan(0n) // start watching transfer events let logs: WatchEventOnLogsParameter = [] @@ -89,6 +91,7 @@ test('default', async () => { await wait(1000) // wait for events to be emitted unwatch() + await wait(100) expect(logs.length).toBe(2) expect(logs[0]?.transactionHash).toMatch(transactionHashRegex) diff --git a/packages/core/src/actions/watchPendingTransactions.test.ts b/packages/core/src/actions/watchPendingTransactions.test.ts index 510b9acce3..6ddd3a0778 100644 --- a/packages/core/src/actions/watchPendingTransactions.test.ts +++ b/packages/core/src/actions/watchPendingTransactions.test.ts @@ -42,6 +42,7 @@ test('default', async () => { await testClient.mainnet.mine({ blocks: 1 }) unwatch() + await wait(100) expect(transactions.length).toBe(2) expect(transactions[0]).toMatch(transactionHashRegex) diff --git a/packages/core/src/actions/writeContract.bench-d.ts b/packages/core/src/actions/writeContract.bench-d.ts new file mode 100644 index 0000000000..e84114089c --- /dev/null +++ b/packages/core/src/actions/writeContract.bench-d.ts @@ -0,0 +1,41 @@ +import { attest } from '@ark/attest' +import type { abi } from '@wagmi/test' +import { parseAbi } from 'viem' +import viemPackageJson from 'viem/package.json' with { type: 'json' } +import { test } from 'vitest' +import type { WriteContractParameters } from './writeContract.js' + +test('default', () => { + type Result = WriteContractParameters<(typeof abi)['erc20'], 'approve'> + const res = {} as Result + attest.instantiations([143162, 'instantiations']) + attest(res.args) + if (viemPackageJson.version.startsWith('2.43')) + attest(res.args).type.toString.snap( + // biome-ignore lint/style/noUnusedTemplateLiteral: stable + `readonly [spender: \`0x\${string}\`, amount: bigint]`, + ) +}) + +const abiOverload = parseAbi([ + 'function foo() returns (int8)', + 'function foo(address account) returns (string)', + 'function foo(address sender, address account) returns ((address foo, address bar))', + 'function bar() returns (int8)', +]) +test('overloads', () => { + type Result = WriteContractParameters + const res = {} as Result + attest.instantiations([21691, 'instantiations']) + attest< + | readonly [] + | readonly [account: `0x${string}`] + | readonly [sender: `0x${string}`, account: `0x${string}`] + | undefined + >(res.args) + if (viemPackageJson.version.startsWith('2.43')) + attest(res.args).type.toString.snap(` | readonly [] + | readonly [account: \`0x\${string}\`] + | readonly [sender: \`0x\${string}\`, account: \`0x\${string}\`] + | undefined`) +}) diff --git a/packages/core/src/actions/writeContract.test-d.ts b/packages/core/src/actions/writeContract.test-d.ts index 68009a3773..29098787d5 100644 --- a/packages/core/src/actions/writeContract.test-d.ts +++ b/packages/core/src/actions/writeContract.test-d.ts @@ -1,5 +1,5 @@ import { abi, config } from '@wagmi/test' -import { http, type Address, parseAbi } from 'viem' +import { type Address, http, parseAbi } from 'viem' import { celo, mainnet } from 'viem/chains' import { expectTypeOf, test } from 'vitest' diff --git a/packages/core/src/actions/writeContract.ts b/packages/core/src/actions/writeContract.ts index 5fb6d87104..63377e5331 100644 --- a/packages/core/src/actions/writeContract.ts +++ b/packages/core/src/actions/writeContract.ts @@ -47,7 +47,7 @@ export type WriteContractParameters< > = UnionCompute< { // TODO: Should use `UnionStrictOmit<..., 'chain'>` on `viem_WriteContractParameters` result instead - // temp workaround that doesn't affect runtime behavior for for https://github.com/wevm/wagmi/issues/3981 + // temp workaround that doesn't affect runtime behavior for https://github.com/wevm/wagmi/issues/3981 [key in keyof chains]: viem_WriteContractParameters< abi, functionName, @@ -59,10 +59,7 @@ export type WriteContractParameters< > }[number] & Compute> & - ConnectorParameter & { - /** @deprecated */ - __mode?: 'prepared' - } + ConnectorParameter > export type WriteContractReturnType = viem_WriteContractReturnType @@ -99,6 +96,7 @@ export async function writeContract< else client = await getConnectorClient(config, { account: account ?? undefined, + assertChainId: false, chainId, connector, }) diff --git a/packages/core/src/connectors/createConnector.test.ts b/packages/core/src/connectors/createConnector.test.ts index d1ff9f20af..8ce1468738 100644 --- a/packages/core/src/connectors/createConnector.test.ts +++ b/packages/core/src/connectors/createConnector.test.ts @@ -1,4 +1,3 @@ -import type { Address } from 'viem' import { test } from 'vitest' import { createConnector } from './createConnector.js' @@ -10,7 +9,7 @@ test('default', () => { type: 'test', async setup() {}, async connect() { - return { accounts: [] as Address[], chainId: 123 } + return { accounts: [] as never, chainId: 123 } }, async disconnect() {}, async getAccounts() { diff --git a/packages/core/src/connectors/createConnector.ts b/packages/core/src/connectors/createConnector.ts index 54b4d9955c..bf2d05e21b 100644 --- a/packages/core/src/connectors/createConnector.ts +++ b/packages/core/src/connectors/createConnector.ts @@ -38,17 +38,23 @@ export type CreateConnectorFn< readonly id: string readonly name: string readonly rdns?: string | readonly string[] | undefined - /** @deprecated */ - readonly supportsSimulation?: boolean | undefined readonly type: string setup?(): Promise - connect( + // TODO(v3): Make `withCapabilities: true` default behavior + connect( parameters?: - | { chainId?: number | undefined; isReconnecting?: boolean | undefined } + | { + chainId?: number | undefined + isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined + } | undefined, ): Promise<{ - accounts: readonly Address[] + // TODO(v3): Add `capabilities` (e.g. `readonly { address: Address; capabilities: Record | undefined }`) + accounts: withCapabilities extends true + ? readonly { address: Address; capabilities: Record }[] + : readonly Address[] chainId: number }> disconnect(): Promise diff --git a/packages/core/src/connectors/injected.ts b/packages/core/src/connectors/injected.ts index d686d0aa29..99444164b7 100644 --- a/packages/core/src/connectors/injected.ts +++ b/packages/core/src/connectors/injected.ts @@ -2,14 +2,14 @@ import { type AddEthereumChainParameter, type Address, type EIP1193Provider, + getAddress, + numberToHex, type ProviderConnectInfo, type ProviderRpcError, ResourceUnavailableRpcError, type RpcError, SwitchChainError, UserRejectedRequestError, - getAddress, - numberToHex, withRetry, withTimeout, } from 'viem' @@ -88,10 +88,6 @@ export function injected(parameters: InjectedParameters = {}) { get name() { return getTarget().name }, - /** @deprecated */ - get supportsSimulation() { - return true - }, type: injected.type, async setup() { const provider = await this.getProvider() @@ -110,7 +106,7 @@ export function injected(parameters: InjectedParameters = {}) { } } }, - async connect({ chainId, isReconnecting } = {}) { + async connect({ chainId, isReconnecting, withCapabilities } = {}) { const provider = await this.getProvider() if (!provider) throw new ProviderNotFoundError() @@ -189,7 +185,12 @@ export function injected(parameters: InjectedParameters = {}) { if (!parameters.target) await config.storage?.setItem('injected.connected', true) - return { accounts, chainId: currentChainId } + return { + accounts: (withCapabilities + ? accounts.map((address) => ({ address, capabilities: {} })) + : accounts) as never, + chainId: currentChainId, + } } catch (err) { const error = err as RpcError if (error.code === UserRejectedRequestError.code) diff --git a/packages/core/src/connectors/mock.test.ts b/packages/core/src/connectors/mock.test.ts index 5beef19aa4..9359c1b529 100644 --- a/packages/core/src/connectors/mock.test.ts +++ b/packages/core/src/connectors/mock.test.ts @@ -1,6 +1,6 @@ import { accounts, config } from '@wagmi/test' +import type { Address, Hex } from 'viem' import { expect, expectTypeOf, test } from 'vitest' - import type { Connector } from '../createConfig.js' import type { CreateConnectorFn } from './createConnector.js' import { mock } from './mock.js' @@ -21,16 +21,50 @@ test('setup', () => { Parameters<(typeof connector)['connect']>[0] > expectTypeOf().toMatchTypeOf() + + type ConnectFnReturnType = Awaited> + expectTypeOf().toMatchTypeOf< + | readonly `0x${string}`[] + | readonly { + address: Address + capabilities: { + foo: { + bar: Hex + } + } + }[] + >() +}) + +test('behavior: connect#withCapabilities', async () => { + const connectorFn = mock({ accounts }) + const connector = config._internal.connectors.setup(connectorFn) + const res = await connector.connect({ withCapabilities: true }) + expectTypeOf(res.accounts).toEqualTypeOf< + readonly { + address: Address + capabilities: Record + }[] + >() + expect(res).toMatchObject( + expect.objectContaining({ + accounts: expect.arrayContaining([ + expect.objectContaining({ address: expect.any(String) }), + ]), + }), + ) }) -test('behavior: features.connectError', () => { +test('behavior: features.connectError', async () => { const connectorFn = mock({ accounts, features: { connectError: true } }) const connector = config._internal.connectors.setup(connectorFn) - expect(() => connector.connect()).rejects.toThrowErrorMatchingInlineSnapshot(` + await expect(() => + connector.connect(), + ).rejects.toThrowErrorMatchingInlineSnapshot(` [UserRejectedRequestError: User rejected the request. Details: Failed to connect. - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) @@ -49,7 +83,7 @@ test('behavior: connector.getProvider request errors', async () => { ) as ReturnType const provider = await connector.getProvider() - expect( + await expect( provider.request({ method: 'eth_signTypedData_v4', params: [] as any, @@ -58,10 +92,10 @@ test('behavior: connector.getProvider request errors', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to sign typed data. - Version: viem@2.23.12] + Version: viem@2.44.0] `) - expect( + await expect( provider.request({ method: 'wallet_switchEthereumChain', params: [] as any, @@ -70,10 +104,10 @@ test('behavior: connector.getProvider request errors', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to switch chain. - Version: viem@2.23.12] + Version: viem@2.44.0] `) - expect( + await expect( provider.request({ method: 'wallet_watchAsset', params: [] as any, @@ -82,10 +116,10 @@ test('behavior: connector.getProvider request errors', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to switch chain. - Version: viem@2.23.12] + Version: viem@2.44.0] `) - expect( + await expect( provider.request({ method: 'personal_sign', params: [] as any, @@ -94,7 +128,7 @@ test('behavior: connector.getProvider request errors', async () => { [UserRejectedRequestError: User rejected the request. Details: Failed to sign message. - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) diff --git a/packages/core/src/connectors/mock.ts b/packages/core/src/connectors/mock.ts index 8a2dd8a6e6..141c47b505 100644 --- a/packages/core/src/connectors/mock.ts +++ b/packages/core/src/connectors/mock.ts @@ -1,19 +1,20 @@ import { type Address, + custom, type EIP1193RequestFn, + fromHex, + getAddress, type Hex, + keccak256, + numberToHex, RpcRequestError, SwitchChainError, + stringToHex, type Transport, UserRejectedRequestError, type WalletCallReceipt, + type WalletGetCallsStatusReturnType, type WalletRpcSchema, - custom, - fromHex, - getAddress, - keccak256, - numberToHex, - stringToHex, } from 'viem' import { rpc } from 'viem/utils' @@ -49,12 +50,23 @@ export function mock(parameters: MockParameters) { Transport<'custom', unknown, EIP1193RequestFn> > type Properties = { - connect(parameters?: { + // TODO(v3): Make `withCapabilities: true` default behavior + connect(parameters?: { chainId?: number | undefined isReconnecting?: boolean | undefined foo?: string | undefined + withCapabilities?: withCapabilities | boolean | undefined }): Promise<{ - accounts: readonly Address[] + accounts: withCapabilities extends true + ? readonly { + address: Address + capabilities: { + foo: { + bar: Hex + } + } + }[] + : readonly Address[] chainId: number }> } @@ -68,7 +80,7 @@ export function mock(parameters: MockParameters) { async setup() { connectedChainId = config.chains[0].id }, - async connect({ chainId } = {}) { + async connect({ chainId, withCapabilities } = {}) { if (features.connectError) { if (typeof features.connectError === 'boolean') throw new UserRejectedRequestError(new Error('Failed to connect.')) @@ -89,7 +101,12 @@ export function mock(parameters: MockParameters) { connected = true return { - accounts: accounts.map((x) => getAddress(x)), + accounts: (withCapabilities + ? accounts.map((x) => ({ + address: getAddress(x), + capabilities: { foo: { bar: x } }, + })) + : accounts.map((x) => getAddress(x))) as never, chainId: currentChainId, } }, @@ -189,7 +206,7 @@ export function mock(parameters: MockParameters) { paymasterService: { supported: (params as [Hex])[0] === - '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', + '0x95132632579b073D12a6673e18Ab05777a6B86f8', }, sessionKeys: { supported: true, @@ -199,7 +216,7 @@ export function mock(parameters: MockParameters) { paymasterService: { supported: (params as [Hex])[0] === - '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', + '0x95132632579b073D12a6673e18Ab05777a6B86f8', }, }, } @@ -207,11 +224,17 @@ export function mock(parameters: MockParameters) { if (method === 'wallet_sendCalls') { const hashes = [] const calls = (params as any)[0].calls + const from = (params as any)[0].from for (const call of calls) { const { result, error } = await rpc.http(url, { body: { method: 'eth_sendTransaction', - params: [call], + params: [ + { + ...call, + ...(typeof from !== 'undefined' ? { from } : {}), + }, + ], }, }) if (error) @@ -224,12 +247,21 @@ export function mock(parameters: MockParameters) { } const id = keccak256(stringToHex(JSON.stringify(calls))) transactionCache.set(id, hashes) - return id + return { id } } if (method === 'wallet_getCallsStatus') { const hashes = transactionCache.get((params as any)[0]) - if (!hashes) return null + if (!hashes) + return { + atomic: false, + chainId: '0x1', + id: (params as any)[0], + status: 100, + receipts: [], + version: '2.0.0', + } satisfies WalletGetCallsStatusReturnType + const receipts = await Promise.all( hashes.map(async (hash) => { const { result, error } = await rpc.http(url, { @@ -256,9 +288,24 @@ export function mock(parameters: MockParameters) { } satisfies WalletCallReceipt }), ) - if (receipts.some((x) => !x)) - return { status: 'PENDING', receipts: [] } - return { status: 'CONFIRMED', receipts } + const receipts_ = receipts.filter((x) => x !== null) + if (receipts_.length === 0) + return { + atomic: false, + chainId: '0x1', + id: (params as any)[0], + status: 100, + receipts: [], + version: '2.0.0', + } satisfies WalletGetCallsStatusReturnType + return { + atomic: false, + chainId: '0x1', + id: (params as any)[0], + status: 200, + receipts: receipts_, + version: '2.0.0', + } satisfies WalletGetCallsStatusReturnType } if (method === 'wallet_showCallsStatus') return diff --git a/packages/core/src/createConfig.test-d.ts b/packages/core/src/createConfig.test-d.ts index 3daa57bd5f..fb693fa594 100644 --- a/packages/core/src/createConfig.test-d.ts +++ b/packages/core/src/createConfig.test-d.ts @@ -1,5 +1,5 @@ import { accounts } from '@wagmi/test' -import { http, createClient, webSocket } from 'viem' +import { createClient, http, webSocket } from 'viem' import { mainnet, sepolia } from 'viem/chains' import { expectTypeOf, test } from 'vitest' @@ -73,7 +73,7 @@ test('behavior: missing transport for chain', () => { transports: { [mainnet.id]: http(), // @ts-expect-error - [123]: http(), + 123: http(), }, }) }) diff --git a/packages/core/src/createConfig.test.ts b/packages/core/src/createConfig.test.ts index a6ae41e280..de3f2160dd 100644 --- a/packages/core/src/createConfig.test.ts +++ b/packages/core/src/createConfig.test.ts @@ -1,8 +1,8 @@ import { accounts, chain, wait } from '@wagmi/test' import { + announceProvider, type EIP1193Provider, type EIP6963ProviderDetail, - announceProvider, } from 'mipd' import { http } from 'viem' import { expect, test, vi } from 'vitest' @@ -12,8 +12,9 @@ import { disconnect } from './actions/disconnect.js' import { switchChain } from './actions/switchChain.js' import { createConnector } from './connectors/createConnector.js' import { mock } from './connectors/mock.js' -import { createConfig } from './createConfig.js' +import { type Connection, createConfig } from './createConfig.js' import { createStorage } from './createStorage.js' +import { serialize } from './utils/serialize.js' const { mainnet, optimism } = chain @@ -426,6 +427,62 @@ test('behavior: eip 6963 providers', async () => { `) }) +test('behavior: revalidate connections', async () => { + const state = { + 'wagmi.store': serialize({ + state: { chainId: 1 }, + version: 1, + }), + } as Record + Object.defineProperty(window, 'localStorage', { + value: { + getItem: vi.fn((key) => state[key] ?? null), + removeItem: vi.fn((key) => state.delete?.[key]), + setItem: vi.fn((key, value) => { + state[key] = value + }), + }, + writable: true, + }) + + const config = createConfig({ + chains: [mainnet], + connectors: [ + mock({ accounts }), + mock({ accounts, features: { defaultConnected: true, reconnect: true } }), + mock({ accounts }), + ], + storage: createStorage<{ store: object }>({ + storage: window.localStorage, + }), + transports: { + [mainnet.id]: http(), + }, + }) + + const connections = new Map() + const c1 = config.connectors.at(0)! + const c2 = config.connectors.at(1)! + const c3 = config.connectors.at(2)! + connections.set(c1.uid, { accounts: ['0x'], chainId: 1, connector: c1 }) + connections.set(c2.uid, { accounts: ['0x'], chainId: 1, connector: c2 }) + connections.set(c3.uid, { accounts: ['0x'], chainId: 1, connector: c3 }) + connections.set('foo', { + accounts: ['0x'], + chainId: 1, + connector: { + id: 'foo', + name: 'foo', + type: 'foo', + uid: 'foo', + } as Connection['connector'], + }) + config.setState((state) => ({ ...state, connections })) + await config._internal.revalidate() + + expect([...config.state.connections.keys()]).toEqual([c2.uid]) +}) + function getProviderDetail( info: Pick, ): EIP6963ProviderDetail { diff --git a/packages/core/src/createConfig.ts b/packages/core/src/createConfig.ts index 154eef5f6d..b64cf305aa 100644 --- a/packages/core/src/createConfig.ts +++ b/packages/core/src/createConfig.ts @@ -1,30 +1,30 @@ import { + createStore as createMipd, type EIP6963ProviderDetail, type Store as MipdStore, - createStore as createMipd, } from 'mipd' import { type Address, type Chain, type Client, - type EIP1193RequestFn, createClient, + type EIP1193RequestFn, type ClientConfig as viem_ClientConfig, type Transport as viem_Transport, } from 'viem' import { persist, subscribeWithSelector } from 'zustand/middleware' -import { type Mutate, type StoreApi, createStore } from 'zustand/vanilla' +import { createStore, type Mutate, type StoreApi } from 'zustand/vanilla' import type { ConnectorEventMap, CreateConnectorFn, } from './connectors/createConnector.js' import { injected } from './connectors/injected.js' -import { type Emitter, type EventData, createEmitter } from './createEmitter.js' +import { createEmitter, type Emitter, type EventData } from './createEmitter.js' import { - type Storage, createStorage, getDefaultStorage, + type Storage, } from './createStorage.js' import { ChainNotConfiguredError } from './errors/config.js' import type { @@ -198,9 +198,9 @@ export function createConfig< let currentVersion: number const prefix = '0.0.0-canary-' if (version.startsWith(prefix)) - currentVersion = Number.parseInt(version.replace(prefix, '')) + currentVersion = Number.parseInt(version.replace(prefix, ''), 10) // use package major version to version store - else currentVersion = Number.parseInt(version.split('.')[0] ?? '0') + else currentVersion = Number.parseInt(version.split('.')[0] ?? '0', 10) const store = createStore( subscribeWithSelector( @@ -414,7 +414,9 @@ export function createConfig< return chains.getState() as chains }, get connectors() { - return connectors.getState() as Connector[] + return connectors.getState() as Readonly<{ + [key in keyof connectorFns]: Connector + }> }, storage, @@ -451,6 +453,26 @@ export function createConfig< _internal: { mipd, + async revalidate() { + // Check connections to see if they are still active + const state = store.getState() + const connections = state.connections + let current = state.current + for (const [, connection] of connections) { + const connector = connection.connector + // check if `connect.isAuthorized` exists + // partial connectors in storage do not have it + const isAuthorized = connector.isAuthorized + ? await connector.isAuthorized() + : false + if (isAuthorized) continue + // Remove stale connection + connections.delete(connector.uid) + if (current === connector.uid) current = null + } + // set connections + store.setState((x) => ({ ...x, connections, current })) + }, store, ssr: Boolean(ssr), syncConnectedChain, @@ -515,10 +537,9 @@ export type CreateConfigParameters< | undefined }) | { - client(parameters: { chain: chains[number] }): Client< - transports[chains[number]['id']], - chains[number] - > + client(parameters: { + chain: chains[number] + }): Client } > > @@ -533,7 +554,9 @@ export type Config< readonly CreateConnectorFn[] = readonly CreateConnectorFn[], > = { readonly chains: chains - readonly connectors: readonly Connector[] + readonly connectors: Readonly<{ + [key in keyof connectorFns]: Connector + }> readonly storage: Storage | null readonly state: State @@ -570,6 +593,7 @@ type Internal< >, > = { readonly mipd: MipdStore | undefined + revalidate: () => Promise readonly store: Mutate, [['zustand/persist', any]]> readonly ssr: boolean readonly syncConnectedChain: boolean diff --git a/packages/core/src/createStorage.test-d.ts b/packages/core/src/createStorage.test-d.ts index 6bb4c7f300..75cd0e7492 100644 --- a/packages/core/src/createStorage.test-d.ts +++ b/packages/core/src/createStorage.test-d.ts @@ -1,7 +1,6 @@ import { expectTypeOf, test } from 'vitest' -import { createStorage } from './createStorage.js' - import type { Connection } from './createConfig.js' +import { createStorage } from './createStorage.js' test('getItem', () => { const storage = createStorage({ storage: localStorage }) diff --git a/packages/core/src/createStorage.ts b/packages/core/src/createStorage.ts index 8995ca3202..d86aef2aca 100644 --- a/packages/core/src/createStorage.ts +++ b/packages/core/src/createStorage.ts @@ -91,6 +91,7 @@ export const noopStorage = { export function getDefaultStorage() { const storage = (() => { + // biome-ignore lint/complexity/useOptionalChain: _ if (typeof window !== 'undefined' && window.localStorage) return window.localStorage return noopStorage diff --git a/packages/core/src/experimental/actions/getCapabilities.ts b/packages/core/src/experimental/actions/getCapabilities.ts deleted file mode 100644 index 095451081b..0000000000 --- a/packages/core/src/experimental/actions/getCapabilities.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Account } from 'viem' -import { - type GetCapabilitiesErrorType as viem_GetCapabilitiesErrorType, - type GetCapabilitiesParameters as viem_GetCapabilitiesParameters, - type GetCapabilitiesReturnType as viem_GetCapabilitiesReturnType, - getCapabilities as viem_getCapabilities, -} from 'viem/experimental' - -import { getConnectorClient } from '../../actions/getConnectorClient.js' -import type { Config } from '../../createConfig.js' -import type { ConnectorParameter } from '../../types/properties.js' - -export type GetCapabilitiesParameters = viem_GetCapabilitiesParameters & - ConnectorParameter - -export type GetCapabilitiesReturnType = viem_GetCapabilitiesReturnType - -export type GetCapabilitiesErrorType = viem_GetCapabilitiesErrorType - -/** https://wagmi.sh/core/api/actions/getCapabilities */ -export async function getCapabilities( - config: config, - parameters: GetCapabilitiesParameters = {}, -): Promise { - const { account, connector } = parameters - const client = await getConnectorClient(config, { account, connector }) - return viem_getCapabilities(client as any, { account: account as Account }) -} diff --git a/packages/core/src/experimental/actions/writeContracts.test.ts b/packages/core/src/experimental/actions/writeContracts.test.ts deleted file mode 100644 index 0f9b1c4211..0000000000 --- a/packages/core/src/experimental/actions/writeContracts.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { abi, address, config } from '@wagmi/test' -import { expect, test } from 'vitest' - -import { connect } from '../../actions/connect.js' -import { disconnect } from '../../actions/disconnect.js' -import { writeContracts } from './writeContracts.js' - -const connector = config.connectors[0]! - -test('default', async () => { - await connect(config, { connector }) - await expect( - writeContracts(config, { - contracts: [ - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - ], - }), - ).resolves.toMatchInlineSnapshot( - `"0x8913636bd97cf4bcc0a6343c730905a27ead0f7480ff82190072e916439eb212"`, - ) - await disconnect(config, { connector }) -}) - -test('behavior: not connected', async () => { - await expect( - writeContracts(config, { - contracts: [ - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - ], - }), - ).rejects.toThrowErrorMatchingInlineSnapshot(` - [ConnectorNotConnectedError: Connector not connected. - - Version: @wagmi/core@x.y.z] - `) -}) - -test('behavior: account does not exist on connector', async () => { - await connect(config, { connector }) - await expect( - writeContracts(config, { - account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', - contracts: [ - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - { - abi: abi.wagmiMintExample, - address: address.wagmiMintExample, - functionName: 'mint', - }, - ], - }), - ).rejects.toThrowErrorMatchingInlineSnapshot(` - [ConnectorAccountNotFoundError: Account "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e" not found for connector "Mock Connector". - - Version: @wagmi/core@x.y.z] - `) - await disconnect(config, { connector }) -}) diff --git a/packages/core/src/experimental/actions/writeContracts.ts b/packages/core/src/experimental/actions/writeContracts.ts deleted file mode 100644 index 06e6687592..0000000000 --- a/packages/core/src/experimental/actions/writeContracts.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { Account, Chain, ContractFunctionParameters } from 'viem' -import { - type WriteContractsErrorType as viem_WriteContractsErrorType, - type WriteContractsParameters as viem_WriteContractsParameters, - type WriteContractsReturnType as viem_WriteContractsReturnType, - writeContracts as viem_writeContracts, -} from 'viem/experimental' - -import { - type GetConnectorClientErrorType, - getConnectorClient, -} from '../../actions/getConnectorClient.js' -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' - -export type WriteContractsParameters< - contracts extends readonly unknown[] = readonly ContractFunctionParameters[], - config extends Config = Config, - chainId extends - config['chains'][number]['id'] = config['chains'][number]['id'], - /// - chains extends readonly Chain[] = SelectChains, -> = { - [key in keyof chains]: Compute< - Omit< - viem_WriteContractsParameters< - contracts, - chains[key], - Account, - chains[key] - >, - 'chain' - > & - ChainIdParameter & - ConnectorParameter - > -}[number] - -export type WriteContractsReturnType = viem_WriteContractsReturnType - -export type WriteContractsErrorType = - // getConnectorClient() - | GetConnectorClientErrorType - // base - | BaseErrorType - | ErrorType - // viem - | viem_WriteContractsErrorType - -/** https://wagmi.sh/core/api/actions/writeContracts */ -export async function writeContracts< - const contracts extends readonly unknown[], - config extends Config, - chainId extends config['chains'][number]['id'], ->( - config: config, - parameters: WriteContractsParameters, -): Promise { - const { account, chainId, connector, ...rest } = parameters - - const client = await getConnectorClient(config, { - account, - chainId, - connector, - }) - - return viem_writeContracts(client, { - ...(rest as any), - ...(account ? { account } : {}), - chain: chainId ? { id: chainId } : undefined, - }) -} diff --git a/packages/core/src/experimental/query/getCallsStatus.ts b/packages/core/src/experimental/query/getCallsStatus.ts deleted file mode 100644 index e520701ad3..0000000000 --- a/packages/core/src/experimental/query/getCallsStatus.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { QueryOptions } from '@tanstack/query-core' - -import type { Config } from '../../createConfig.js' -import { ConnectorNotConnectedError } from '../../errors/config.js' -import { filterQueryOptions } from '../../query/utils.js' -import type { ScopeKeyParameter } from '../../types/properties.js' -import type { Compute } from '../../types/utils.js' -import { - type GetCallsStatusErrorType, - type GetCallsStatusParameters, - type GetCallsStatusReturnType, - getCallsStatus, -} from '../actions/getCallsStatus.js' - -export type GetCallsStatusOptions = Compute< - GetCallsStatusParameters & ScopeKeyParameter -> - -export function getCallsStatusQueryOptions( - config: config, - options: GetCallsStatusOptions, -) { - return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] - const status = await getCallsStatus(config, parameters) - return status - }, - queryKey: getCallsStatusQueryKey(options), - retry(failureCount, error) { - if (error instanceof ConnectorNotConnectedError) return false - return failureCount < 3 - }, - } as const satisfies QueryOptions< - GetCallsStatusQueryFnData, - GetCallsStatusErrorType, - GetCallsStatusData, - GetCallsStatusQueryKey - > -} - -export type GetCallsStatusQueryFnData = GetCallsStatusReturnType - -export type GetCallsStatusData = GetCallsStatusQueryFnData - -export function getCallsStatusQueryKey(options: GetCallsStatusOptions) { - return ['callsStatus', filterQueryOptions(options)] as const -} - -export type GetCallsStatusQueryKey = ReturnType diff --git a/packages/core/src/experimental/query/getCapabilities.ts b/packages/core/src/experimental/query/getCapabilities.ts deleted file mode 100644 index 4d21e780db..0000000000 --- a/packages/core/src/experimental/query/getCapabilities.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { QueryOptions } from '@tanstack/query-core' - -import type { Config } from '../../createConfig.js' -import { ConnectorNotConnectedError } from '../../errors/config.js' -import { filterQueryOptions } from '../../query/utils.js' -import type { ScopeKeyParameter } from '../../types/properties.js' -import type { Compute, ExactPartial } from '../../types/utils.js' -import { - type GetCapabilitiesErrorType, - type GetCapabilitiesParameters, - type GetCapabilitiesReturnType, - getCapabilities, -} from '../actions/getCapabilities.js' - -export type GetCapabilitiesOptions = Compute< - ExactPartial & ScopeKeyParameter -> - -export function getCapabilitiesQueryOptions( - config: config, - options: GetCapabilitiesOptions = {}, -) { - return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] - const capabilities = await getCapabilities(config, parameters) - return capabilities - }, - queryKey: getCapabilitiesQueryKey(options), - retry(failureCount, error) { - if (error instanceof ConnectorNotConnectedError) return false - return failureCount < 3 - }, - } as const satisfies QueryOptions< - GetCapabilitiesQueryFnData, - GetCapabilitiesErrorType, - GetCapabilitiesData, - GetCapabilitiesQueryKey - > -} - -export type GetCapabilitiesQueryFnData = GetCapabilitiesReturnType - -export type GetCapabilitiesData = GetCapabilitiesQueryFnData - -export function getCapabilitiesQueryKey(options: GetCapabilitiesOptions = {}) { - return ['capabilities', filterQueryOptions(options)] as const -} - -export type GetCapabilitiesQueryKey = ReturnType diff --git a/packages/core/src/experimental/query/waitForCallsStatus.ts b/packages/core/src/experimental/query/waitForCallsStatus.ts deleted file mode 100644 index 37d559049a..0000000000 --- a/packages/core/src/experimental/query/waitForCallsStatus.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { QueryOptions } from '@tanstack/query-core' - -import type { Config } from '../../createConfig.js' -import { ConnectorNotConnectedError } from '../../errors/config.js' -import { filterQueryOptions } from '../../query/utils.js' -import type { ScopeKeyParameter } from '../../types/properties.js' -import type { Compute, PartialBy } from '../../types/utils.js' -import { - type WaitForCallsStatusErrorType, - type WaitForCallsStatusParameters, - type WaitForCallsStatusReturnType, - waitForCallsStatus, -} from '../actions/waitForCallsStatus.js' - -export type WaitForCallsStatusOptions = Compute< - PartialBy & ScopeKeyParameter -> - -export function waitForCallsStatusQueryOptions( - config: config, - options: WaitForCallsStatusOptions, -) { - return { - async queryFn({ queryKey }) { - const { scopeKey: _, id, ...parameters } = queryKey[1] - if (!id) throw new Error('id is required') - const status = await waitForCallsStatus(config, { ...parameters, id }) - return status - }, - queryKey: waitForCallsStatusQueryKey(options), - retry(failureCount, error) { - if (error instanceof ConnectorNotConnectedError) return false - return failureCount < 3 - }, - } as const satisfies QueryOptions< - WaitForCallsStatusQueryFnData, - WaitForCallsStatusErrorType, - WaitForCallsStatusData, - WaitForCallsStatusQueryKey - > -} - -export type WaitForCallsStatusQueryFnData = WaitForCallsStatusReturnType - -export type WaitForCallsStatusData = WaitForCallsStatusQueryFnData - -export function waitForCallsStatusQueryKey(options: WaitForCallsStatusOptions) { - return ['callsStatus', filterQueryOptions(options)] as const -} - -export type WaitForCallsStatusQueryKey = ReturnType< - typeof waitForCallsStatusQueryKey -> diff --git a/packages/core/src/experimental/query/writeContracts.ts b/packages/core/src/experimental/query/writeContracts.ts deleted file mode 100644 index 192a842ca0..0000000000 --- a/packages/core/src/experimental/query/writeContracts.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { MutateOptions, MutationOptions } from '@tanstack/query-core' - -import type { Config } from '../../createConfig.js' -import type { Compute } from '../../types/utils.js' -import { - type WriteContractsErrorType, - type WriteContractsParameters, - type WriteContractsReturnType, - writeContracts, -} from '../actions/writeContracts.js' - -export function writeContractsMutationOptions< - const contracts extends readonly unknown[], - config extends Config, ->(config: config) { - return { - mutationFn(variables) { - return writeContracts(config, variables as any) as any - }, - mutationKey: ['writeContracts'], - } as const satisfies MutationOptions< - WriteContractsData, - WriteContractsErrorType, - WriteContractsVariables - > -} - -export type WriteContractsData = Compute - -export type WriteContractsVariables< - contracts extends readonly unknown[], - config extends Config, - chainId extends config['chains'][number]['id'], -> = WriteContractsParameters - -export type WriteContractsMutate< - contracts extends readonly unknown[], - config extends Config, - context = unknown, -> = ( - variables: WriteContractsVariables, - options?: - | Compute< - MutateOptions< - WriteContractsData, - WriteContractsErrorType, - Compute>, - context - > - > - | undefined, -) => void - -export type WriteContractsMutateAsync< - contracts extends readonly unknown[], - config extends Config, - context = unknown, -> = ( - variables: WriteContractsVariables, - options?: - | Compute< - MutateOptions< - WriteContractsData, - WriteContractsErrorType, - Compute>, - context - > - > - | undefined, -) => Promise diff --git a/packages/core/src/exports/actions.test.ts b/packages/core/src/exports/actions.test.ts index 77f805d96c..95610ec70e 100644 --- a/packages/core/src/exports/actions.test.ts +++ b/packages/core/src/exports/actions.test.ts @@ -9,41 +9,35 @@ test('exports', () => { "connect", "deployContract", "disconnect", - "estimateGas", "estimateFeesPerGas", + "estimateGas", "estimateMaxPriorityFeePerGas", - "getAccount", "getBalance", - "fetchBalance", "getBlock", "getBlockNumber", - "fetchBlockNumber", "getBlockTransactionCount", "getBytecode", + "getCallsStatus", + "getCapabilities", "getChainId", "getChains", "getClient", + "getAccount", + "getConnection", "getConnections", - "getConnectors", "getConnectorClient", + "getConnectors", "getEnsAddress", - "fetchEnsAddress", "getEnsAvatar", - "fetchEnsAvatar", "getEnsName", - "fetchEnsName", "getEnsResolver", - "fetchEnsResolver", "getEnsText", "getFeeHistory", "getGasPrice", "getProof", "getPublicClient", "getStorageAt", - "getToken", - "fetchToken", "getTransaction", - "fetchTransaction", "getTransactionConfirmations", "getTransactionCount", "getTransactionReceipt", @@ -53,28 +47,31 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "sendCalls", "sendTransaction", + "showCallsStatus", "signMessage", "signTypedData", "simulateContract", - "switchAccount", "switchChain", - "switchNetwork", + "switchAccount", + "switchConnection", "verifyMessage", "verifyTypedData", - "watchAccount", + "waitForCallsStatus", + "waitForTransactionReceipt", "watchAsset", - "watchBlocks", "watchBlockNumber", + "watchBlocks", "watchChainId", "watchClient", + "watchAccount", + "watchConnection", "watchConnections", "watchConnectors", "watchContractEvent", "watchPendingTransactions", "watchPublicClient", - "waitForTransactionReceipt", - "waitForTransaction", "writeContract", ] `) diff --git a/packages/core/src/exports/actions.ts b/packages/core/src/exports/actions.ts index d5d6b21760..4fab816aa9 100644 --- a/packages/core/src/exports/actions.ts +++ b/packages/core/src/exports/actions.ts @@ -31,13 +31,6 @@ export { disconnect, } from '../actions/disconnect.js' -export { - type EstimateGasErrorType, - type EstimateGasParameters, - type EstimateGasReturnType, - estimateGas, -} from '../actions/estimateGas.js' - export { type EstimateFeesPerGasErrorType, type EstimateFeesPerGasParameters, @@ -45,6 +38,13 @@ export { estimateFeesPerGas, } from '../actions/estimateFeesPerGas.js' +export { + type EstimateGasErrorType, + type EstimateGasParameters, + type EstimateGasReturnType, + estimateGas, +} from '../actions/estimateGas.js' + export { type EstimateMaxPriorityFeePerGasErrorType, type EstimateMaxPriorityFeePerGasParameters, @@ -53,17 +53,10 @@ export { } from '../actions/estimateMaxPriorityFeePerGas.js' export { - type GetAccountReturnType, - getAccount, -} from '../actions/getAccount.js' - -export { + type GetBalanceErrorType, type GetBalanceParameters, type GetBalanceReturnType, - type GetBalanceErrorType, getBalance, - /** @deprecated use `getBalance` instead */ - getBalance as fetchBalance, } from '../actions/getBalance.js' export { @@ -78,8 +71,6 @@ export { type GetBlockNumberParameters, type GetBlockNumberReturnType, getBlockNumber, - /** @deprecated use `getBlockNumber` instead */ - getBlockNumber as fetchBlockNumber, } from '../actions/getBlockNumber.js' export { @@ -96,6 +87,20 @@ export { getBytecode, } from '../actions/getBytecode.js' +export { + type GetCallsStatusErrorType, + type GetCallsStatusParameters, + type GetCallsStatusReturnType, + getCallsStatus, +} from '../actions/getCallsStatus.js' + +export { + type GetCapabilitiesErrorType, + type GetCapabilitiesParameters, + type GetCapabilitiesReturnType, + getCapabilities, +} from '../actions/getCapabilities.js' + export { type GetChainIdReturnType, getChainId, @@ -112,30 +117,35 @@ export { getClient, } from '../actions/getClient.js' +export { + /** @deprecated use `GetConnectionReturnType` instead */ + type GetConnectionReturnType as GetAccountReturnType, + type GetConnectionReturnType, + /** @deprecated use `getConnection` instead */ + getConnection as getAccount, + getConnection, +} from '../actions/getConnection.js' + export { type GetConnectionsReturnType, getConnections, } from '../actions/getConnections.js' - -export { - type GetConnectorsReturnType, - getConnectors, -} from '../actions/getConnectors.js' - export { type GetConnectorClientErrorType, type GetConnectorClientParameters, type GetConnectorClientReturnType, getConnectorClient, } from '../actions/getConnectorClient.js' +export { + type GetConnectorsReturnType, + getConnectors, +} from '../actions/getConnectors.js' export { type GetEnsAddressErrorType, type GetEnsAddressParameters, type GetEnsAddressReturnType, getEnsAddress, - /** @deprecated use `getEnsAddress` instead */ - getEnsAddress as fetchEnsAddress, } from '../actions/getEnsAddress.js' export { @@ -143,8 +153,6 @@ export { type GetEnsAvatarParameters, type GetEnsAvatarReturnType, getEnsAvatar, - /** @deprecated use `getEnsAvatar` instead */ - getEnsAvatar as fetchEnsAvatar, } from '../actions/getEnsAvatar.js' export { @@ -152,8 +160,6 @@ export { type GetEnsNameParameters, type GetEnsNameReturnType, getEnsName, - /** @deprecated */ - getEnsName as fetchEnsName, } from '../actions/getEnsName.js' export { @@ -161,8 +167,6 @@ export { type GetEnsResolverParameters, type GetEnsResolverReturnType, getEnsResolver, - /** @deprecated use `getEnsResolver` instead */ - getEnsResolver as fetchEnsResolver, } from '../actions/getEnsResolver.js' export { @@ -206,22 +210,11 @@ export { getStorageAt, } from '../actions/getStorageAt.js' -export { - type GetTokenErrorType, - type GetTokenParameters, - type GetTokenReturnType, - getToken, - /** @deprecated use `getToken` instead */ - getToken as fetchToken, -} from '../actions/getToken.js' - export { type GetTransactionErrorType, type GetTransactionParameters, type GetTransactionReturnType, getTransaction, - /** @deprecated use `getTransaction` instead */ - getTransaction as fetchTransaction, } from '../actions/getTransaction.js' export { @@ -259,23 +252,23 @@ export { } from '../actions/multicall.js' export { + type PrepareTransactionRequestErrorType, type PrepareTransactionRequestParameters, type PrepareTransactionRequestReturnType, - type PrepareTransactionRequestErrorType, prepareTransactionRequest, } from '../actions/prepareTransactionRequest.js' export { + type ReadContractErrorType, type ReadContractParameters, type ReadContractReturnType, - type ReadContractErrorType, readContract, } from '../actions/readContract.js' export { + type ReadContractsErrorType, type ReadContractsParameters, type ReadContractsReturnType, - type ReadContractsErrorType, readContracts, } from '../actions/readContracts.js' @@ -286,6 +279,13 @@ export { reconnect, } from '../actions/reconnect.js' +export { + type SendCallsErrorType, + type SendCallsParameters, + type SendCallsReturnType, + sendCalls, +} from '../actions/sendCalls.js' + export { type SendTransactionErrorType, type SendTransactionParameters, @@ -293,6 +293,13 @@ export { sendTransaction, } from '../actions/sendTransaction.js' +export { + type ShowCallsStatusErrorType, + type ShowCallsStatusParameters, + type ShowCallsStatusReturnType, + showCallsStatus, +} from '../actions/showCallsStatus.js' + export { type SignMessageErrorType, type SignMessageParameters, @@ -314,22 +321,28 @@ export { simulateContract, } from '../actions/simulateContract.js' -export { - type SwitchAccountErrorType, - type SwitchAccountParameters, - type SwitchAccountReturnType, - switchAccount, -} from '../actions/switchAccount.js' - export { type SwitchChainErrorType, type SwitchChainParameters, type SwitchChainReturnType, switchChain, - /** @deprecated use `switchChain` instead */ - switchChain as switchNetwork, } from '../actions/switchChain.js' +export { + /** @deprecated use `SwitchConnectionErrorType` instead */ + type SwitchConnectionErrorType as SwitchAccountErrorType, + type SwitchConnectionErrorType, + /** @deprecated use `SwitchConnectionParameters` instead */ + type SwitchConnectionParameters as SwitchAccountParameters, + type SwitchConnectionParameters, + /** @deprecated use `SwitchConnectionReturnType` instead */ + type SwitchConnectionReturnType as SwitchAccountReturnType, + type SwitchConnectionReturnType, + /** @deprecated use `switchConnection` instead */ + switchConnection as switchAccount, + switchConnection, +} from '../actions/switchConnection.js' + export { type VerifyMessageParameters, type VerifyMessageReturnType, @@ -343,10 +356,18 @@ export { } from '../actions/verifyTypedData.js' export { - type WatchAccountParameters, - type WatchAccountReturnType, - watchAccount, -} from '../actions/watchAccount.js' + type WaitForCallsStatusErrorType, + type WaitForCallsStatusParameters, + type WaitForCallsStatusReturnType, + waitForCallsStatus, +} from '../actions/waitForCallsStatus.js' + +export { + type WaitForTransactionReceiptErrorType, + type WaitForTransactionReceiptParameters, + type WaitForTransactionReceiptReturnType, + waitForTransactionReceipt, +} from '../actions/waitForTransactionReceipt.js' export { type WatchAssetParameters, @@ -354,18 +375,18 @@ export { watchAsset, } from '../actions/watchAsset.js' -export { - type WatchBlocksParameters, - type WatchBlocksReturnType, - watchBlocks, -} from '../actions/watchBlocks.js' - export { type WatchBlockNumberParameters, type WatchBlockNumberReturnType, watchBlockNumber, } from '../actions/watchBlockNumber.js' +export { + type WatchBlocksParameters, + type WatchBlocksReturnType, + watchBlocks, +} from '../actions/watchBlocks.js' + export { type WatchChainIdParameters, type WatchChainIdReturnType, @@ -378,6 +399,18 @@ export { watchClient, } from '../actions/watchClient.js' +export { + /** @deprecated use `WatchConnectionParameters` instead */ + type WatchConnectionParameters as WatchAccountParameters, + type WatchConnectionParameters, + /** @deprecated use `WatchConnectionReturnType` instead */ + type WatchConnectionReturnType as WatchAccountReturnType, + type WatchConnectionReturnType, + /** @deprecated use `watchConnection` instead */ + watchConnection as watchAccount, + watchConnection, +} from '../actions/watchConnection.js' + export { type WatchConnectionsParameters, type WatchConnectionsReturnType, @@ -408,15 +441,6 @@ export { watchPublicClient, } from '../actions/watchPublicClient.js' -export { - type WaitForTransactionReceiptErrorType, - type WaitForTransactionReceiptParameters, - type WaitForTransactionReceiptReturnType, - waitForTransactionReceipt, - /** @deprecated use `waitForTransactionReceipt` instead */ - waitForTransactionReceipt as waitForTransaction, -} from '../actions/waitForTransactionReceipt.js' - export { type WriteContractErrorType, type WriteContractParameters, diff --git a/packages/core/src/exports/codegen.test.ts b/packages/core/src/exports/codegen.test.ts index c947b7d188..e26af5c6e0 100644 --- a/packages/core/src/exports/codegen.test.ts +++ b/packages/core/src/exports/codegen.test.ts @@ -5,8 +5,8 @@ import * as codegen from './codegen.js' test('exports', () => { expect(Object.keys(codegen)).toMatchInlineSnapshot(` [ - "createSimulateContract", "createReadContract", + "createSimulateContract", "createWatchContractEvent", "createWriteContract", ] diff --git a/packages/core/src/exports/codegen.ts b/packages/core/src/exports/codegen.ts index bed8aa1cc7..e3eeb16219 100644 --- a/packages/core/src/exports/codegen.ts +++ b/packages/core/src/exports/codegen.ts @@ -1,15 +1,14 @@ // biome-ignore lint/performance/noBarrelFile: entrypoint module -export { - type CreateSimulateContractParameters, - type CreateSimulateContractReturnType, - createSimulateContract, -} from '../actions/codegen/createSimulateContract.js' - export { type CreateReadContractParameters, type CreateReadContractReturnType, createReadContract, } from '../actions/codegen/createReadContract.js' +export { + type CreateSimulateContractParameters, + type CreateSimulateContractReturnType, + createSimulateContract, +} from '../actions/codegen/createSimulateContract.js' export { type CreateWatchContractEventParameters, diff --git a/packages/core/src/exports/experimental.ts b/packages/core/src/exports/experimental.ts deleted file mode 100644 index 77955e5166..0000000000 --- a/packages/core/src/exports/experimental.ts +++ /dev/null @@ -1,101 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Actions -//////////////////////////////////////////////////////////////////////////////// - -// biome-ignore lint/performance/noBarrelFile: entrypoint module -export { - type GetCallsStatusErrorType, - type GetCallsStatusParameters, - type GetCallsStatusReturnType, - getCallsStatus, -} from '../experimental/actions/getCallsStatus.js' - -export { - type GetCapabilitiesErrorType, - type GetCapabilitiesParameters, - type GetCapabilitiesReturnType, - getCapabilities, -} from '../experimental/actions/getCapabilities.js' - -export { - type SendCallsErrorType, - type SendCallsParameters, - type SendCallsReturnType, - sendCalls, -} from '../experimental/actions/sendCalls.js' - -export { - type ShowCallsStatusErrorType, - type ShowCallsStatusParameters, - type ShowCallsStatusReturnType, - showCallsStatus, -} from '../experimental/actions/showCallsStatus.js' - -export { - type WaitForCallsStatusErrorType, - type WaitForCallsStatusParameters, - type WaitForCallsStatusReturnType, - waitForCallsStatus, -} from '../experimental/actions/waitForCallsStatus.js' - -export { - type WriteContractsErrorType, - type WriteContractsParameters, - type WriteContractsReturnType, - writeContracts, -} from '../experimental/actions/writeContracts.js' - -//////////////////////////////////////////////////////////////////////////////// -// Tanstack Query -//////////////////////////////////////////////////////////////////////////////// - -export { - type GetCallsStatusData, - type GetCallsStatusOptions, - type GetCallsStatusQueryFnData, - type GetCallsStatusQueryKey, - getCallsStatusQueryOptions, - getCallsStatusQueryKey, -} from '../experimental/query/getCallsStatus.js' - -export { - type GetCapabilitiesData, - type GetCapabilitiesOptions, - type GetCapabilitiesQueryFnData, - type GetCapabilitiesQueryKey, - getCapabilitiesQueryOptions, - getCapabilitiesQueryKey, -} from '../experimental/query/getCapabilities.js' - -export { - type SendCallsData, - type SendCallsMutate, - type SendCallsMutateAsync, - type SendCallsVariables, - sendCallsMutationOptions, -} from '../experimental/query/sendCalls.js' - -export { - type ShowCallsStatusData, - type ShowCallsStatusMutate, - type ShowCallsStatusMutateAsync, - type ShowCallsStatusVariables, - showCallsStatusMutationOptions, -} from '../experimental/query/showCallsStatus.js' - -export { - type WaitForCallsStatusData, - type WaitForCallsStatusOptions, - type WaitForCallsStatusQueryFnData, - type WaitForCallsStatusQueryKey, - waitForCallsStatusQueryKey, - waitForCallsStatusQueryOptions, -} from '../experimental/query/waitForCallsStatus.js' - -export { - type WriteContractsData, - type WriteContractsMutate, - type WriteContractsMutateAsync, - type WriteContractsVariables, - writeContractsMutationOptions, -} from '../experimental/query/writeContracts.js' diff --git a/packages/core/src/exports/index.test.ts b/packages/core/src/exports/index.test.ts index 2d6953b9cc..7848e3264a 100644 --- a/packages/core/src/exports/index.test.ts +++ b/packages/core/src/exports/index.test.ts @@ -9,41 +9,35 @@ test('exports', () => { "connect", "deployContract", "disconnect", - "estimateGas", "estimateFeesPerGas", + "estimateGas", "estimateMaxPriorityFeePerGas", - "getAccount", "getBalance", - "fetchBalance", "getBlock", "getBlockNumber", - "fetchBlockNumber", "getBlockTransactionCount", "getBytecode", + "getCallsStatus", + "getCapabilities", "getChainId", "getChains", "getClient", + "getAccount", + "getConnection", "getConnections", - "getConnectors", "getConnectorClient", + "getConnectors", "getEnsAddress", - "fetchEnsAddress", "getEnsAvatar", - "fetchEnsAvatar", "getEnsName", - "fetchEnsName", "getEnsResolver", - "fetchEnsResolver", "getEnsText", "getFeeHistory", "getGasPrice", "getProof", "getPublicClient", "getStorageAt", - "getToken", - "fetchToken", "getTransaction", - "fetchTransaction", "getTransactionConfirmations", "getTransactionCount", "getTransactionReceipt", @@ -53,28 +47,33 @@ test('exports', () => { "readContract", "readContracts", "reconnect", + "sendCalls", + "sendCallsSync", "sendTransaction", + "sendTransactionSync", + "showCallsStatus", "signMessage", "signTypedData", "simulateContract", - "switchAccount", "switchChain", - "switchNetwork", + "switchAccount", + "switchConnection", "verifyMessage", "verifyTypedData", - "watchAccount", + "waitForCallsStatus", + "waitForTransactionReceipt", "watchAsset", - "watchBlocks", "watchBlockNumber", + "watchBlocks", "watchChainId", "watchClient", + "watchAccount", + "watchConnection", "watchConnections", "watchConnectors", "watchContractEvent", "watchPendingTransactions", "watchPublicClient", - "waitForTransactionReceipt", - "waitForTransaction", "writeContract", "createConnector", "injected", @@ -85,11 +84,11 @@ test('exports', () => { "hydrate", "BaseError", "ChainNotConfiguredError", - "ConnectorNotConnectedError", - "ConnectorAlreadyConnectedError", - "ConnectorNotFoundError", "ConnectorAccountNotFoundError", + "ConnectorAlreadyConnectedError", "ConnectorChainMismatchError", + "ConnectorNotConnectedError", + "ConnectorNotFoundError", "ConnectorUnavailableReconnectingError", "ProviderNotFoundError", "SwitchChainNotSupportedError", @@ -104,7 +103,6 @@ test('exports', () => { "deepEqual", "deserialize", "extractRpcUrls", - "normalizeChainId", "serialize", "version", ] diff --git a/packages/core/src/exports/index.ts b/packages/core/src/exports/index.ts index af78c71c9b..37fc673056 100644 --- a/packages/core/src/exports/index.ts +++ b/packages/core/src/exports/index.ts @@ -31,13 +31,6 @@ export { disconnect, } from '../actions/disconnect.js' -export { - type EstimateGasErrorType, - type EstimateGasParameters, - type EstimateGasReturnType, - estimateGas, -} from '../actions/estimateGas.js' - export { type EstimateFeesPerGasErrorType, type EstimateFeesPerGasParameters, @@ -45,6 +38,13 @@ export { estimateFeesPerGas, } from '../actions/estimateFeesPerGas.js' +export { + type EstimateGasErrorType, + type EstimateGasParameters, + type EstimateGasReturnType, + estimateGas, +} from '../actions/estimateGas.js' + export { type EstimateMaxPriorityFeePerGasErrorType, type EstimateMaxPriorityFeePerGasParameters, @@ -53,17 +53,10 @@ export { } from '../actions/estimateMaxPriorityFeePerGas.js' export { - type GetAccountReturnType, - getAccount, -} from '../actions/getAccount.js' - -export { + type GetBalanceErrorType, type GetBalanceParameters, type GetBalanceReturnType, - type GetBalanceErrorType, getBalance, - /** @deprecated use `getBalance` instead */ - getBalance as fetchBalance, } from '../actions/getBalance.js' export { @@ -78,8 +71,6 @@ export { type GetBlockNumberParameters, type GetBlockNumberReturnType, getBlockNumber, - /** @deprecated use `getBlockNumber` instead */ - getBlockNumber as fetchBlockNumber, } from '../actions/getBlockNumber.js' export { @@ -96,6 +87,20 @@ export { getBytecode, } from '../actions/getBytecode.js' +export { + type GetCallsStatusErrorType, + type GetCallsStatusParameters, + type GetCallsStatusReturnType, + getCallsStatus, +} from '../actions/getCallsStatus.js' + +export { + type GetCapabilitiesErrorType, + type GetCapabilitiesParameters, + type GetCapabilitiesReturnType, + getCapabilities, +} from '../actions/getCapabilities.js' + export { type GetChainIdReturnType, getChainId, @@ -112,16 +117,20 @@ export { getClient, } from '../actions/getClient.js' +export { + /** @deprecated use `GetConnectionReturnType` instead */ + type GetConnectionReturnType as GetAccountReturnType, + type GetConnectionReturnType, + /** @deprecated use `getConnection` instead */ + getConnection as getAccount, + getConnection, +} from '../actions/getConnection.js' + export { type GetConnectionsReturnType, getConnections, } from '../actions/getConnections.js' -export { - type GetConnectorsReturnType, - getConnectors, -} from '../actions/getConnectors.js' - export { type GetConnectorClientErrorType, type GetConnectorClientParameters, @@ -129,13 +138,16 @@ export { getConnectorClient, } from '../actions/getConnectorClient.js' +export { + type GetConnectorsReturnType, + getConnectors, +} from '../actions/getConnectors.js' + export { type GetEnsAddressErrorType, type GetEnsAddressParameters, type GetEnsAddressReturnType, getEnsAddress, - /** @deprecated use `getEnsAddress` instead */ - getEnsAddress as fetchEnsAddress, } from '../actions/getEnsAddress.js' export { @@ -143,8 +155,6 @@ export { type GetEnsAvatarParameters, type GetEnsAvatarReturnType, getEnsAvatar, - /** @deprecated use `getEnsAvatar` instead */ - getEnsAvatar as fetchEnsAvatar, } from '../actions/getEnsAvatar.js' export { @@ -152,8 +162,6 @@ export { type GetEnsNameParameters, type GetEnsNameReturnType, getEnsName, - /** @deprecated */ - getEnsName as fetchEnsName, } from '../actions/getEnsName.js' export { @@ -161,8 +169,6 @@ export { type GetEnsResolverParameters, type GetEnsResolverReturnType, getEnsResolver, - /** @deprecated use `getEnsResolver` instead */ - getEnsResolver as fetchEnsResolver, } from '../actions/getEnsResolver.js' export { @@ -206,22 +212,11 @@ export { getStorageAt, } from '../actions/getStorageAt.js' -export { - type GetTokenErrorType, - type GetTokenParameters, - type GetTokenReturnType, - getToken, - /** @deprecated use `getToken` instead */ - getToken as fetchToken, -} from '../actions/getToken.js' - export { type GetTransactionErrorType, type GetTransactionParameters, type GetTransactionReturnType, getTransaction, - /** @deprecated use `getTransaction` instead */ - getTransaction as fetchTransaction, } from '../actions/getTransaction.js' export { @@ -266,16 +261,16 @@ export { } from '../actions/prepareTransactionRequest.js' export { + type ReadContractErrorType, type ReadContractParameters, type ReadContractReturnType, - type ReadContractErrorType, readContract, } from '../actions/readContract.js' export { + type ReadContractsErrorType, type ReadContractsParameters, type ReadContractsReturnType, - type ReadContractsErrorType, readContracts, } from '../actions/readContracts.js' @@ -286,6 +281,20 @@ export { reconnect, } from '../actions/reconnect.js' +export { + type SendCallsErrorType, + type SendCallsParameters, + type SendCallsReturnType, + sendCalls, +} from '../actions/sendCalls.js' + +export { + type SendCallsSyncErrorType, + type SendCallsSyncParameters, + type SendCallsSyncReturnType, + sendCallsSync, +} from '../actions/sendCallsSync.js' + export { type SendTransactionErrorType, type SendTransactionParameters, @@ -293,6 +302,20 @@ export { sendTransaction, } from '../actions/sendTransaction.js' +export { + type SendTransactionSyncErrorType, + type SendTransactionSyncParameters, + type SendTransactionSyncReturnType, + sendTransactionSync, +} from '../actions/sendTransactionSync.js' + +export { + type ShowCallsStatusErrorType, + type ShowCallsStatusParameters, + type ShowCallsStatusReturnType, + showCallsStatus, +} from '../actions/showCallsStatus.js' + export { type SignMessageErrorType, type SignMessageParameters, @@ -314,22 +337,28 @@ export { simulateContract, } from '../actions/simulateContract.js' -export { - type SwitchAccountErrorType, - type SwitchAccountParameters, - type SwitchAccountReturnType, - switchAccount, -} from '../actions/switchAccount.js' - export { type SwitchChainErrorType, type SwitchChainParameters, type SwitchChainReturnType, switchChain, - /** @deprecated use `switchChain` instead */ - switchChain as switchNetwork, } from '../actions/switchChain.js' +export { + /** @deprecated use `SwitchConnectionErrorType` instead */ + type SwitchConnectionErrorType as SwitchAccountErrorType, + type SwitchConnectionErrorType, + /** @deprecated use `SwitchConnectionParameters` instead */ + type SwitchConnectionParameters as SwitchAccountParameters, + type SwitchConnectionParameters, + /** @deprecated use `SwitchConnectionReturnType` instead */ + type SwitchConnectionReturnType as SwitchAccountReturnType, + type SwitchConnectionReturnType, + /** @deprecated use `switchConnection` instead */ + switchConnection as switchAccount, + switchConnection, +} from '../actions/switchConnection.js' + export { type VerifyMessageErrorType, type VerifyMessageParameters, @@ -345,30 +374,38 @@ export { } from '../actions/verifyTypedData.js' export { - type WatchAccountParameters, - type WatchAccountReturnType, - watchAccount, -} from '../actions/watchAccount.js' + type WaitForCallsStatusErrorType, + type WaitForCallsStatusParameters, + type WaitForCallsStatusReturnType, + waitForCallsStatus, +} from '../actions/waitForCallsStatus.js' + +export { + type WaitForTransactionReceiptErrorType, + type WaitForTransactionReceiptParameters, + type WaitForTransactionReceiptReturnType, + waitForTransactionReceipt, +} from '../actions/waitForTransactionReceipt.js' export { - type WatchAssetParameters, type WatchAssetErrorType, + type WatchAssetParameters, type WatchAssetReturnType, watchAsset, } from '../actions/watchAsset.js' -export { - type WatchBlocksParameters, - type WatchBlocksReturnType, - watchBlocks, -} from '../actions/watchBlocks.js' - export { type WatchBlockNumberParameters, type WatchBlockNumberReturnType, watchBlockNumber, } from '../actions/watchBlockNumber.js' +export { + type WatchBlocksParameters, + type WatchBlocksReturnType, + watchBlocks, +} from '../actions/watchBlocks.js' + export { type WatchChainIdParameters, type WatchChainIdReturnType, @@ -381,6 +418,18 @@ export { watchClient, } from '../actions/watchClient.js' +export { + /** @deprecated use `WatchConnectionParameters` instead */ + type WatchConnectionParameters as WatchAccountParameters, + type WatchConnectionParameters, + /** @deprecated use `WatchConnectionReturnType` instead */ + type WatchConnectionReturnType as WatchAccountReturnType, + type WatchConnectionReturnType, + /** @deprecated use `watchConnection` instead */ + watchConnection as watchAccount, + watchConnection, +} from '../actions/watchConnection.js' + export { type WatchConnectionsParameters, type WatchConnectionsReturnType, @@ -411,15 +460,6 @@ export { watchPublicClient, } from '../actions/watchPublicClient.js' -export { - type WaitForTransactionReceiptErrorType, - type WaitForTransactionReceiptParameters, - type WaitForTransactionReceiptReturnType, - waitForTransactionReceipt, - /** @deprecated use `waitForTransactionReceipt` instead */ - waitForTransactionReceipt as waitForTransaction, -} from '../actions/waitForTransactionReceipt.js' - export { type WriteContractErrorType, type WriteContractParameters, @@ -452,14 +492,14 @@ export { //////////////////////////////////////////////////////////////////////////////// export { + type Config, type Connection, type Connector, - type Config, type CreateConfigParameters, + createConfig, type PartializedState, type State, type Transport, - createConfig, } from '../createConfig.js' //////////////////////////////////////////////////////////////////////////////// @@ -468,10 +508,10 @@ export { export { type CreateStorageParameters, - type Storage, - type StorageItemMap, createStorage, noopStorage, + type Storage, + type StorageItemMap, } from '../createStorage.js' //////////////////////////////////////////////////////////////////////////////// @@ -487,27 +527,27 @@ export { hydrate } from '../hydrate.js' export { BaseError } from '../errors/base.js' export { - type ChainNotConfiguredErrorType, ChainNotConfiguredError, - type ConnectorNotConnectedErrorType, - ConnectorNotConnectedError, - type ConnectorAlreadyConnectedErrorType, - ConnectorAlreadyConnectedError, - type ConnectorNotFoundErrorType, - ConnectorNotFoundError, - type ConnectorAccountNotFoundErrorType, + type ChainNotConfiguredErrorType, ConnectorAccountNotFoundError, - type ConnectorChainMismatchErrorType, + type ConnectorAccountNotFoundErrorType, + ConnectorAlreadyConnectedError, + type ConnectorAlreadyConnectedErrorType, ConnectorChainMismatchError, - type ConnectorUnavailableReconnectingErrorType, + type ConnectorChainMismatchErrorType, + ConnectorNotConnectedError, + type ConnectorNotConnectedErrorType, + ConnectorNotFoundError, + type ConnectorNotFoundErrorType, ConnectorUnavailableReconnectingError, + type ConnectorUnavailableReconnectingErrorType, } from '../errors/config.js' export { - type ProviderNotFoundErrorType, ProviderNotFoundError, - type SwitchChainNotSupportedErrorType, + type ProviderNotFoundErrorType, SwitchChainNotSupportedError, + type SwitchChainNotSupportedErrorType, } from '../errors/connector.js' //////////////////////////////////////////////////////////////////////////////// @@ -517,8 +557,8 @@ export { export { custom, http, webSocket } from 'viem' export { - type ConnectorTransportConfig, type ConnectorTransport, + type ConnectorTransportConfig, unstable_connector, } from '../transports/connector.js' @@ -548,8 +588,6 @@ export { deserialize } from '../utils/deserialize.js' export { extractRpcUrls } from '../utils/extractRpcUrls.js' -export { normalizeChainId } from '../utils/normalizeChainId.js' - export { serialize } from '../utils/serialize.js' //////////////////////////////////////////////////////////////////////////////// diff --git a/packages/core/src/exports/internal.test.ts b/packages/core/src/exports/internal.test.ts index 425a1b4eba..a0f7209899 100644 --- a/packages/core/src/exports/internal.test.ts +++ b/packages/core/src/exports/internal.test.ts @@ -6,8 +6,8 @@ test('exports', () => { expect(Object.keys(internal)).toMatchInlineSnapshot(` [ "watchChains", - "Emitter", "createEmitter", + "Emitter", "deepEqual", "uid", ] diff --git a/packages/core/src/exports/internal.ts b/packages/core/src/exports/internal.ts index 670420d89a..2c0968c098 100644 --- a/packages/core/src/exports/internal.ts +++ b/packages/core/src/exports/internal.ts @@ -14,9 +14,9 @@ export { //////////////////////////////////////////////////////////////////////////////// export { - type EventData, - Emitter, createEmitter, + Emitter, + type EventData, } from '../createEmitter.js' //////////////////////////////////////////////////////////////////////////////// @@ -31,16 +31,22 @@ export type { ScopeKeyParameter, } from '../types/properties.js' +export type { QueryParameter } from '../types/query.js' + export type { Compute, ExactPartial, + FixedArray, Mutable, - StrictOmit as Omit, OneOf, + PartialBy, RemoveUndefined, + RequiredBy, + StrictOmit as Omit, UnionCompute, - UnionStrictOmit, UnionExactPartial, + UnionLooseOmit, + UnionStrictOmit, } from '../types/utils.js' //////////////////////////////////////////////////////////////////////////////// diff --git a/packages/core/src/exports/query.test.ts b/packages/core/src/exports/query.test.ts index 777bfe9abe..72822de5de 100644 --- a/packages/core/src/exports/query.test.ts +++ b/packages/core/src/exports/query.test.ts @@ -26,6 +26,10 @@ test('exports', () => { "getBlockTransactionCountQueryOptions", "getBytecodeQueryKey", "getBytecodeQueryOptions", + "getCallsStatusQueryKey", + "getCallsStatusQueryOptions", + "getCapabilitiesQueryKey", + "getCapabilitiesQueryOptions", "getConnectorClientQueryKey", "getConnectorClientQueryOptions", "getEnsAddressQueryKey", @@ -46,8 +50,6 @@ test('exports', () => { "getProofQueryOptions", "getStorageAtQueryKey", "getStorageAtQueryOptions", - "getTokenQueryKey", - "getTokenQueryOptions", "getTransactionQueryKey", "getTransactionQueryOptions", "getTransactionConfirmationsQueryKey", @@ -67,23 +69,30 @@ test('exports', () => { "readContractsQueryKey", "readContractsQueryOptions", "reconnectMutationOptions", + "sendCallsMutationOptions", + "sendCallsSyncMutationOptions", "sendTransactionMutationOptions", + "sendTransactionSyncMutationOptions", + "showCallsStatusMutationOptions", "signMessageMutationOptions", "signTypedDataMutationOptions", - "switchAccountMutationOptions", "simulateContractQueryKey", "simulateContractQueryOptions", "switchChainMutationOptions", + "switchAccountMutationOptions", + "switchConnectionMutationOptions", + "hashFn", + "structuralSharing", "verifyMessageQueryKey", "verifyMessageQueryOptions", "verifyTypedDataQueryKey", "verifyTypedDataQueryOptions", + "waitForCallsStatusQueryKey", + "waitForCallsStatusQueryOptions", "waitForTransactionReceiptQueryKey", "waitForTransactionReceiptQueryOptions", "watchAssetMutationOptions", "writeContractMutationOptions", - "hashFn", - "structuralSharing", ] `) }) diff --git a/packages/core/src/exports/query.ts b/packages/core/src/exports/query.ts index 5746148bab..3a9f4a5c3f 100644 --- a/packages/core/src/exports/query.ts +++ b/packages/core/src/exports/query.ts @@ -8,31 +8,32 @@ export { type CallOptions, type CallQueryFnData, type CallQueryKey, + type CallQueryOptions, callQueryKey, callQueryOptions, } from '../query/call.js' export { type ConnectData, - type ConnectVariables, type ConnectMutate, type ConnectMutateAsync, + type ConnectVariables, connectMutationOptions, } from '../query/connect.js' export { type DeployContractData, - type DeployContractVariables, type DeployContractMutate, type DeployContractMutateAsync, + type DeployContractVariables, deployContractMutationOptions, } from '../query/deployContract.js' export { type DisconnectData, - type DisconnectVariables, type DisconnectMutate, type DisconnectMutateAsync, + type DisconnectVariables, disconnectMutationOptions, } from '../query/disconnect.js' @@ -41,6 +42,7 @@ export { type EstimateFeesPerGasOptions, type EstimateFeesPerGasQueryFnData, type EstimateFeesPerGasQueryKey, + type EstimateFeesPerGasQueryOptions, estimateFeesPerGasQueryKey, estimateFeesPerGasQueryOptions, } from '../query/estimateFeesPerGas.js' @@ -50,6 +52,7 @@ export { type EstimateGasOptions, type EstimateGasQueryFnData, type EstimateGasQueryKey, + type EstimateGasQueryOptions, estimateGasQueryKey, estimateGasQueryOptions, } from '../query/estimateGas.js' @@ -59,6 +62,7 @@ export { type EstimateMaxPriorityFeePerGasOptions, type EstimateMaxPriorityFeePerGasQueryFnData, type EstimateMaxPriorityFeePerGasQueryKey, + type EstimateMaxPriorityFeePerGasQueryOptions, estimateMaxPriorityFeePerGasQueryKey, estimateMaxPriorityFeePerGasQueryOptions, } from '../query/estimateMaxPriorityFeePerGas.js' @@ -68,6 +72,7 @@ export { type GetBalanceOptions, type GetBalanceQueryFnData, type GetBalanceQueryKey, + type GetBalanceQueryOptions, getBalanceQueryKey, getBalanceQueryOptions, } from '../query/getBalance.js' @@ -77,6 +82,7 @@ export { type GetBlockOptions, type GetBlockQueryFnData, type GetBlockQueryKey, + type GetBlockQueryOptions, getBlockQueryKey, getBlockQueryOptions, } from '../query/getBlock.js' @@ -86,6 +92,7 @@ export { type GetBlockNumberOptions, type GetBlockNumberQueryFnData, type GetBlockNumberQueryKey, + type GetBlockNumberQueryOptions, getBlockNumberQueryKey, getBlockNumberQueryOptions, } from '../query/getBlockNumber.js' @@ -95,6 +102,7 @@ export { type GetBlockTransactionCountOptions, type GetBlockTransactionCountQueryFnData, type GetBlockTransactionCountQueryKey, + type GetBlockTransactionCountQueryOptions, getBlockTransactionCountQueryKey, getBlockTransactionCountQueryOptions, } from '../query/getBlockTransactionCount.js' @@ -104,15 +112,37 @@ export { type GetBytecodeOptions, type GetBytecodeQueryFnData, type GetBytecodeQueryKey, + type GetBytecodeQueryOptions, getBytecodeQueryKey, getBytecodeQueryOptions, } from '../query/getBytecode.js' +export { + type GetCallsStatusData, + type GetCallsStatusOptions, + type GetCallsStatusQueryFnData, + type GetCallsStatusQueryKey, + type GetCallsStatusQueryOptions, + getCallsStatusQueryKey, + getCallsStatusQueryOptions, +} from '../query/getCallsStatus.js' + +export { + type GetCapabilitiesData, + type GetCapabilitiesOptions, + type GetCapabilitiesQueryFnData, + type GetCapabilitiesQueryKey, + type GetCapabilitiesQueryOptions, + getCapabilitiesQueryKey, + getCapabilitiesQueryOptions, +} from '../query/getCapabilities.js' + export { type GetConnectorClientData, type GetConnectorClientOptions, type GetConnectorClientQueryFnData, type GetConnectorClientQueryKey, + type GetConnectorClientQueryOptions, getConnectorClientQueryKey, getConnectorClientQueryOptions, } from '../query/getConnectorClient.js' @@ -122,6 +152,7 @@ export { type GetEnsAddressOptions, type GetEnsAddressQueryFnData, type GetEnsAddressQueryKey, + type GetEnsAddressQueryOptions, getEnsAddressQueryKey, getEnsAddressQueryOptions, } from '../query/getEnsAddress.js' @@ -131,6 +162,7 @@ export { type GetEnsAvatarOptions, type GetEnsAvatarQueryFnData, type GetEnsAvatarQueryKey, + type GetEnsAvatarQueryOptions, getEnsAvatarQueryKey, getEnsAvatarQueryOptions, } from '../query/getEnsAvatar.js' @@ -140,6 +172,7 @@ export { type GetEnsNameOptions, type GetEnsNameQueryFnData, type GetEnsNameQueryKey, + type GetEnsNameQueryOptions, getEnsNameQueryKey, getEnsNameQueryOptions, } from '../query/getEnsName.js' @@ -149,6 +182,7 @@ export { type GetEnsResolverOptions, type GetEnsResolverQueryFnData, type GetEnsResolverQueryKey, + type GetEnsResolverQueryOptions, getEnsResolverQueryKey, getEnsResolverQueryOptions, } from '../query/getEnsResolver.js' @@ -158,6 +192,7 @@ export { type GetEnsTextOptions, type GetEnsTextQueryFnData, type GetEnsTextQueryKey, + type GetEnsTextQueryOptions, getEnsTextQueryKey, getEnsTextQueryOptions, } from '../query/getEnsText.js' @@ -167,6 +202,7 @@ export { type GetFeeHistoryOptions, type GetFeeHistoryQueryFnData, type GetFeeHistoryQueryKey, + type GetFeeHistoryQueryOptions, getFeeHistoryQueryKey, getFeeHistoryQueryOptions, } from '../query/getFeeHistory.js' @@ -176,6 +212,7 @@ export { type GetGasPriceOptions, type GetGasPriceQueryFnData, type GetGasPriceQueryKey, + type GetGasPriceQueryOptions, getGasPriceQueryKey, getGasPriceQueryOptions, } from '../query/getGasPrice.js' @@ -185,6 +222,7 @@ export { type GetProofOptions, type GetProofQueryFnData, type GetProofQueryKey, + type GetProofQueryOptions, getProofQueryKey, getProofQueryOptions, } from '../query/getProof.js' @@ -194,24 +232,17 @@ export { type GetStorageAtOptions, type GetStorageAtQueryFnData, type GetStorageAtQueryKey, + type GetStorageAtQueryOptions, getStorageAtQueryKey, getStorageAtQueryOptions, } from '../query/getStorageAt.js' -export { - type GetTokenData, - type GetTokenOptions, - type GetTokenQueryFnData, - type GetTokenQueryKey, - getTokenQueryKey, - getTokenQueryOptions, -} from '../query/getToken.js' - export { type GetTransactionData, type GetTransactionOptions, type GetTransactionQueryFnData, type GetTransactionQueryKey, + type GetTransactionQueryOptions, getTransactionQueryKey, getTransactionQueryOptions, } from '../query/getTransaction.js' @@ -221,6 +252,7 @@ export { type GetTransactionConfirmationsOptions, type GetTransactionConfirmationsQueryFnData, type GetTransactionConfirmationsQueryKey, + type GetTransactionConfirmationsQueryOptions, getTransactionConfirmationsQueryKey, getTransactionConfirmationsQueryOptions, } from '../query/getTransactionConfirmations.js' @@ -230,6 +262,7 @@ export { type GetTransactionCountOptions, type GetTransactionCountQueryFnData, type GetTransactionCountQueryKey, + type GetTransactionCountQueryOptions, getTransactionCountQueryKey, getTransactionCountQueryOptions, } from '../query/getTransactionCount.js' @@ -239,6 +272,7 @@ export { type GetTransactionReceiptOptions, type GetTransactionReceiptQueryFnData, type GetTransactionReceiptQueryKey, + type GetTransactionReceiptQueryOptions, getTransactionReceiptQueryKey, getTransactionReceiptQueryOptions, } from '../query/getTransactionReceipt.js' @@ -248,6 +282,7 @@ export { type GetWalletClientOptions, type GetWalletClientQueryFnData, type GetWalletClientQueryKey, + type GetWalletClientQueryOptions, getWalletClientQueryKey, getWalletClientQueryOptions, } from '../query/getWalletClient.js' @@ -266,6 +301,7 @@ export { type PrepareTransactionRequestOptions, type PrepareTransactionRequestQueryFnData, type PrepareTransactionRequestQueryKey, + type PrepareTransactionRequestQueryOptions, prepareTransactionRequestQueryKey, prepareTransactionRequestQueryOptions, } from '../query/prepareTransactionRequest.js' @@ -275,6 +311,7 @@ export { type ReadContractOptions, type ReadContractQueryFnData, type ReadContractQueryKey, + type ReadContractQueryOptions, readContractQueryKey, readContractQueryOptions, } from '../query/readContract.js' @@ -284,72 +321,122 @@ export { type ReadContractsOptions, type ReadContractsQueryFnData, type ReadContractsQueryKey, + type ReadContractsQueryOptions, readContractsQueryKey, readContractsQueryOptions, } from '../query/readContracts.js' export { type ReconnectData, - type ReconnectVariables, type ReconnectMutate, type ReconnectMutateAsync, + type ReconnectVariables, reconnectMutationOptions, } from '../query/reconnect.js' +export { + type SendCallsData, + type SendCallsMutate, + type SendCallsMutateAsync, + type SendCallsVariables, + sendCallsMutationOptions, +} from '../query/sendCalls.js' + +export { + type SendCallsSyncData, + type SendCallsSyncMutate, + type SendCallsSyncMutateAsync, + type SendCallsSyncVariables, + sendCallsSyncMutationOptions, +} from '../query/sendCallsSync.js' + export { type SendTransactionData, - type SendTransactionVariables, type SendTransactionMutate, type SendTransactionMutateAsync, + type SendTransactionVariables, sendTransactionMutationOptions, } from '../query/sendTransaction.js' +export { + type SendTransactionSyncData, + type SendTransactionSyncMutate, + type SendTransactionSyncMutateAsync, + type SendTransactionSyncVariables, + sendTransactionSyncMutationOptions, +} from '../query/sendTransactionSync.js' + +export { + type ShowCallsStatusData, + type ShowCallsStatusMutate, + type ShowCallsStatusMutateAsync, + type ShowCallsStatusVariables, + showCallsStatusMutationOptions, +} from '../query/showCallsStatus.js' + export { type SignMessageData, - type SignMessageVariables, type SignMessageMutate, type SignMessageMutateAsync, + type SignMessageVariables, signMessageMutationOptions, } from '../query/signMessage.js' export { type SignTypedDataData, - type SignTypedDataVariables, type SignTypedDataMutate, type SignTypedDataMutateAsync, + type SignTypedDataVariables, signTypedDataMutationOptions, } from '../query/signTypedData.js' -export { - type SwitchAccountData, - type SwitchAccountVariables, - type SwitchAccountMutate, - type SwitchAccountMutateAsync, - switchAccountMutationOptions, -} from '../query/switchAccount.js' - export { type SimulateContractData, type SimulateContractOptions, type SimulateContractQueryFnData, type SimulateContractQueryKey, + type SimulateContractQueryOptions, simulateContractQueryKey, simulateContractQueryOptions, } from '../query/simulateContract.js' export { type SwitchChainData, - type SwitchChainVariables, type SwitchChainMutate, type SwitchChainMutateAsync, + type SwitchChainVariables, switchChainMutationOptions, } from '../query/switchChain.js' +export { + /** @deprecated use `SwitchConnectionData` instead */ + type SwitchConnectionData as SwitchAccountData, + type SwitchConnectionData, + /** @deprecated use `SwitchConnectionMutate` instead */ + type SwitchConnectionMutate as SwitchAccountMutate, + type SwitchConnectionMutate, + /** @deprecated use `SwitchConnectionMutateAsync` instead */ + type SwitchConnectionMutateAsync as SwitchAccountMutateAsync, + type SwitchConnectionMutateAsync, + /** @deprecated use `SwitchConnectionVariables` instead */ + type SwitchConnectionVariables as SwitchAccountVariables, + type SwitchConnectionVariables, + /** @deprecated use `switchConnectionMutationOptions` instead */ + switchConnectionMutationOptions as switchAccountMutationOptions, + switchConnectionMutationOptions, +} from '../query/switchConnection.js' + +export { + hashFn, + structuralSharing, +} from '../query/utils.js' + export { type VerifyMessageData, type VerifyMessageOptions, type VerifyMessageQueryFnData, type VerifyMessageQueryKey, + type VerifyMessageQueryOptions, verifyMessageQueryKey, verifyMessageQueryOptions, } from '../query/verifyMessage.js' @@ -359,33 +446,43 @@ export { type VerifyTypedDataOptions, type VerifyTypedDataQueryFnData, type VerifyTypedDataQueryKey, + type VerifyTypedDataQueryOptions, verifyTypedDataQueryKey, verifyTypedDataQueryOptions, } from '../query/verifyTypedData.js' +export { + type WaitForCallsStatusData, + type WaitForCallsStatusOptions, + type WaitForCallsStatusQueryFnData, + type WaitForCallsStatusQueryKey, + type WaitForCallsStatusQueryOptions, + waitForCallsStatusQueryKey, + waitForCallsStatusQueryOptions, +} from '../query/waitForCallsStatus.js' + export { type WaitForTransactionReceiptData, type WaitForTransactionReceiptOptions, type WaitForTransactionReceiptQueryFnData, type WaitForTransactionReceiptQueryKey, + type WaitForTransactionReceiptQueryOptions, waitForTransactionReceiptQueryKey, waitForTransactionReceiptQueryOptions, } from '../query/waitForTransactionReceipt.js' export { type WatchAssetData, - type WatchAssetVariables, type WatchAssetMutate, type WatchAssetMutateAsync, + type WatchAssetVariables, watchAssetMutationOptions, } from '../query/watchAsset.js' export { type WriteContractData, - type WriteContractVariables, type WriteContractMutate, type WriteContractMutateAsync, + type WriteContractVariables, writeContractMutationOptions, } from '../query/writeContract.js' - -export { hashFn, structuralSharing } from '../query/utils.js' diff --git a/packages/core/src/exports/tempo.ts b/packages/core/src/exports/tempo.ts new file mode 100644 index 0000000000..77ff6927f9 --- /dev/null +++ b/packages/core/src/exports/tempo.ts @@ -0,0 +1,14 @@ +//////////////////////////////////////////////////////////////////////////////// +// Tempo +//////////////////////////////////////////////////////////////////////////////// + +/** biome-ignore-all lint/performance/noReExportAll: entrypoint */ +// biome-ignore lint/performance/noBarrelFile: entrypoint module +export * as Actions from '../tempo/actions/index.js' +export { + type Dangerous_Secp256k1Parameters, + dangerous_secp256k1, + type WebAuthnParameters, + webAuthn, +} from '../tempo/Connectors.js' +export * as KeyManager from '../tempo/KeyManager.js' diff --git a/packages/core/src/query/AGENTS.md b/packages/core/src/query/AGENTS.md new file mode 100644 index 0000000000..b4b5389b47 --- /dev/null +++ b/packages/core/src/query/AGENTS.md @@ -0,0 +1,164 @@ +# Agent Guidelines + +Agent guidance for query options + +> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar. + +## Query Options Format + +```ts +export function myActionQueryOptions< + config extends Config, + selectData = MyActionData +>( + config: config, + options: MyActionOptions = {}, +): MyActionQueryOptions { + return { + ...options.query, + enabled: Boolean(options.foo && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.foo) throw new Error('foo is required') + const result = await myAction(config, { + foo: parameters.foo, + ...parameters, + }) + return result ?? null + }, + queryKey: myActionQueryKey(options), + structuralSharing, // include when action returns objects, nested values, or arrays + } +} + +export function myActionQueryKey< + config extends Config, + selectData = MyActionData +>( + parameters: Compute> & ScopeKeyParameter> = {}, +) { + return ['myAction', filterQueryOptions(parameters)] as const +} + +export type MyActionOptions< + config extends Config, + selectData = MyActionData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + MyActionQueryFnData, + MyActionErrorType, + selectData, + MyActionQueryKey + > + +export type MyActionQueryOptions< + config extends Config, + selectData = MyActionData +> = QueryOptions< + MyActionQueryFnData, + MyActionErrorType, + selectData, + MyActionQueryKey +> + +export type MyActionQueryFnData = Compute + +export type MyActionData = MyActionQueryFnData + +export type MyActionQueryKey = ReturnType< + typeof myActionQueryKey +> +``` + +## Style Conventions + +### `queryFn` Syntax + +- Use arrow function property syntax: `queryFn: async (context) =>` (not method shorthand `async queryFn(context)`) +- Use `context` parameter, not destructuring: `async (context) =>` (not `async ({ queryKey }) =>`) +- Access `queryKey` via `context.queryKey` + +### Destructuring `queryKey` + +Use array destructuring with `parameters`, then access properties via `parameters.foo`: + +```ts +// ✓ Correct +const [, { scopeKey: _, ...parameters }] = context.queryKey +if (!parameters.account) throw new Error('account is required') + +// ✗ Avoid +const { account, scopeKey: _, ...parameters } = context.queryKey[1] +``` + +### Calling Actions + +When calling actions, spread parameters first, then pass required parameters: + +```ts +// ✓ Correct - spread, then explicit required param +return myAction(config, { ...parameters, foo: parameters.foo }) + +// ✗ Avoid - just passing parameters directly +return myAction(config, parameters) +``` + +### Accessing Skipped Properties + +Properties filtered from the queryKey (e.g., `connector`, `abi`) should be accessed via `options.`: + +```ts +queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + // ✓ Use rest.connector for properties not in queryKey + const result = await myAction(config, { ...parameters, connector: options.connector }) + return result ?? null +} +``` + +## Type Parameter Nuances + +### `const` Modifier + +Use `const` for type parameters that need literal type inference (e.g., abi, args): + +```ts +export function readContractQueryOptions< + const abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + const args extends ContractFunctionArgs, + config extends Config, +> +``` + +### `ExactPartial` vs `UnionExactPartial` + +- **`ExactPartial`**: Use for simple cases with straightforward parameter types +- **`UnionExactPartial`**: Use for complex type inference or action parameter types with lots of unions (e.g., contract-related actions) + +If unsure, check the underlying action's parameter types or ask. + +### Default Parameter Value + +- **Simple cases**: `options: MyActionOptions = {}` +- **Complex generics** (e.g., contract actions with abi/args): `options: MyActionOptions<...> = {} as any` + +## `structuralSharing` + +Include `structuralSharing` from `./utils.js` when the action returns: +- Objects +- Nested values +- Arrays + +See `packages/react/src/hooks` for more examples. + +## Special Query Key Handling + +For `getConnectorClient`, include `connectorUid` separately in the query key: + +```ts +return [ + 'connectorClient', + { ...filterQueryOptions(options), connectorUid: options.connector?.uid }, +] as const +``` diff --git a/packages/core/src/query/call.test.ts b/packages/core/src/query/call.test.ts index 1e9ee03f7a..13ef6577ca 100644 --- a/packages/core/src/query/call.test.ts +++ b/packages/core/src/query/call.test.ts @@ -1,7 +1,6 @@ import { accounts, address, chain, config } from '@wagmi/test' -import { expect, test } from 'vitest' - import { parseEther, parseGwei } from 'viem' +import { expect, test } from 'vitest' import { callQueryOptions } from './call.js' const name4bytes = '0x06fdde03' @@ -20,7 +19,7 @@ test('default', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", }, @@ -56,7 +55,7 @@ test('parameters: accessList', () => { ], }, ], - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", }, @@ -79,7 +78,7 @@ test('parameters: blockNumber', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockNumber": 1234567890n, "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -103,7 +102,7 @@ test('parameters: blockTag', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockTag": "safe", "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -127,7 +126,7 @@ test('parameters: chainId', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 456, "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -151,7 +150,7 @@ test('parameters: gas', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "gas": 100000n, "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -175,7 +174,7 @@ test('parameters: gasPrice', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "gasPrice": 20000000000n, "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -199,7 +198,7 @@ test('parameters: maxFeePerGas', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "maxFeePerGas": 20000000000n, "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -223,7 +222,7 @@ test('parameters: maxPriorityFeePerGas', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "maxPriorityFeePerGas": 2000000000n, "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -247,7 +246,7 @@ test('parameters: nonce', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "nonce": 123, "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", @@ -271,7 +270,7 @@ test('parameters: type', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", "type": "eip1559", @@ -295,7 +294,7 @@ test('parameters: value', () => { "queryKey": [ "call", { - "account": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "account": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "data": "0x06fdde03", "to": "0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2", "value": 1000000000000000000n, diff --git a/packages/core/src/query/call.ts b/packages/core/src/query/call.ts index 2ca4491b86..e48c9a0477 100644 --- a/packages/core/src/query/call.ts +++ b/packages/core/src/query/call.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type CallErrorType, type CallParameters, @@ -8,32 +6,35 @@ import { } from '../actions/call.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type CallOptions = Compute< +export type CallOptions = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + CallQueryFnData, + CallErrorType, + selectData, + CallQueryKey + > -export function callQueryOptions( +export function callQueryOptions( config: config, - options: CallOptions = {}, -) { + options: CallOptions = {}, +): CallQueryOptions { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey const data = await call(config, { ...parameters, } as CallParameters) return data ?? null }, queryKey: callQueryKey(options), - } as const satisfies QueryOptions< - CallQueryFnData, - CallErrorType, - CallData, - CallQueryKey - > + } } export type CallQueryFnData = CallReturnType @@ -41,7 +42,9 @@ export type CallQueryFnData = CallReturnType export type CallData = CallQueryFnData export function callQueryKey( - options: CallOptions, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['call', filterQueryOptions(options)] as const } @@ -49,3 +52,13 @@ export function callQueryKey( export type CallQueryKey = ReturnType< typeof callQueryKey > + +export type CallQueryOptions< + config extends Config, + selectData = CallData, +> = QueryOptions< + CallQueryFnData, + CallErrorType, + selectData, + CallQueryKey +> diff --git a/packages/core/src/query/connect.test-d.ts b/packages/core/src/query/connect.test-d.ts new file mode 100644 index 0000000000..9d049d1313 --- /dev/null +++ b/packages/core/src/query/connect.test-d.ts @@ -0,0 +1,81 @@ +import { accounts } from '@wagmi/test' +import { type Address, type Hex, 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 type { ConnectMutate, ConnectMutateAsync } from './connect.js' + +const config = createConfig({ + chains: [mainnet], + transports: { [mainnet.id]: http() }, +}) + +test('parameters: connector (ConnectorFn)', () => { + const connectorFn = mock({ accounts }) + + const mutate: ConnectMutate = () => {} + mutate({ + connector: connectorFn, + foo: 'bar', + }) + expectTypeOf< + typeof connectorFn extends CreateConnectorFn ? true : false + >().toEqualTypeOf() + + type Result = NonNullable>[0]> + expectTypeOf().toEqualTypeOf() +}) + +test('parameters: connector (Connector)', () => { + const connector = config._internal.connectors.setup(mock({ accounts })) + + const mutate: ConnectMutate = () => {} + mutate({ + connector, + foo: 'bar', + }) + expectTypeOf< + typeof connector extends Connector ? true : false + >().toEqualTypeOf() + + type Result = NonNullable>[0]> + expectTypeOf().toEqualTypeOf() +}) + +test('parameters: withCapabilities', async () => { + const connectorFn = mock({ accounts }) + + const mutateAsync: ConnectMutateAsync = () => ({}) as any + const res0 = await mutateAsync({ connector: connectorFn }) + expectTypeOf(res0.accounts).toEqualTypeOf() + + const res1 = await mutateAsync({ + connector: connectorFn, + withCapabilities: false, + }) + expectTypeOf(res1.accounts).toEqualTypeOf() + + const res2 = await mutateAsync({ + connector: connectorFn, + withCapabilities: true, + }) + expectTypeOf(res2.accounts).toEqualTypeOf< + readonly [ + { + address: Address + capabilities: { + foo: { bar: Hex } + } + }, + ...{ + address: Address + capabilities: { + foo: { bar: Hex } + } + }[], + ] + >() +}) diff --git a/packages/core/src/query/connect.ts b/packages/core/src/query/connect.ts index f521512789..895950bbce 100644 --- a/packages/core/src/query/connect.ts +++ b/packages/core/src/query/connect.ts @@ -6,9 +6,8 @@ import { type ConnectReturnType, connect, } from '../actions/connect.js' -import type { Config, Connector } from '../createConfig.js' - import type { CreateConnectorFn } from '../connectors/createConnector.js' +import type { Config, Connector } from '../createConfig.js' import type { Compute } from '../types/utils.js' export function connectMutationOptions(config: config) { @@ -18,32 +17,38 @@ export function connectMutationOptions(config: config) { }, mutationKey: ['connect'], } as const satisfies MutationOptions< - ConnectData, + ConnectData, ConnectErrorType, - ConnectVariables + ConnectVariables > } -export type ConnectData = ConnectReturnType +export type ConnectData< + config extends Config, + connector extends Connector | CreateConnectorFn, + withCapabilities extends boolean, +> = ConnectReturnType export type ConnectVariables< config extends Config, connector extends Connector | CreateConnectorFn, -> = ConnectParameters + withCapabilities extends boolean, +> = ConnectParameters export type ConnectMutate = < connector extends | config['connectors'][number] | Connector | CreateConnectorFn, + withCapabilities extends boolean = false, >( - variables: ConnectVariables, + variables: ConnectVariables, options?: | Compute< MutateOptions< - ConnectData, + ConnectData, ConnectErrorType, - Compute>, + Compute>, context > > @@ -55,16 +60,17 @@ export type ConnectMutateAsync = < | config['connectors'][number] | Connector | CreateConnectorFn, + withCapabilities extends boolean = false, >( - variables: ConnectVariables, + variables: ConnectVariables, options?: | Compute< MutateOptions< - ConnectData, + ConnectData, ConnectErrorType, - Compute>, + Compute>, context > > | undefined, -) => Promise> +) => Promise> diff --git a/packages/core/src/query/estimateFeesPerGas.test-d.ts b/packages/core/src/query/estimateFeesPerGas.test-d.ts new file mode 100644 index 0000000000..1075c674dd --- /dev/null +++ b/packages/core/src/query/estimateFeesPerGas.test-d.ts @@ -0,0 +1,43 @@ +import { config } from '@wagmi/test' +import { expectTypeOf, test } from 'vitest' +import { estimateFeesPerGasQueryOptions } from './estimateFeesPerGas.js' + +const context = {} as any + +test('types', async () => { + // default + { + const options = estimateFeesPerGasQueryOptions(config, {}) + const result = await options.queryFn(context) + expectTypeOf(result).toEqualTypeOf<{ + gasPrice?: undefined + maxFeePerBlobGas?: undefined + maxFeePerGas: bigint + maxPriorityFeePerGas: bigint + }>() + } + + // legacy + { + const options = estimateFeesPerGasQueryOptions(config, { type: 'legacy' }) + const result = await options.queryFn(context) + expectTypeOf(result).toEqualTypeOf<{ + gasPrice: bigint + maxFeePerBlobGas?: undefined + maxFeePerGas?: undefined + maxPriorityFeePerGas?: undefined + }>() + } + + // eip1559 + { + const options = estimateFeesPerGasQueryOptions(config, { type: 'eip1559' }) + const result = await options.queryFn(context) + expectTypeOf(result).toEqualTypeOf<{ + gasPrice?: undefined + maxFeePerBlobGas?: undefined + maxFeePerGas: bigint + maxPriorityFeePerGas: bigint + }>() + } +}) diff --git a/packages/core/src/query/estimateFeesPerGas.ts b/packages/core/src/query/estimateFeesPerGas.ts index 7cf2f607c8..95ee3852c3 100644 --- a/packages/core/src/query/estimateFeesPerGas.ts +++ b/packages/core/src/query/estimateFeesPerGas.ts @@ -1,4 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { FeeValuesType } from 'viem' import { @@ -9,32 +8,40 @@ import { } from '../actions/estimateFeesPerGas.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type EstimateFeesPerGasOptions< type extends FeeValuesType, config extends Config, + selectData = EstimateFeesPerGasData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + EstimateFeesPerGasQueryFnData, + EstimateFeesPerGasErrorType, + selectData, + EstimateFeesPerGasQueryKey + > export function estimateFeesPerGasQueryOptions< config extends Config, type extends FeeValuesType = 'eip1559', ->(config: config, options: EstimateFeesPerGasOptions = {}) { + selectData = EstimateFeesPerGasData, +>( + config: config, + options: EstimateFeesPerGasOptions = {}, +): EstimateFeesPerGasQueryOptions { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey return estimateFeesPerGas(config, parameters) }, queryKey: estimateFeesPerGasQueryKey(options), - } as const satisfies QueryOptions< - EstimateFeesPerGasQueryFnData, - EstimateFeesPerGasErrorType, - EstimateFeesPerGasData, - EstimateFeesPerGasQueryKey - > + } } export type EstimateFeesPerGasQueryFnData = @@ -46,7 +53,11 @@ export type EstimateFeesPerGasData = export function estimateFeesPerGasQueryKey< config extends Config, type extends FeeValuesType = 'eip1559', ->(options: EstimateFeesPerGasOptions = {}) { +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { return ['estimateFeesPerGas', filterQueryOptions(options)] as const } @@ -54,3 +65,14 @@ export type EstimateFeesPerGasQueryKey< config extends Config, type extends FeeValuesType, > = ReturnType> + +export type EstimateFeesPerGasQueryOptions< + type extends FeeValuesType, + config extends Config, + selectData = EstimateFeesPerGasData, +> = QueryOptions< + EstimateFeesPerGasQueryFnData, + EstimateFeesPerGasErrorType, + selectData, + EstimateFeesPerGasQueryKey +> diff --git a/packages/core/src/query/estimateGas.test-d.ts b/packages/core/src/query/estimateGas.test-d.ts index e48c4b089a..6deba91f86 100644 --- a/packages/core/src/query/estimateGas.test-d.ts +++ b/packages/core/src/query/estimateGas.test-d.ts @@ -1,4 +1,4 @@ -import { http, type Address, parseEther } from 'viem' +import { type Address, http, parseEther } from 'viem' import { celo, mainnet } from 'viem/chains' import { expectTypeOf, test } from 'vitest' @@ -49,7 +49,5 @@ test('chain formatters', () => { chainId: mainnet.id, to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', value: parseEther('0.01'), - // @ts-expect-error - feeCurrency: '0x', }) }) diff --git a/packages/core/src/query/estimateGas.test.ts b/packages/core/src/query/estimateGas.test.ts index 6c31cadbc1..8b6a116fce 100644 --- a/packages/core/src/query/estimateGas.test.ts +++ b/packages/core/src/query/estimateGas.test.ts @@ -12,6 +12,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "estimateGas", diff --git a/packages/core/src/query/estimateGas.ts b/packages/core/src/query/estimateGas.ts index 749002f92c..fb4d5d8cab 100644 --- a/packages/core/src/query/estimateGas.ts +++ b/packages/core/src/query/estimateGas.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type EstimateGasErrorType, type EstimateGasParameters, @@ -8,34 +6,50 @@ import { } from '../actions/estimateGas.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' -import type { UnionExactPartial } from '../types/utils.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type EstimateGasOptions< config extends Config, - chainId extends config['chains'][number]['id'] | undefined, -> = UnionExactPartial> & - ScopeKeyParameter + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = EstimateGasData, +> = Compute< + UnionExactPartial> & ScopeKeyParameter +> & + QueryParameter< + EstimateGasQueryFnData, + EstimateGasErrorType, + selectData, + EstimateGasQueryKey + > export function estimateGasQueryOptions< config extends Config, - chainId extends config['chains'][number]['id'], ->(config: config, options: EstimateGasOptions = {} as any) { + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = EstimateGasData, +>( + config: config, + options: EstimateGasOptions = {} as any, +): EstimateGasQueryOptions { return { - async queryFn({ queryKey }) { - const { connector } = options - const { account, scopeKey: _, ...parameters } = queryKey[1] - if (!account && !connector) + ...options.query, + enabled: Boolean( + (options.account || options.connector) && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.account && !options.connector) throw new Error('account or connector is required') - return estimateGas(config, { account, connector, ...(parameters as any) }) + return estimateGas(config, { + ...(parameters as any), + account: parameters.account, + connector: options.connector, + }) }, queryKey: estimateGasQueryKey(options), - } as const satisfies QueryOptions< - EstimateGasQueryFnData, - EstimateGasErrorType, - EstimateGasData, - EstimateGasQueryKey - > + } } export type EstimateGasQueryFnData = EstimateGasReturnType @@ -44,13 +58,28 @@ export type EstimateGasData = EstimateGasQueryFnData export function estimateGasQueryKey< config extends Config, - chainId extends config['chains'][number]['id'] | undefined, ->(options: EstimateGasOptions = {} as any) { - const { connector: _, ...rest } = options - return ['estimateGas', filterQueryOptions(rest)] as const + chainId extends config['chains'][number]['id'] | undefined = undefined, +>( + options: Compute< + UnionExactPartial> & + ScopeKeyParameter + > = {} as any, +) { + return ['estimateGas', filterQueryOptions(options)] as const } export type EstimateGasQueryKey< config extends Config, - chainId extends config['chains'][number]['id'] | undefined, + chainId extends config['chains'][number]['id'] | undefined = undefined, > = ReturnType> + +export type EstimateGasQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = EstimateGasData, +> = QueryOptions< + EstimateGasQueryFnData, + EstimateGasErrorType, + selectData, + EstimateGasQueryKey +> diff --git a/packages/core/src/query/estimateMaxPriorityFeePerGas.ts b/packages/core/src/query/estimateMaxPriorityFeePerGas.ts index cb58e65a79..8412459dcc 100644 --- a/packages/core/src/query/estimateMaxPriorityFeePerGas.ts +++ b/packages/core/src/query/estimateMaxPriorityFeePerGas.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type EstimateMaxPriorityFeePerGasErrorType, type EstimateMaxPriorityFeePerGasParameters, @@ -8,31 +6,39 @@ import { } from '../actions/estimateMaxPriorityFeePerGas.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type EstimateMaxPriorityFeePerGasOptions = - Compute< - ExactPartial> & - ScopeKeyParameter +export type EstimateMaxPriorityFeePerGasOptions< + config extends Config, + selectData = EstimateMaxPriorityFeePerGasData, +> = Compute< + ExactPartial> & + ScopeKeyParameter +> & + QueryParameter< + EstimateMaxPriorityFeePerGasQueryFnData, + EstimateMaxPriorityFeePerGasErrorType, + selectData, + EstimateMaxPriorityFeePerGasQueryKey > -export function estimateMaxPriorityFeePerGasQueryOptions( +export function estimateMaxPriorityFeePerGasQueryOptions< + config extends Config, + selectData = EstimateMaxPriorityFeePerGasData, +>( config: config, - options: EstimateMaxPriorityFeePerGasOptions = {}, -) { + options: EstimateMaxPriorityFeePerGasOptions = {}, +): EstimateMaxPriorityFeePerGasQueryOptions { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey return estimateMaxPriorityFeePerGas(config, parameters) }, queryKey: estimateMaxPriorityFeePerGasQueryKey(options), - } as const satisfies QueryOptions< - EstimateMaxPriorityFeePerGasQueryFnData, - EstimateMaxPriorityFeePerGasErrorType, - EstimateMaxPriorityFeePerGasData, - EstimateMaxPriorityFeePerGasQueryKey - > + } } export type EstimateMaxPriorityFeePerGasQueryFnData = @@ -42,10 +48,23 @@ export type EstimateMaxPriorityFeePerGasData = EstimateMaxPriorityFeePerGasQueryFnData export function estimateMaxPriorityFeePerGasQueryKey( - options: EstimateMaxPriorityFeePerGasOptions = {}, + options: Compute< + ExactPartial> & + ScopeKeyParameter + > = {}, ) { return ['estimateMaxPriorityFeePerGas', filterQueryOptions(options)] as const } export type EstimateMaxPriorityFeePerGasQueryKey = ReturnType> + +export type EstimateMaxPriorityFeePerGasQueryOptions< + config extends Config, + selectData = EstimateMaxPriorityFeePerGasData, +> = QueryOptions< + EstimateMaxPriorityFeePerGasQueryFnData, + EstimateMaxPriorityFeePerGasErrorType, + selectData, + EstimateMaxPriorityFeePerGasQueryKey +> diff --git a/packages/core/src/query/getBalance.test.ts b/packages/core/src/query/getBalance.test.ts index 1f9e1ecda9..25a66f4402 100644 --- a/packages/core/src/query/getBalance.test.ts +++ b/packages/core/src/query/getBalance.test.ts @@ -8,11 +8,12 @@ const address = accounts[0] test('default', () => { expect(getBalanceQueryOptions(config, { address })).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "balance", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", }, ], } @@ -24,40 +25,15 @@ test('parameters: chainId', () => { getBalanceQueryOptions(config, { address, chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "balance", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 1, }, ], } `) }) - -test.todo('parameters: token') - -test('parameters: unit', () => { - expect( - getBalanceQueryOptions(config, { - address, - chainId: chain.mainnet.id, - token: '0x0000000000000000000000000000000000000000', - unit: 'gwei', - }), - ).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "balance", - { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "chainId": 1, - "token": "0x0000000000000000000000000000000000000000", - "unit": "gwei", - }, - ], - } - `) -}) diff --git a/packages/core/src/query/getBalance.ts b/packages/core/src/query/getBalance.ts index e1dd287633..1a3a2a6279 100644 --- a/packages/core/src/query/getBalance.ts +++ b/packages/core/src/query/getBalance.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetBalanceErrorType, type GetBalanceParameters, @@ -8,34 +6,42 @@ import { } from '../actions/getBalance.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' -import type { Compute, PartialBy } from '../types/utils.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetBalanceOptions = Compute< - PartialBy, 'address'> & ScopeKeyParameter -> +export type GetBalanceOptions< + config extends Config, + selectData = GetBalanceData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetBalanceQueryFnData, + GetBalanceErrorType, + selectData, + GetBalanceQueryKey + > -export function getBalanceQueryOptions( +export function getBalanceQueryOptions< + config extends Config, + selectData = GetBalanceData, +>( config: config, - options: GetBalanceOptions = {}, -) { + options: GetBalanceOptions = {}, +): GetBalanceQueryOptions { return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, ...parameters } = queryKey[1] - if (!address) throw new Error('address is required') + ...options.query, + enabled: Boolean(options.address && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') const balance = await getBalance(config, { ...(parameters as GetBalanceParameters), - address, + address: parameters.address, }) return balance ?? null }, queryKey: getBalanceQueryKey(options), - } as const satisfies QueryOptions< - GetBalanceQueryFnData, - GetBalanceErrorType, - GetBalanceData, - GetBalanceQueryKey - > + } } export type GetBalanceQueryFnData = Compute @@ -43,7 +49,9 @@ export type GetBalanceQueryFnData = Compute export type GetBalanceData = GetBalanceQueryFnData export function getBalanceQueryKey( - options: GetBalanceOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['balance', filterQueryOptions(options)] as const } @@ -51,3 +59,13 @@ export function getBalanceQueryKey( export type GetBalanceQueryKey = ReturnType< typeof getBalanceQueryKey > + +export type GetBalanceQueryOptions< + config extends Config, + selectData = GetBalanceData, +> = QueryOptions< + GetBalanceQueryFnData, + GetBalanceErrorType, + selectData, + GetBalanceQueryKey +> diff --git a/packages/core/src/query/getBlock.test-d.ts b/packages/core/src/query/getBlock.test-d.ts new file mode 100644 index 0000000000..1bb1169e4b --- /dev/null +++ b/packages/core/src/query/getBlock.test-d.ts @@ -0,0 +1,37 @@ +import { type Hex, http } from 'viem' +import { celo, mainnet } from 'viem/chains' +import { expectTypeOf, test } from 'vitest' + +import { createConfig } from '../createConfig.js' +import { getBlockQueryOptions } from './getBlock.js' + +const context = {} as any + +test('chain formatters', async () => { + const config = createConfig({ + chains: [celo, mainnet], + transports: { [celo.id]: http(), [mainnet.id]: http() }, + }) + const options = getBlockQueryOptions(config) + const result = await options.queryFn(context) + if (result.chainId === celo.id) { + expectTypeOf(result.difficulty).toEqualTypeOf() + expectTypeOf(result.gasLimit).toEqualTypeOf() + expectTypeOf(result.mixHash).toEqualTypeOf() + expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>() + expectTypeOf(result.uncles).toEqualTypeOf() + } +}) + +test('chainId', async () => { + const config = createConfig({ + chains: [celo, mainnet], + transports: { [celo.id]: http(), [mainnet.id]: http() }, + }) + const options = getBlockQueryOptions(config, { chainId: celo.id }) + const result = await options.queryFn(context) + expectTypeOf(result.difficulty).toEqualTypeOf() + expectTypeOf(result.gasLimit).toEqualTypeOf() + expectTypeOf(result.mixHash).toEqualTypeOf() + expectTypeOf(result.nonce).toEqualTypeOf<`0x${string}`>() +}) diff --git a/packages/core/src/query/getBlock.ts b/packages/core/src/query/getBlock.ts index f8f4db8417..f008157f28 100644 --- a/packages/core/src/query/getBlock.ts +++ b/packages/core/src/query/getBlock.ts @@ -1,4 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { BlockTag } from 'viem' import { @@ -9,6 +8,7 @@ import { } from '../actions/getBlock.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' @@ -18,35 +18,51 @@ export type GetBlockOptions< config extends Config, chainId extends config['chains'][number]['id'] = config['chains'][number]['id'], + selectData = GetBlockData, > = Compute< ExactPartial< GetBlockParameters > & ScopeKeyParameter -> +> & + QueryParameter< + GetBlockQueryFnData, + GetBlockErrorType, + selectData, + GetBlockQueryKey + > export function getBlockQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], - includeTransactions extends boolean, - blockTag extends BlockTag, + includeTransactions extends boolean = false, + blockTag extends BlockTag = 'latest', + selectData = GetBlockData, >( config: config, - options: GetBlockOptions = {}, -) { + options: GetBlockOptions< + includeTransactions, + blockTag, + config, + chainId, + selectData + > = {}, +): GetBlockQueryOptions< + includeTransactions, + blockTag, + config, + chainId, + selectData +> { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] - const block = await getBlock(config, parameters) + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + const block = await getBlock(config, parameters as any) return (block ?? null) as any }, queryKey: getBlockQueryKey(options), - } as const satisfies QueryOptions< - GetBlockQueryFnData, - GetBlockErrorType, - GetBlockData, - GetBlockQueryKey - > + } } export type GetBlockQueryFnData< @@ -69,7 +85,12 @@ export function getBlockQueryKey< includeTransactions extends boolean = false, blockTag extends BlockTag = 'latest', >( - options: GetBlockOptions = {}, + options: Compute< + ExactPartial< + GetBlockParameters + > & + ScopeKeyParameter + > = {}, ) { return ['block', filterQueryOptions(options)] as const } @@ -82,3 +103,16 @@ export type GetBlockQueryKey< > = ReturnType< typeof getBlockQueryKey > + +export type GetBlockQueryOptions< + includeTransactions extends boolean, + blockTag extends BlockTag, + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetBlockData, +> = QueryOptions< + GetBlockQueryFnData, + GetBlockErrorType, + selectData, + GetBlockQueryKey +> diff --git a/packages/core/src/query/getBlockNumber.ts b/packages/core/src/query/getBlockNumber.ts index 9585068a92..93f8ca5815 100644 --- a/packages/core/src/query/getBlockNumber.ts +++ b/packages/core/src/query/getBlockNumber.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetBlockNumberErrorType, type GetBlockNumberParameters, @@ -8,34 +6,42 @@ import { } from '../actions/getBlockNumber.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetBlockNumberOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetBlockNumberData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetBlockNumberQueryFnData, + GetBlockNumberErrorType, + selectData, + GetBlockNumberQueryKey + > export function getBlockNumberQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetBlockNumberOptions = {}) { + selectData = GetBlockNumberData, +>( + config: config, + options: GetBlockNumberOptions = {}, +): GetBlockNumberQueryOptions { return { + ...options.query, gcTime: 0, - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey const blockNumber = await getBlockNumber(config, parameters) return blockNumber ?? null }, queryKey: getBlockNumberQueryKey(options), - } as const satisfies QueryOptions< - GetBlockNumberQueryFnData, - GetBlockNumberErrorType, - GetBlockNumberData, - GetBlockNumberQueryKey - > + } } export type GetBlockNumberQueryFnData = GetBlockNumberReturnType @@ -45,7 +51,11 @@ export type GetBlockNumberData = GetBlockNumberQueryFnData export function getBlockNumberQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetBlockNumberOptions = {}) { +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { return ['blockNumber', filterQueryOptions(options)] as const } @@ -53,3 +63,14 @@ export type GetBlockNumberQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetBlockNumberQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetBlockNumberData, +> = QueryOptions< + GetBlockNumberQueryFnData, + GetBlockNumberErrorType, + selectData, + GetBlockNumberQueryKey +> diff --git a/packages/core/src/query/getBlockTransactionCount.ts b/packages/core/src/query/getBlockTransactionCount.ts index 453e95e001..4d6a16cbad 100644 --- a/packages/core/src/query/getBlockTransactionCount.ts +++ b/packages/core/src/query/getBlockTransactionCount.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetBlockTransactionCountErrorType, type GetBlockTransactionCountParameters, @@ -8,40 +6,45 @@ import { } from '../actions/getBlockTransactionCount.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { ExactPartial, UnionCompute } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetBlockTransactionCountOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetBlockTransactionCountData, > = UnionCompute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetBlockTransactionCountQueryFnData, + GetBlockTransactionCountErrorType, + selectData, + GetBlockTransactionCountQueryKey + > export function getBlockTransactionCountQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetBlockTransactionCountData, >( config: config, - options: GetBlockTransactionCountOptions = {}, -) { + options: GetBlockTransactionCountOptions = {}, +): GetBlockTransactionCountQueryOptions { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey const blockTransactionCount = await getBlockTransactionCount( config, - parameters, + parameters as any, ) return blockTransactionCount ?? null }, queryKey: getBlockTransactionCountQueryKey(options), - } as const satisfies QueryOptions< - GetBlockTransactionCountQueryFnData, - GetBlockTransactionCountErrorType, - GetBlockTransactionCountData, - GetBlockTransactionCountQueryKey - > + } } export type GetBlockTransactionCountQueryFnData = @@ -52,7 +55,12 @@ export type GetBlockTransactionCountData = GetBlockTransactionCountQueryFnData export function getBlockTransactionCountQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetBlockTransactionCountOptions = {}) { +>( + options: UnionCompute< + ExactPartial> & + ScopeKeyParameter + > = {}, +) { return ['blockTransactionCount', filterQueryOptions(options)] as const } @@ -60,3 +68,14 @@ export type GetBlockTransactionCountQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetBlockTransactionCountQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetBlockTransactionCountData, +> = QueryOptions< + GetBlockTransactionCountQueryFnData, + GetBlockTransactionCountErrorType, + selectData, + GetBlockTransactionCountQueryKey +> diff --git a/packages/core/src/query/getBytecode.test.ts b/packages/core/src/query/getBytecode.test.ts index 83f22ebf2e..dcd915f293 100644 --- a/packages/core/src/query/getBytecode.test.ts +++ b/packages/core/src/query/getBytecode.test.ts @@ -10,6 +10,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getBytecode", @@ -29,6 +30,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getBytecode", @@ -49,6 +51,7 @@ test('parameters: blockNumber', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getBytecode", @@ -69,6 +72,7 @@ test('parameters: blockTag', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getBytecode", diff --git a/packages/core/src/query/getBytecode.ts b/packages/core/src/query/getBytecode.ts index 7000c50eaa..027b7fb703 100644 --- a/packages/core/src/query/getBytecode.ts +++ b/packages/core/src/query/getBytecode.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetBytecodeErrorType, type GetBytecodeParameters, @@ -8,38 +6,52 @@ import { } from '../actions/getBytecode.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetBytecodeOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetBytecodeOptions< + config extends Config, + selectData = GetBytecodeData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetBytecodeQueryFnData, + GetBytecodeErrorType, + selectData, + GetBytecodeQueryKey + > -export function getBytecodeQueryOptions( +export function getBytecodeQueryOptions< + config extends Config, + selectData = GetBytecodeData, +>( config: config, - options: GetBytecodeOptions = {}, -) { + options: GetBytecodeOptions = {}, +): GetBytecodeQueryOptions { return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, ...parameters } = queryKey[1] - if (!address) throw new Error('address is required') - const bytecode = await getBytecode(config, { ...parameters, address }) + ...options.query, + enabled: Boolean(options.address && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') + const bytecode = await getBytecode(config, { + ...(parameters as any), + address: parameters.address, + }) return (bytecode ?? null) as any }, queryKey: getBytecodeQueryKey(options), - } as const satisfies QueryOptions< - GetBytecodeQueryFnData, - GetBytecodeErrorType, - GetBytecodeData, - GetBytecodeQueryKey - > + } } + export type GetBytecodeQueryFnData = GetBytecodeReturnType export type GetBytecodeData = GetBytecodeQueryFnData export function getBytecodeQueryKey( - options: GetBytecodeOptions, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['getBytecode', filterQueryOptions(options)] as const } @@ -47,3 +59,13 @@ export function getBytecodeQueryKey( export type GetBytecodeQueryKey = ReturnType< typeof getBytecodeQueryKey > + +export type GetBytecodeQueryOptions< + config extends Config, + selectData = GetBytecodeData, +> = QueryOptions< + GetBytecodeQueryFnData, + GetBytecodeErrorType, + selectData, + GetBytecodeQueryKey +> diff --git a/packages/core/src/experimental/query/getCallsStatus.test.ts b/packages/core/src/query/getCallsStatus.test.ts similarity index 94% rename from packages/core/src/experimental/query/getCallsStatus.test.ts rename to packages/core/src/query/getCallsStatus.test.ts index fe834ecc79..1bd6346b06 100644 --- a/packages/core/src/experimental/query/getCallsStatus.test.ts +++ b/packages/core/src/query/getCallsStatus.test.ts @@ -10,6 +10,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "callsStatus", @@ -17,7 +18,6 @@ test('default', () => { "id": "0x0000000000000000000000000000000000000000", }, ], - "retry": [Function], } `) }) diff --git a/packages/core/src/query/getCallsStatus.ts b/packages/core/src/query/getCallsStatus.ts new file mode 100644 index 0000000000..0fef2426d2 --- /dev/null +++ b/packages/core/src/query/getCallsStatus.ts @@ -0,0 +1,65 @@ +import { + type GetCallsStatusErrorType, + type GetCallsStatusParameters, + type GetCallsStatusReturnType, + getCallsStatus, +} from '../actions/getCallsStatus.js' +import type { Config } from '../createConfig.js' +import { filterQueryOptions } from '../query/utils.js' +import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute } from '../types/utils.js' + +export type GetCallsStatusOptions = Compute< + GetCallsStatusParameters & ScopeKeyParameter +> & + QueryParameter< + GetCallsStatusQueryFnData, + GetCallsStatusErrorType, + selectData, + GetCallsStatusQueryKey + > + +export function getCallsStatusQueryOptions< + config extends Config, + selectData = GetCallsStatusData, +>( + config: config, + options: GetCallsStatusOptions, +): GetCallsStatusQueryOptions { + return { + ...options.query, + enabled: Boolean( + options.connector?.getProvider && (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + if (!options.connector?.getProvider) + throw new Error('connector is required') + const [, { connectorUid: _, scopeKey: __, ...parameters }] = + context.queryKey + const status = await getCallsStatus(config, parameters) + return status + }, + queryKey: getCallsStatusQueryKey(options), + } +} + +export type GetCallsStatusQueryFnData = GetCallsStatusReturnType + +export type GetCallsStatusData = GetCallsStatusQueryFnData + +export function getCallsStatusQueryKey( + options: Compute, +) { + return ['callsStatus', filterQueryOptions(options)] as const +} + +export type GetCallsStatusQueryKey = ReturnType + +export type GetCallsStatusQueryOptions = + QueryOptions< + GetCallsStatusQueryFnData, + GetCallsStatusErrorType, + selectData, + GetCallsStatusQueryKey + > diff --git a/packages/core/src/experimental/query/getCapabilities.test.ts b/packages/core/src/query/getCapabilities.test.ts similarity index 93% rename from packages/core/src/experimental/query/getCapabilities.test.ts rename to packages/core/src/query/getCapabilities.test.ts index 942eb37e04..b64f545132 100644 --- a/packages/core/src/experimental/query/getCapabilities.test.ts +++ b/packages/core/src/query/getCapabilities.test.ts @@ -6,12 +6,12 @@ import { getCapabilitiesQueryOptions } from './getCapabilities.js' test('default', () => { expect(getCapabilitiesQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "capabilities", {}, ], - "retry": [Function], } `) }) @@ -23,6 +23,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "capabilities", @@ -30,7 +31,6 @@ test('parameters: chainId', () => { "account": "0x0000000000000000000000000000000000000000", }, ], - "retry": [Function], } `) }) diff --git a/packages/core/src/query/getCapabilities.ts b/packages/core/src/query/getCapabilities.ts new file mode 100644 index 0000000000..663e1f25e6 --- /dev/null +++ b/packages/core/src/query/getCapabilities.ts @@ -0,0 +1,87 @@ +import { + type GetCapabilitiesErrorType, + type GetCapabilitiesParameters, + type GetCapabilitiesReturnType, + getCapabilities, +} from '../actions/getCapabilities.js' +import type { Config } from '../createConfig.js' +import { filterQueryOptions } from '../query/utils.js' +import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, ExactPartial } from '../types/utils.js' + +export type GetCapabilitiesOptions< + config extends Config = Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = GetCapabilitiesData, +> = Compute< + ExactPartial> & ScopeKeyParameter +> & + QueryParameter< + GetCapabilitiesQueryFnData, + GetCapabilitiesErrorType, + selectData, + GetCapabilitiesQueryKey + > + +export function getCapabilitiesQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = GetCapabilitiesData, +>( + config: config, + options: GetCapabilitiesOptions = {}, +): GetCapabilitiesQueryOptions { + return { + ...options.query, + enabled: Boolean( + options.connector?.getProvider && (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + if (!options.connector?.getProvider) + throw new Error('connector is required') + const [, { connectorUid: _, scopeKey: __, ...parameters }] = + context.queryKey + const capabilities = await getCapabilities(config, parameters) + return capabilities + }, + queryKey: getCapabilitiesQueryKey(options), + } +} + +export type GetCapabilitiesQueryFnData< + config extends Config = Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +> = GetCapabilitiesReturnType + +export type GetCapabilitiesData< + config extends Config = Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +> = GetCapabilitiesQueryFnData + +export function getCapabilitiesQueryKey< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { + return ['capabilities', filterQueryOptions(options)] as const +} + +export type GetCapabilitiesQueryKey< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, +> = ReturnType> + +export type GetCapabilitiesQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined = undefined, + selectData = GetCapabilitiesData, +> = QueryOptions< + GetCapabilitiesQueryFnData, + GetCapabilitiesErrorType, + selectData, + GetCapabilitiesQueryKey +> diff --git a/packages/core/src/query/getConnectorClient.test-d.ts b/packages/core/src/query/getConnectorClient.test-d.ts new file mode 100644 index 0000000000..3bc28b0e1a --- /dev/null +++ b/packages/core/src/query/getConnectorClient.test-d.ts @@ -0,0 +1,23 @@ +import { chain, config } from '@wagmi/test' +import { expectTypeOf, test } from 'vitest' + +import { getConnectorClientQueryOptions } from './getConnectorClient.js' + +const context = {} as any + +test('default', async () => { + const options = getConnectorClientQueryOptions(config) + const client = await options.queryFn(context) + expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>() + expectTypeOf(client.transport.type).toEqualTypeOf<'http'>() +}) + +test('parameters: chainId', async () => { + const options = getConnectorClientQueryOptions(config, { + chainId: chain.mainnet.id, + }) + const client = await options.queryFn(context) + expectTypeOf(client.chain).toEqualTypeOf() + expectTypeOf(client.chain).not.toEqualTypeOf() + expectTypeOf(client.transport.type).toEqualTypeOf<'http'>() +}) diff --git a/packages/core/src/query/getConnectorClient.test.ts b/packages/core/src/query/getConnectorClient.test.ts index fdec57969d..d646511d2e 100644 --- a/packages/core/src/query/getConnectorClient.test.ts +++ b/packages/core/src/query/getConnectorClient.test.ts @@ -6,14 +6,14 @@ import { getConnectorClientQueryOptions } from './getConnectorClient.js' test('default', () => { expect(getConnectorClientQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "gcTime": 0, "queryFn": [Function], "queryKey": [ "connectorClient", - { - "connectorUid": undefined, - }, + {}, ], + "staleTime": Infinity, } `) }) @@ -23,15 +23,16 @@ test('parameters: chainId', () => { getConnectorClientQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "gcTime": 0, "queryFn": [Function], "queryKey": [ "connectorClient", { "chainId": 1, - "connectorUid": undefined, }, ], + "staleTime": Infinity, } `) }) diff --git a/packages/core/src/query/getConnectorClient.ts b/packages/core/src/query/getConnectorClient.ts index 7bc65029f0..644d9b475e 100644 --- a/packages/core/src/query/getConnectorClient.ts +++ b/packages/core/src/query/getConnectorClient.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetConnectorClientErrorType, type GetConnectorClientParameters, @@ -8,38 +6,53 @@ import { } from '../actions/getConnectorClient.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetConnectorClientOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetConnectorClientData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + Omit< + QueryParameter< + GetConnectorClientQueryFnData, + GetConnectorClientErrorType, + selectData, + GetConnectorClientQueryKey + >, + 'gcTime' | 'staleTime' + > export function getConnectorClientQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetConnectorClientOptions = {}) { + selectData = GetConnectorClientData, +>( + config: config, + options: GetConnectorClientOptions = {}, +): GetConnectorClientQueryOptions { return { + ...options.query, + enabled: Boolean( + options.connector?.getProvider && (options.query?.enabled ?? true), + ), gcTime: 0, - async queryFn({ queryKey }) { - const { connector } = options - const { connectorUid: _, scopeKey: _s, ...parameters } = queryKey[1] + queryFn: async (context) => { + const [, { connectorUid: _, scopeKey: __, ...parameters }] = + context.queryKey return getConnectorClient(config, { ...parameters, - connector, + connector: options.connector, }) as unknown as Promise> }, queryKey: getConnectorClientQueryKey(options), - } as const satisfies QueryOptions< - GetConnectorClientQueryFnData, - GetConnectorClientErrorType, - GetConnectorClientData, - GetConnectorClientQueryKey - > + staleTime: Number.POSITIVE_INFINITY, + } } export type GetConnectorClientQueryFnData< @@ -55,15 +68,27 @@ export type GetConnectorClientData< export function getConnectorClientQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetConnectorClientOptions = {}) { - const { connector, ...parameters } = options - return [ - 'connectorClient', - { ...filterQueryOptions(parameters), connectorUid: connector?.uid }, - ] as const +>( + options: Compute< + ExactPartial> & + ScopeKeyParameter + > = {}, +) { + return ['connectorClient', filterQueryOptions(options)] as const } export type GetConnectorClientQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetConnectorClientQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetConnectorClientData, +> = QueryOptions< + GetConnectorClientQueryFnData, + GetConnectorClientErrorType, + selectData, + GetConnectorClientQueryKey +> diff --git a/packages/core/src/query/getEnsAddress.test.ts b/packages/core/src/query/getEnsAddress.test.ts index 0e88461e61..4829414e41 100644 --- a/packages/core/src/query/getEnsAddress.test.ts +++ b/packages/core/src/query/getEnsAddress.test.ts @@ -6,6 +6,7 @@ import { getEnsAddressQueryOptions } from './getEnsAddress.js' test('default', () => { expect(getEnsAddressQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensAddress", @@ -20,6 +21,7 @@ test('parameters: chainId', () => { getEnsAddressQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensAddress", diff --git a/packages/core/src/query/getEnsAddress.ts b/packages/core/src/query/getEnsAddress.ts index 7f18c9dd63..e035ed41a0 100644 --- a/packages/core/src/query/getEnsAddress.ts +++ b/packages/core/src/query/getEnsAddress.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetEnsAddressErrorType, type GetEnsAddressParameters, @@ -8,30 +6,38 @@ import { } from '../actions/getEnsAddress.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetEnsAddressOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetEnsAddressOptions< + config extends Config, + selectData = GetEnsAddressData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetEnsAddressQueryFnData, + GetEnsAddressErrorType, + selectData, + GetEnsAddressQueryKey + > -export function getEnsAddressQueryOptions( +export function getEnsAddressQueryOptions< + config extends Config, + selectData = GetEnsAddressData, +>( config: config, - options: GetEnsAddressOptions = {}, -) { + options: GetEnsAddressOptions = {}, +): GetEnsAddressQueryOptions { return { - async queryFn({ queryKey }) { - const { name, scopeKey: _, ...parameters } = queryKey[1] - if (!name) throw new Error('name is required') - return getEnsAddress(config, { ...parameters, name }) + ...options.query, + enabled: Boolean(options.name && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.name) throw new Error('name is required') + return getEnsAddress(config, { ...parameters, name: parameters.name }) }, queryKey: getEnsAddressQueryKey(options), - } as const satisfies QueryOptions< - GetEnsAddressQueryFnData, - GetEnsAddressErrorType, - GetEnsAddressData, - GetEnsAddressQueryKey - > + } } export type GetEnsAddressQueryFnData = GetEnsAddressReturnType @@ -39,7 +45,9 @@ export type GetEnsAddressQueryFnData = GetEnsAddressReturnType export type GetEnsAddressData = GetEnsAddressQueryFnData export function getEnsAddressQueryKey( - options: GetEnsAddressOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['ensAddress', filterQueryOptions(options)] as const } @@ -47,3 +55,13 @@ export function getEnsAddressQueryKey( export type GetEnsAddressQueryKey = ReturnType< typeof getEnsAddressQueryKey > + +export type GetEnsAddressQueryOptions< + config extends Config, + selectData = GetEnsAddressData, +> = QueryOptions< + GetEnsAddressQueryFnData, + GetEnsAddressErrorType, + selectData, + GetEnsAddressQueryKey +> diff --git a/packages/core/src/query/getEnsAvatar.test.ts b/packages/core/src/query/getEnsAvatar.test.ts index 8b62526426..8a9bbd27d1 100644 --- a/packages/core/src/query/getEnsAvatar.test.ts +++ b/packages/core/src/query/getEnsAvatar.test.ts @@ -6,6 +6,7 @@ import { getEnsAvatarQueryOptions } from './getEnsAvatar.js' test('default', () => { expect(getEnsAvatarQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensAvatar", @@ -20,6 +21,7 @@ test('parameters: chainId', () => { getEnsAvatarQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensAvatar", diff --git a/packages/core/src/query/getEnsAvatar.ts b/packages/core/src/query/getEnsAvatar.ts index f399736e08..f9144e2413 100644 --- a/packages/core/src/query/getEnsAvatar.ts +++ b/packages/core/src/query/getEnsAvatar.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetEnsAvatarErrorType, type GetEnsAvatarParameters, @@ -8,30 +6,38 @@ import { } from '../actions/getEnsAvatar.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetEnsAvatarOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetEnsAvatarOptions< + config extends Config, + selectData = GetEnsAvatarData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetEnsAvatarQueryFnData, + GetEnsAvatarErrorType, + selectData, + GetEnsAvatarQueryKey + > -export function getEnsAvatarQueryOptions( +export function getEnsAvatarQueryOptions< + config extends Config, + selectData = GetEnsAvatarData, +>( config: config, - options: GetEnsAvatarOptions = {}, -) { + options: GetEnsAvatarOptions = {}, +): GetEnsAvatarQueryOptions { return { - async queryFn({ queryKey }) { - const { name, scopeKey: _, ...parameters } = queryKey[1] - if (!name) throw new Error('name is required') - return getEnsAvatar(config, { ...parameters, name }) + ...options.query, + enabled: Boolean(options.name && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.name) throw new Error('name is required') + return getEnsAvatar(config, { ...parameters, name: parameters.name }) }, queryKey: getEnsAvatarQueryKey(options), - } as const satisfies QueryOptions< - GetEnsAvatarQueryFnData, - GetEnsAvatarErrorType, - GetEnsAvatarData, - GetEnsAvatarQueryKey - > + } } export type GetEnsAvatarQueryFnData = GetEnsAvatarReturnType @@ -39,7 +45,9 @@ export type GetEnsAvatarQueryFnData = GetEnsAvatarReturnType export type GetEnsAvatarData = GetEnsAvatarQueryFnData export function getEnsAvatarQueryKey( - options: GetEnsAvatarOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['ensAvatar', filterQueryOptions(options)] as const } @@ -47,3 +55,13 @@ export function getEnsAvatarQueryKey( export type GetEnsAvatarQueryKey = ReturnType< typeof getEnsAvatarQueryKey > + +export type GetEnsAvatarQueryOptions< + config extends Config, + selectData = GetEnsAvatarData, +> = QueryOptions< + GetEnsAvatarQueryFnData, + GetEnsAvatarErrorType, + selectData, + GetEnsAvatarQueryKey +> diff --git a/packages/core/src/query/getEnsName.test.ts b/packages/core/src/query/getEnsName.test.ts index 006c76a12d..35a76777ec 100644 --- a/packages/core/src/query/getEnsName.test.ts +++ b/packages/core/src/query/getEnsName.test.ts @@ -6,6 +6,7 @@ import { getEnsNameQueryOptions } from './getEnsName.js' test('default', () => { expect(getEnsNameQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensName", @@ -20,6 +21,7 @@ test('parameters: chainId', () => { getEnsNameQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensName", diff --git a/packages/core/src/query/getEnsName.ts b/packages/core/src/query/getEnsName.ts index cff1534e07..80c6edc2e5 100644 --- a/packages/core/src/query/getEnsName.ts +++ b/packages/core/src/query/getEnsName.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetEnsNameErrorType, type GetEnsNameParameters, @@ -8,30 +6,38 @@ import { } from '../actions/getEnsName.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetEnsNameOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetEnsNameOptions< + config extends Config, + selectData = GetEnsNameData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetEnsNameQueryFnData, + GetEnsNameErrorType, + selectData, + GetEnsNameQueryKey + > -export function getEnsNameQueryOptions( +export function getEnsNameQueryOptions< + config extends Config, + selectData = GetEnsNameData, +>( config: config, - options: GetEnsNameOptions = {}, -) { + options: GetEnsNameOptions = {}, +): GetEnsNameQueryOptions { return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, ...parameters } = queryKey[1] - if (!address) throw new Error('address is required') - return getEnsName(config, { ...parameters, address }) + ...options.query, + enabled: Boolean(options.address && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') + return getEnsName(config, { ...parameters, address: parameters.address }) }, queryKey: getEnsNameQueryKey(options), - } as const satisfies QueryOptions< - GetEnsNameQueryFnData, - GetEnsNameErrorType, - GetEnsNameData, - GetEnsNameQueryKey - > + } } export type GetEnsNameQueryFnData = GetEnsNameReturnType @@ -39,7 +45,9 @@ export type GetEnsNameQueryFnData = GetEnsNameReturnType export type GetEnsNameData = GetEnsNameQueryFnData export function getEnsNameQueryKey( - options: GetEnsNameOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['ensName', filterQueryOptions(options)] as const } @@ -47,3 +55,13 @@ export function getEnsNameQueryKey( export type GetEnsNameQueryKey = ReturnType< typeof getEnsNameQueryKey > + +export type GetEnsNameQueryOptions< + config extends Config, + selectData = GetEnsNameData, +> = QueryOptions< + GetEnsNameQueryFnData, + GetEnsNameErrorType, + selectData, + GetEnsNameQueryKey +> diff --git a/packages/core/src/query/getEnsResolver.test.ts b/packages/core/src/query/getEnsResolver.test.ts index 36baf9ba90..cf413585ec 100644 --- a/packages/core/src/query/getEnsResolver.test.ts +++ b/packages/core/src/query/getEnsResolver.test.ts @@ -6,6 +6,7 @@ import { getEnsResolverQueryOptions } from './getEnsResolver.js' test('default', () => { expect(getEnsResolverQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensResolver", @@ -20,6 +21,7 @@ test('parameters: chainId', () => { getEnsResolverQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "ensResolver", diff --git a/packages/core/src/query/getEnsResolver.ts b/packages/core/src/query/getEnsResolver.ts index 124499325d..704660843d 100644 --- a/packages/core/src/query/getEnsResolver.ts +++ b/packages/core/src/query/getEnsResolver.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetEnsResolverErrorType, type GetEnsResolverParameters, @@ -8,30 +6,40 @@ import { } from '../actions/getEnsResolver.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetEnsResolverOptions = Compute< +export type GetEnsResolverOptions< + config extends Config, + selectData = GetEnsResolverData, +> = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetEnsResolverQueryFnData, + GetEnsResolverErrorType, + selectData, + GetEnsResolverQueryKey + > -export function getEnsResolverQueryOptions( +export function getEnsResolverQueryOptions< + config extends Config, + selectData = GetEnsResolverData, +>( config: config, - options: GetEnsResolverOptions = {}, -) { + options: GetEnsResolverOptions = {}, +): GetEnsResolverQueryOptions { return { - async queryFn({ queryKey }) { - const { name, scopeKey: _, ...parameters } = queryKey[1] - if (!name) throw new Error('name is required') - return getEnsResolver(config, { ...parameters, name }) + ...options.query, + enabled: Boolean(options.name && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.name) throw new Error('name is required') + return getEnsResolver(config, { ...parameters, name: parameters.name }) }, queryKey: getEnsResolverQueryKey(options), - } as const satisfies QueryOptions< - GetEnsResolverQueryFnData, - GetEnsResolverErrorType, - GetEnsResolverData, - GetEnsResolverQueryKey - > + } } export type GetEnsResolverQueryFnData = GetEnsResolverReturnType @@ -39,7 +47,9 @@ export type GetEnsResolverQueryFnData = GetEnsResolverReturnType export type GetEnsResolverData = GetEnsResolverQueryFnData export function getEnsResolverQueryKey( - options: GetEnsResolverOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['ensResolver', filterQueryOptions(options)] as const } @@ -47,3 +57,13 @@ export function getEnsResolverQueryKey( export type GetEnsResolverQueryKey = ReturnType< typeof getEnsResolverQueryKey > + +export type GetEnsResolverQueryOptions< + config extends Config, + selectData = GetEnsResolverData, +> = QueryOptions< + GetEnsResolverQueryFnData, + GetEnsResolverErrorType, + selectData, + GetEnsResolverQueryKey +> diff --git a/packages/core/src/query/getEnsText.test.ts b/packages/core/src/query/getEnsText.test.ts index 1370410633..d11baffe76 100644 --- a/packages/core/src/query/getEnsText.test.ts +++ b/packages/core/src/query/getEnsText.test.ts @@ -11,6 +11,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "ensText", @@ -32,6 +33,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "ensText", diff --git a/packages/core/src/query/getEnsText.ts b/packages/core/src/query/getEnsText.ts index 2f1c464dea..94054f82b3 100644 --- a/packages/core/src/query/getEnsText.ts +++ b/packages/core/src/query/getEnsText.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetEnsTextErrorType, type GetEnsTextParameters, @@ -8,30 +6,45 @@ import { } from '../actions/getEnsText.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetEnsTextOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetEnsTextOptions< + config extends Config, + selectData = GetEnsTextData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetEnsTextQueryFnData, + GetEnsTextErrorType, + selectData, + GetEnsTextQueryKey + > -export function getEnsTextQueryOptions( +export function getEnsTextQueryOptions< + config extends Config, + selectData = GetEnsTextData, +>( config: config, - options: GetEnsTextOptions = {}, -) { + options: GetEnsTextOptions = {}, +): GetEnsTextQueryOptions { return { - async queryFn({ queryKey }) { - const { key, name, scopeKey: _, ...parameters } = queryKey[1] - if (!key || !name) throw new Error('key and name are required') - return getEnsText(config, { ...parameters, key, name }) + ...options.query, + enabled: Boolean( + options.key && options.name && (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.key || !parameters.name) + throw new Error('key and name are required') + return getEnsText(config, { + ...parameters, + key: parameters.key, + name: parameters.name, + }) }, queryKey: getEnsTextQueryKey(options), - } as const satisfies QueryOptions< - GetEnsTextQueryFnData, - GetEnsTextErrorType, - GetEnsTextData, - GetEnsTextQueryKey - > + } } export type GetEnsTextQueryFnData = GetEnsTextReturnType @@ -39,7 +52,9 @@ export type GetEnsTextQueryFnData = GetEnsTextReturnType export type GetEnsTextData = GetEnsTextQueryFnData export function getEnsTextQueryKey( - options: GetEnsTextOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['ensText', filterQueryOptions(options)] as const } @@ -47,3 +62,13 @@ export function getEnsTextQueryKey( export type GetEnsTextQueryKey = ReturnType< typeof getEnsTextQueryKey > + +export type GetEnsTextQueryOptions< + config extends Config, + selectData = GetEnsTextData, +> = QueryOptions< + GetEnsTextQueryFnData, + GetEnsTextErrorType, + selectData, + GetEnsTextQueryKey +> diff --git a/packages/core/src/query/getFeeHistory.test.ts b/packages/core/src/query/getFeeHistory.test.ts index aa40793235..9f4e170f9b 100644 --- a/packages/core/src/query/getFeeHistory.test.ts +++ b/packages/core/src/query/getFeeHistory.test.ts @@ -11,6 +11,7 @@ test('default', async () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "feeHistory", @@ -35,6 +36,7 @@ test('parameters: chainId', async () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "feeHistory", @@ -60,6 +62,7 @@ test('parameters: blockNumber', async () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "feeHistory", @@ -85,6 +88,7 @@ test('parameters: blockTag', async () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "feeHistory", @@ -103,7 +107,7 @@ test('parameters: blockTag', async () => { test('behavior: blockCount is required', async () => { const options = getFeeHistoryQueryOptions(config, {}) - expect( + await expect( options.queryFn({ queryKey: options.queryKey, signal: new AbortSignal(), @@ -116,7 +120,7 @@ test('behavior: blockCount is required', async () => { test('behavior: rewardPercentiles is required', async () => { const options = getFeeHistoryQueryOptions(config, { blockCount: 4 }) - expect( + await expect( options.queryFn({ queryKey: options.queryKey, signal: new AbortSignal(), diff --git a/packages/core/src/query/getFeeHistory.ts b/packages/core/src/query/getFeeHistory.ts index 6eeef0d681..cedea19156 100644 --- a/packages/core/src/query/getFeeHistory.ts +++ b/packages/core/src/query/getFeeHistory.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetFeeHistoryErrorType, type GetFeeHistoryParameters, @@ -8,48 +6,53 @@ import { } from '../actions/getFeeHistory.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' -import type { Compute, PartialBy } from '../types/utils.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetFeeHistoryOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetFeeHistoryData, > = Compute< - PartialBy< - GetFeeHistoryParameters, - 'blockCount' | 'rewardPercentiles' - > & - ScopeKeyParameter -> + ExactPartial> & ScopeKeyParameter +> & + QueryParameter< + GetFeeHistoryQueryFnData, + GetFeeHistoryErrorType, + selectData, + GetFeeHistoryQueryKey + > export function getFeeHistoryQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetFeeHistoryOptions = {}) { + selectData = GetFeeHistoryData, +>( + config: config, + options: GetFeeHistoryOptions = {}, +): GetFeeHistoryQueryOptions { return { - async queryFn({ queryKey }) { - const { - blockCount, - rewardPercentiles, - scopeKey: _, - ...parameters - } = queryKey[1] - if (!blockCount) throw new Error('blockCount is required') - if (!rewardPercentiles) throw new Error('rewardPercentiles is required') + ...options.query, + enabled: Boolean( + options.blockCount && + options.rewardPercentiles && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.blockCount) throw new Error('blockCount is required') + if (!parameters.rewardPercentiles) + throw new Error('rewardPercentiles is required') const feeHistory = await getFeeHistory(config, { ...(parameters as GetFeeHistoryParameters), - blockCount, - rewardPercentiles, + blockCount: parameters.blockCount, + rewardPercentiles: parameters.rewardPercentiles, }) return feeHistory ?? null }, queryKey: getFeeHistoryQueryKey(options), - } as const satisfies QueryOptions< - GetFeeHistoryQueryFnData, - GetFeeHistoryErrorType, - GetFeeHistoryData, - GetFeeHistoryQueryKey - > + } } export type GetFeeHistoryQueryFnData = GetFeeHistoryReturnType @@ -59,7 +62,11 @@ export type GetFeeHistoryData = GetFeeHistoryQueryFnData export function getFeeHistoryQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetFeeHistoryOptions = {}) { +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { return ['feeHistory', filterQueryOptions(options)] as const } @@ -67,3 +74,14 @@ export type GetFeeHistoryQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetFeeHistoryQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetFeeHistoryData, +> = QueryOptions< + GetFeeHistoryQueryFnData, + GetFeeHistoryErrorType, + selectData, + GetFeeHistoryQueryKey +> diff --git a/packages/core/src/query/getGasPrice.ts b/packages/core/src/query/getGasPrice.ts index 153d4a102d..881aaf92d9 100644 --- a/packages/core/src/query/getGasPrice.ts +++ b/packages/core/src/query/getGasPrice.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetGasPriceErrorType, type GetGasPriceParameters, @@ -8,33 +6,41 @@ import { } from '../actions/getGasPrice.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetGasPriceOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetGasPriceData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetGasPriceQueryFnData, + GetGasPriceErrorType, + selectData, + GetGasPriceQueryKey + > export function getGasPriceQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetGasPriceOptions = {}) { + selectData = GetGasPriceData, +>( + config: config, + options: GetGasPriceOptions = {}, +): GetGasPriceQueryOptions { return { - async queryFn({ queryKey }) { - const { scopeKey: _, ...parameters } = queryKey[1] + ...options.query, + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey const gasPrice = await getGasPrice(config, parameters) return gasPrice ?? null }, queryKey: getGasPriceQueryKey(options), - } as const satisfies QueryOptions< - GetGasPriceQueryFnData, - GetGasPriceErrorType, - GetGasPriceData, - GetGasPriceQueryKey - > + } } export type GetGasPriceQueryFnData = GetGasPriceReturnType @@ -44,7 +50,11 @@ export type GetGasPriceData = GetGasPriceQueryFnData export function getGasPriceQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetGasPriceOptions = {}) { +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { return ['gasPrice', filterQueryOptions(options)] as const } @@ -52,3 +62,14 @@ export type GetGasPriceQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetGasPriceQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetGasPriceData, +> = QueryOptions< + GetGasPriceQueryFnData, + GetGasPriceErrorType, + selectData, + GetGasPriceQueryKey +> diff --git a/packages/core/src/query/getProof.test.ts b/packages/core/src/query/getProof.test.ts index 30c02256c7..01dd639ecb 100644 --- a/packages/core/src/query/getProof.test.ts +++ b/packages/core/src/query/getProof.test.ts @@ -13,6 +13,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getProof", @@ -38,6 +39,7 @@ test('parameters: blockNumber', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getProof", @@ -64,6 +66,7 @@ test('parameters: blockTag', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getProof", @@ -90,6 +93,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getProof", diff --git a/packages/core/src/query/getProof.ts b/packages/core/src/query/getProof.ts index 8da0b42b17..6d2ea71880 100644 --- a/packages/core/src/query/getProof.ts +++ b/packages/core/src/query/getProof.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetProofErrorType, type GetProofParameters, @@ -8,31 +6,47 @@ import { } from '../actions/getProof.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetProofOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetProofOptions< + config extends Config, + selectData = GetProofData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetProofQueryFnData, + GetProofErrorType, + selectData, + GetProofQueryKey + > -export function getProofQueryOptions( +export function getProofQueryOptions< + config extends Config, + selectData = GetProofData, +>( config: config, - options: GetProofOptions = {}, -) { + options: GetProofOptions = {}, +): GetProofQueryOptions { return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, storageKeys, ...parameters } = queryKey[1] - if (!address || !storageKeys) + ...options.query, + enabled: Boolean( + options.address && + options.storageKeys && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address || !parameters.storageKeys) throw new Error('address and storageKeys are required') - return getProof(config, { ...parameters, address, storageKeys }) + return getProof(config, { + ...(parameters as GetProofParameters), + address: parameters.address, + storageKeys: parameters.storageKeys, + }) }, queryKey: getProofQueryKey(options), - } as const satisfies QueryOptions< - GetProofQueryFnData, - GetProofErrorType, - GetProofData, - GetProofQueryKey - > + } } export type GetProofQueryFnData = GetProofReturnType @@ -40,7 +54,9 @@ export type GetProofQueryFnData = GetProofReturnType export type GetProofData = GetProofQueryFnData export function getProofQueryKey( - options: GetProofOptions, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['getProof', filterQueryOptions(options)] as const } @@ -48,3 +64,13 @@ export function getProofQueryKey( export type GetProofQueryKey = ReturnType< typeof getProofQueryKey > + +export type GetProofQueryOptions< + config extends Config, + selectData = GetProofData, +> = QueryOptions< + GetProofQueryFnData, + GetProofErrorType, + selectData, + GetProofQueryKey +> diff --git a/packages/core/src/query/getStorageAt.test.ts b/packages/core/src/query/getStorageAt.test.ts index 87193c1e6f..f4e948a4fa 100644 --- a/packages/core/src/query/getStorageAt.test.ts +++ b/packages/core/src/query/getStorageAt.test.ts @@ -11,6 +11,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getStorageAt", @@ -32,6 +33,7 @@ test('parameters: blockNumber', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getStorageAt", @@ -54,6 +56,7 @@ test('parameters: blockTag', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getStorageAt", @@ -76,6 +79,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getStorageAt", diff --git a/packages/core/src/query/getStorageAt.ts b/packages/core/src/query/getStorageAt.ts index c2ed90c927..b5e9a8116f 100644 --- a/packages/core/src/query/getStorageAt.ts +++ b/packages/core/src/query/getStorageAt.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetStorageAtErrorType, type GetStorageAtParameters, @@ -8,30 +6,45 @@ import { } from '../actions/getStorageAt.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetStorageAtOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type GetStorageAtOptions< + config extends Config, + selectData = GetStorageAtData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + GetStorageAtQueryFnData, + GetStorageAtErrorType, + selectData, + GetStorageAtQueryKey + > -export function getStorageAtQueryOptions( +export function getStorageAtQueryOptions< + config extends Config, + selectData = GetStorageAtData, +>( config: config, - options: GetStorageAtOptions = {}, -) { + options: GetStorageAtOptions = {}, +): GetStorageAtQueryOptions { return { - queryFn({ queryKey }) { - const { address, slot, scopeKey: _, ...parameters } = queryKey[1] - if (!address || !slot) throw new Error('address and slot are required') - return getStorageAt(config, { ...parameters, address, slot }) + ...options.query, + enabled: Boolean( + options.address && options.slot && (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address || !parameters.slot) + throw new Error('address and slot are required') + return getStorageAt(config, { + ...(parameters as GetStorageAtParameters), + address: parameters.address, + slot: parameters.slot, + }) }, queryKey: getStorageAtQueryKey(options), - } as const satisfies QueryOptions< - GetStorageAtQueryFnData, - GetStorageAtErrorType, - GetStorageAtData, - GetStorageAtQueryKey - > + } } export type GetStorageAtQueryFnData = GetStorageAtReturnType @@ -39,7 +52,9 @@ export type GetStorageAtQueryFnData = GetStorageAtReturnType export type GetStorageAtData = GetStorageAtQueryFnData export function getStorageAtQueryKey( - options: GetStorageAtOptions, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['getStorageAt', filterQueryOptions(options)] as const } @@ -47,3 +62,13 @@ export function getStorageAtQueryKey( export type GetStorageAtQueryKey = ReturnType< typeof getStorageAtQueryKey > + +export type GetStorageAtQueryOptions< + config extends Config, + selectData = GetStorageAtData, +> = QueryOptions< + GetStorageAtQueryFnData, + GetStorageAtErrorType, + selectData, + GetStorageAtQueryKey +> diff --git a/packages/core/src/query/getToken.test.ts b/packages/core/src/query/getToken.test.ts deleted file mode 100644 index 87ec1731c9..0000000000 --- a/packages/core/src/query/getToken.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { chain, config } from '@wagmi/test' -import { expect, test } from 'vitest' - -import { getTokenQueryOptions } from './getToken.js' - -test('default', () => { - expect(getTokenQueryOptions(config)).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "token", - {}, - ], - } - `) -}) - -test('parameters: chainId', () => { - expect( - getTokenQueryOptions(config, { chainId: chain.mainnet.id }), - ).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "token", - { - "chainId": 1, - }, - ], - } - `) -}) diff --git a/packages/core/src/query/getToken.ts b/packages/core/src/query/getToken.ts deleted file mode 100644 index 8e4a2b866a..0000000000 --- a/packages/core/src/query/getToken.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { QueryOptions } from '@tanstack/query-core' - -import { - type GetTokenErrorType, - type GetTokenParameters, - type GetTokenReturnType, - getToken, -} from '../actions/getToken.js' -import type { Config } from '../createConfig.js' -import type { ScopeKeyParameter } from '../types/properties.js' -import type { Compute, ExactPartial } from '../types/utils.js' -import { filterQueryOptions } from './utils.js' - -export type GetTokenOptions = Compute< - ExactPartial> & ScopeKeyParameter -> - -export function getTokenQueryOptions( - config: config, - options: GetTokenOptions = {}, -) { - return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, ...parameters } = queryKey[1] - if (!address) throw new Error('address is required') - return getToken(config, { ...parameters, address }) - }, - queryKey: getTokenQueryKey(options), - } as const satisfies QueryOptions< - GetTokenQueryFnData, - GetTokenErrorType, - GetTokenData, - GetTokenQueryKey - > -} - -export type GetTokenQueryFnData = GetTokenReturnType - -export type GetTokenData = GetTokenQueryFnData - -export function getTokenQueryKey( - options: GetTokenOptions = {}, -) { - return ['token', filterQueryOptions(options)] as const -} - -export type GetTokenQueryKey = ReturnType< - typeof getTokenQueryKey -> diff --git a/packages/core/src/query/getTransaction.test-d.ts b/packages/core/src/query/getTransaction.test-d.ts new file mode 100644 index 0000000000..2f7451f28b --- /dev/null +++ b/packages/core/src/query/getTransaction.test-d.ts @@ -0,0 +1,37 @@ +import { http } from 'viem' +import { celo, mainnet } from 'viem/chains' +import { expectTypeOf, test } from 'vitest' + +import { createConfig } from '../createConfig.js' +import { getTransactionQueryOptions } from './getTransaction.js' + +const context = {} as any + +test('chain formatters', async () => { + const config = createConfig({ + chains: [celo, mainnet], + transports: { [celo.id]: http(), [mainnet.id]: http() }, + }) + const options = getTransactionQueryOptions(config, { + hash: '0x123', + }) + const result = await options.queryFn(context) + if (result.chainId === celo.id) { + expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>() + } + // @ts-expect-error + result.feeCurrency +}) + +test('chainId', async () => { + const config = createConfig({ + chains: [celo, mainnet], + transports: { [celo.id]: http(), [mainnet.id]: http() }, + }) + const options = getTransactionQueryOptions(config, { + hash: '0x123', + chainId: celo.id, + }) + const result = await options.queryFn(context) + expectTypeOf(result.feeCurrency).toEqualTypeOf<`0x${string}` | null>() +}) diff --git a/packages/core/src/query/getTransaction.test.ts b/packages/core/src/query/getTransaction.test.ts index e1db72b325..fd0157bd91 100644 --- a/packages/core/src/query/getTransaction.test.ts +++ b/packages/core/src/query/getTransaction.test.ts @@ -6,6 +6,7 @@ import { getTransactionQueryOptions } from './getTransaction.js' test('default', () => { expect(getTransactionQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "transaction", @@ -20,6 +21,7 @@ test('parameters: chainId', () => { getTransactionQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "transaction", diff --git a/packages/core/src/query/getTransaction.ts b/packages/core/src/query/getTransaction.ts index 8564854774..3b8c3f4387 100644 --- a/packages/core/src/query/getTransaction.ts +++ b/packages/core/src/query/getTransaction.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetTransactionErrorType, type GetTransactionParameters, @@ -8,42 +6,61 @@ import { } from '../actions/getTransaction.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetTransactionOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetTransactionData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetTransactionQueryFnData, + GetTransactionErrorType, + selectData, + GetTransactionQueryKey + > export function getTransactionQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetTransactionOptions = {}) { + selectData = GetTransactionData, +>( + config: config, + options: GetTransactionOptions = {}, +): GetTransactionQueryOptions { return { - async queryFn({ queryKey }) { - const { blockHash, blockNumber, blockTag, hash, index } = queryKey[1] - if (!blockHash && !blockNumber && !blockTag && !hash) - throw new Error('blockHash, blockNumber, blockTag, or hash is required') - if (!hash && !index) + ...options.query, + enabled: Boolean( + (options.hash || + (options.index && + (options.blockHash || options.blockNumber || options.blockTag))) && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if ( + !( + parameters.hash || + (parameters.index && + (parameters.blockHash || + parameters.blockNumber || + parameters.blockTag)) + ) + ) throw new Error( - 'index is required for blockHash, blockNumber, or blockTag', + 'hash OR index AND blockHash, blockNumber, blockTag is required', ) - const { scopeKey: _, ...rest } = queryKey[1] return getTransaction( config, - rest as GetTransactionParameters, + parameters as GetTransactionParameters, ) as unknown as Promise> }, queryKey: getTransactionQueryKey(options), - } as const satisfies QueryOptions< - GetTransactionQueryFnData, - GetTransactionErrorType, - GetTransactionData, - GetTransactionQueryKey - > + } } export type GetTransactionQueryFnData< @@ -59,7 +76,11 @@ export type GetTransactionData< export function getTransactionQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetTransactionOptions = {}) { +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { return ['transaction', filterQueryOptions(options)] as const } @@ -67,3 +88,14 @@ export type GetTransactionQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetTransactionQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetTransactionData, +> = QueryOptions< + GetTransactionQueryFnData, + GetTransactionErrorType, + selectData, + GetTransactionQueryKey +> diff --git a/packages/core/src/query/getTransactionConfirmations.test-d.ts b/packages/core/src/query/getTransactionConfirmations.test-d.ts new file mode 100644 index 0000000000..fd55578223 --- /dev/null +++ b/packages/core/src/query/getTransactionConfirmations.test-d.ts @@ -0,0 +1,84 @@ +import { config } from '@wagmi/test' +import { http } from 'viem' +import { mainnet, zkSync } from 'viem/chains' +import { test } from 'vitest' +import { createConfig } from '../createConfig.js' +import { getTransactionConfirmationsQueryOptions } from './getTransactionConfirmations.js' + +test('default', async () => { + getTransactionConfirmationsQueryOptions(config, { + transactionReceipt: { + blockHash: '0x', + blockNumber: 1n, + contractAddress: '0x', + cumulativeGasUsed: 1n, + effectiveGasPrice: 1n, + from: '0x', + gasUsed: 1n, + l1Fee: 1n, + logs: [], + logsBloom: '0x', + status: 'success', + to: '0x', + transactionHash: '0x', + transactionIndex: 1, + type: 'eip1559', + }, + }) +}) + +test('chain formatters', async () => { + const config = createConfig({ + chains: [mainnet, zkSync], + transports: { [mainnet.id]: http(), [zkSync.id]: http() }, + }) + + const transactionReceipt = { + blockHash: '0x', + blockNumber: 1n, + contractAddress: '0x', + cumulativeGasUsed: 1n, + effectiveGasPrice: 1n, + from: '0x', + gasUsed: 1n, + logsBloom: '0x', + status: 'success', + to: '0x', + transactionHash: '0x', + transactionIndex: 1, + type: 'eip1559', + } as const + + getTransactionConfirmationsQueryOptions(config, { + transactionReceipt: { + ...transactionReceipt, + l1BatchNumber: 1n, + l1BatchTxIndex: 1n, + logs: [], + l2ToL1Logs: [], + }, + }) + + getTransactionConfirmationsQueryOptions(config, { + chainId: zkSync.id, + transactionReceipt: { + ...transactionReceipt, + l1BatchNumber: 1n, + l1BatchTxIndex: 1n, + logs: [], + l2ToL1Logs: [], + }, + }) + + getTransactionConfirmationsQueryOptions(config, { + chainId: mainnet.id, + transactionReceipt: { + ...transactionReceipt, + // @ts-expect-error + l1BatchNumber: 1n, + l1BatchTxIndex: 1n, + logs: [], + l2ToL1Logs: [], + }, + }) +}) diff --git a/packages/core/src/query/getTransactionConfirmations.test.ts b/packages/core/src/query/getTransactionConfirmations.test.ts index ac4d6d4f4a..8921e8da4a 100644 --- a/packages/core/src/query/getTransactionConfirmations.test.ts +++ b/packages/core/src/query/getTransactionConfirmations.test.ts @@ -10,6 +10,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "transactionConfirmations", @@ -29,6 +30,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "transactionConfirmations", diff --git a/packages/core/src/query/getTransactionConfirmations.ts b/packages/core/src/query/getTransactionConfirmations.ts index 5c34decf37..155c2b62c9 100644 --- a/packages/core/src/query/getTransactionConfirmations.ts +++ b/packages/core/src/query/getTransactionConfirmations.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetTransactionConfirmationsErrorType, type GetTransactionConfirmationsParameters, @@ -8,6 +6,7 @@ import { } from '../actions/getTransactionConfirmations.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' @@ -16,43 +15,49 @@ export type GetTransactionConfirmationsOptions< chainId extends | config['chains'][number]['id'] | undefined = config['chains'][number]['id'], + selectData = GetTransactionConfirmationsData, > = UnionExactPartial> & - ScopeKeyParameter + ScopeKeyParameter & + QueryParameter< + GetTransactionConfirmationsQueryFnData, + GetTransactionConfirmationsErrorType, + selectData, + GetTransactionConfirmationsQueryKey + > export function getTransactionConfirmationsQueryOptions< config extends Config, chainId extends | config['chains'][number]['id'] | undefined = config['chains'][number]['id'], + selectData = GetTransactionConfirmationsData, >( config: config, - options: GetTransactionConfirmationsOptions = {} as any, -) { + options: GetTransactionConfirmationsOptions< + config, + chainId, + selectData + > = {} as any, +): GetTransactionConfirmationsQueryOptions { return { - async queryFn({ queryKey }) { - const { - hash, - transactionReceipt, - scopeKey: _, - ...parameters - } = queryKey[1] - if (!hash && !transactionReceipt) + ...options.query, + enabled: Boolean( + (options.hash || options.transactionReceipt) && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.hash && !parameters.transactionReceipt) throw new Error('hash or transactionReceipt is required') - const confirmations = await getTransactionConfirmations(config, { - hash, - transactionReceipt, ...(parameters as any), + hash: parameters.hash, + transactionReceipt: parameters.transactionReceipt, }) return confirmations ?? null }, queryKey: getTransactionConfirmationsQueryKey(options), - } as const satisfies QueryOptions< - GetTransactionConfirmationsQueryFnData, - GetTransactionConfirmationsErrorType, - GetTransactionConfirmationsData, - GetTransactionConfirmationsQueryKey - > + } } export type GetTransactionConfirmationsQueryFnData = @@ -66,7 +71,12 @@ export function getTransactionConfirmationsQueryKey< chainId extends | config['chains'][number]['id'] | undefined = config['chains'][number]['id'], ->(options: GetTransactionConfirmationsOptions = {} as any) { +>( + options: UnionExactPartial< + GetTransactionConfirmationsParameters + > & + ScopeKeyParameter = {} as any, +) { return ['transactionConfirmations', filterQueryOptions(options)] as const } @@ -76,3 +86,16 @@ export type GetTransactionConfirmationsQueryKey< | config['chains'][number]['id'] | undefined = config['chains'][number]['id'], > = ReturnType> + +export type GetTransactionConfirmationsQueryOptions< + config extends Config, + chainId extends + | config['chains'][number]['id'] + | undefined = config['chains'][number]['id'], + selectData = GetTransactionConfirmationsData, +> = QueryOptions< + GetTransactionConfirmationsQueryFnData, + GetTransactionConfirmationsErrorType, + selectData, + GetTransactionConfirmationsQueryKey +> diff --git a/packages/core/src/query/getTransactionCount.test.ts b/packages/core/src/query/getTransactionCount.test.ts index 666953629b..0686d25169 100644 --- a/packages/core/src/query/getTransactionCount.test.ts +++ b/packages/core/src/query/getTransactionCount.test.ts @@ -10,11 +10,12 @@ test('default', () => { getTransactionCountQueryOptions(config, { address }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "transactionCount", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", }, ], } @@ -28,17 +29,18 @@ test('parameters: chainId', () => { chainId: chain.mainnet.id, }), ).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "transactionCount", - { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "chainId": 1, - }, - ], - } - `) + { + "enabled": true, + "queryFn": [Function], + "queryKey": [ + "transactionCount", + { + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", + "chainId": 1, + }, + ], + } + `) }) test('parameters: blockNumber', () => { @@ -48,17 +50,18 @@ test('parameters: blockNumber', () => { blockNumber: 13677382n, }), ).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "transactionCount", - { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "blockNumber": 13677382n, - }, - ], - } - `) + { + "enabled": true, + "queryFn": [Function], + "queryKey": [ + "transactionCount", + { + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", + "blockNumber": 13677382n, + }, + ], + } + `) }) test('parameters: blockTag', () => { @@ -68,15 +71,16 @@ test('parameters: blockTag', () => { blockTag: 'earliest', }), ).toMatchInlineSnapshot(` - { - "queryFn": [Function], - "queryKey": [ - "transactionCount", - { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "blockTag": "earliest", - }, - ], - } - `) + { + "enabled": true, + "queryFn": [Function], + "queryKey": [ + "transactionCount", + { + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", + "blockTag": "earliest", + }, + ], + } + `) }) diff --git a/packages/core/src/query/getTransactionCount.ts b/packages/core/src/query/getTransactionCount.ts index 31fd2c1d8f..0dcffa34d4 100644 --- a/packages/core/src/query/getTransactionCount.ts +++ b/packages/core/src/query/getTransactionCount.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetTransactionCountErrorType, type GetTransactionCountParameters, @@ -8,35 +6,44 @@ import { } from '../actions/getTransactionCount.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' -import type { Compute, PartialBy } from '../types/utils.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type GetTransactionCountOptions = Compute< - PartialBy, 'address'> & - ScopeKeyParameter -> +export type GetTransactionCountOptions< + config extends Config, + selectData = GetTransactionCountData, +> = Compute< + ExactPartial> & ScopeKeyParameter +> & + QueryParameter< + GetTransactionCountQueryFnData, + GetTransactionCountErrorType, + selectData, + GetTransactionCountQueryKey + > -export function getTransactionCountQueryOptions( +export function getTransactionCountQueryOptions< + config extends Config, + selectData = GetTransactionCountData, +>( config: config, - options: GetTransactionCountOptions = {}, -) { + options: GetTransactionCountOptions = {}, +): GetTransactionCountQueryOptions { return { - async queryFn({ queryKey }) { - const { address, scopeKey: _, ...parameters } = queryKey[1] - if (!address) throw new Error('address is required') + ...options.query, + enabled: Boolean(options.address && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') const transactionCount = await getTransactionCount(config, { - ...(parameters as GetTransactionCountParameters), - address, + ...(parameters as any), + address: parameters.address, }) return transactionCount ?? null }, queryKey: getTransactionCountQueryKey(options), - } as const satisfies QueryOptions< - GetTransactionCountQueryFnData, - GetTransactionCountErrorType, - GetTransactionCountData, - GetTransactionCountQueryKey - > + } } export type GetTransactionCountQueryFnData = @@ -45,7 +52,9 @@ export type GetTransactionCountQueryFnData = export type GetTransactionCountData = GetTransactionCountQueryFnData export function getTransactionCountQueryKey( - options: GetTransactionCountOptions = {}, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['transactionCount', filterQueryOptions(options)] as const } @@ -53,3 +62,13 @@ export function getTransactionCountQueryKey( export type GetTransactionCountQueryKey = ReturnType< typeof getTransactionCountQueryKey > + +export type GetTransactionCountQueryOptions< + config extends Config, + selectData = GetTransactionCountData, +> = QueryOptions< + GetTransactionCountQueryFnData, + GetTransactionCountErrorType, + selectData, + GetTransactionCountQueryKey +> diff --git a/packages/core/src/query/getTransactionReceipt.test-d.ts b/packages/core/src/query/getTransactionReceipt.test-d.ts new file mode 100644 index 0000000000..3f19b71fd0 --- /dev/null +++ b/packages/core/src/query/getTransactionReceipt.test-d.ts @@ -0,0 +1,42 @@ +import { http } from 'viem' +import { mainnet, zkSync } from 'viem/chains' +import type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync' +import { expectTypeOf, test } from 'vitest' + +import { createConfig } from '../createConfig.js' +import { getTransactionReceiptQueryOptions } from './getTransactionReceipt.js' + +const context = {} as any + +test('chain formatters', async () => { + const config = createConfig({ + chains: [mainnet, zkSync], + transports: { [mainnet.id]: http(), [zkSync.id]: http() }, + }) + const options = getTransactionReceiptQueryOptions(config, { hash: '0x123' }) + const result = await options.queryFn(context) + if (result.chainId === zkSync.id) { + expectTypeOf(result.l1BatchNumber).toEqualTypeOf() + expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf() + expectTypeOf(result.logs).toEqualTypeOf() + expectTypeOf(result.l2ToL1Logs).toEqualTypeOf() + } + // @ts-expect-error + result.l1BatchNumber +}) + +test('chainId', async () => { + const config = createConfig({ + chains: [zkSync], + transports: { [zkSync.id]: http() }, + }) + const options = getTransactionReceiptQueryOptions(config, { + hash: '0x123', + chainId: zkSync.id, + }) + const result = await options.queryFn(context) + expectTypeOf(result.l1BatchNumber).toEqualTypeOf() + expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf() + expectTypeOf(result.logs).toEqualTypeOf() + expectTypeOf(result.l2ToL1Logs).toEqualTypeOf() +}) diff --git a/packages/core/src/query/getTransactionReceipt.test.ts b/packages/core/src/query/getTransactionReceipt.test.ts index 7c719b8d87..6bef2b857a 100644 --- a/packages/core/src/query/getTransactionReceipt.test.ts +++ b/packages/core/src/query/getTransactionReceipt.test.ts @@ -10,6 +10,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getTransactionReceipt", @@ -29,6 +30,7 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "getTransactionReceipt", diff --git a/packages/core/src/query/getTransactionReceipt.ts b/packages/core/src/query/getTransactionReceipt.ts index 0d7d559d49..8d09442d7d 100644 --- a/packages/core/src/query/getTransactionReceipt.ts +++ b/packages/core/src/query/getTransactionReceipt.ts @@ -1,42 +1,53 @@ -import type { QueryOptions } from '@tanstack/query-core' - +import type { GetTransactionReceiptReturnType } from '../actions/getTransactionReceipt.js' import { type GetTransactionReceiptErrorType, type GetTransactionReceiptParameters, getTransactionReceipt, } from '../actions/getTransactionReceipt.js' -import type { GetTransactionReceiptReturnType } from '../actions/getTransactionReceipt.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetTransactionReceiptOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetTransactionReceiptData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetTransactionReceiptQueryFnData, + GetTransactionReceiptErrorType, + selectData, + GetTransactionReceiptQueryKey + > export function getTransactionReceiptQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetTransactionReceiptOptions = {}) { + selectData = GetTransactionReceiptData, +>( + config: config, + options: GetTransactionReceiptOptions = {}, +): GetTransactionReceiptQueryOptions { return { - queryFn({ queryKey }) { - const { hash, scopeKey: _, ...parameters } = queryKey[1] - if (!hash) throw new Error('hash is required') - return getTransactionReceipt(config, { ...parameters, hash }) + ...options.query, + enabled: Boolean(options.hash && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.hash) throw new Error('hash is required') + return getTransactionReceipt(config, { + ...(parameters as any), + hash: parameters.hash, + }) }, queryKey: getTransactionReceiptQueryKey(options), - } as const satisfies QueryOptions< - GetTransactionReceiptQueryFnData, - GetTransactionReceiptErrorType, - GetTransactionReceiptData, - GetTransactionReceiptQueryKey - > + } } + export type GetTransactionReceiptQueryFnData< config extends Config, chainId extends config['chains'][number]['id'], @@ -50,7 +61,12 @@ export type GetTransactionReceiptData< export function getTransactionReceiptQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetTransactionReceiptOptions) { +>( + options: Compute< + ExactPartial> & + ScopeKeyParameter + > = {}, +) { return ['getTransactionReceipt', filterQueryOptions(options)] as const } @@ -58,3 +74,14 @@ export type GetTransactionReceiptQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetTransactionReceiptQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetTransactionReceiptData, +> = QueryOptions< + GetTransactionReceiptQueryFnData, + GetTransactionReceiptErrorType, + selectData, + GetTransactionReceiptQueryKey +> diff --git a/packages/core/src/query/getWalletClient.test-d.ts b/packages/core/src/query/getWalletClient.test-d.ts new file mode 100644 index 0000000000..7b8b5c0018 --- /dev/null +++ b/packages/core/src/query/getWalletClient.test-d.ts @@ -0,0 +1,23 @@ +import { chain, config } from '@wagmi/test' +import { expectTypeOf, test } from 'vitest' + +import { getWalletClientQueryOptions } from './getWalletClient.js' + +const context = {} as any + +test('default', async () => { + const options = getWalletClientQueryOptions(config) + const client = await options.queryFn(context) + expectTypeOf(client.chain).toEqualTypeOf<(typeof config)['chains'][number]>() + expectTypeOf(client.transport.type).toEqualTypeOf<'http'>() +}) + +test('parameters: chainId', async () => { + const options = getWalletClientQueryOptions(config, { + chainId: chain.mainnet.id, + }) + const client = await options.queryFn(context) + expectTypeOf(client.chain).toEqualTypeOf() + expectTypeOf(client.chain).not.toEqualTypeOf() + expectTypeOf(client.transport.type).toEqualTypeOf<'http'>() +}) diff --git a/packages/core/src/query/getWalletClient.test.ts b/packages/core/src/query/getWalletClient.test.ts index 899b480882..a722311c6d 100644 --- a/packages/core/src/query/getWalletClient.test.ts +++ b/packages/core/src/query/getWalletClient.test.ts @@ -6,14 +6,14 @@ import { getWalletClientQueryOptions } from './getWalletClient.js' test('default', () => { expect(getWalletClientQueryOptions(config)).toMatchInlineSnapshot(` { + "enabled": false, "gcTime": 0, "queryFn": [Function], "queryKey": [ "walletClient", - { - "connectorUid": undefined, - }, + {}, ], + "staleTime": Infinity, } `) }) @@ -23,15 +23,16 @@ test('parameters: chainId', () => { getWalletClientQueryOptions(config, { chainId: chain.mainnet.id }), ).toMatchInlineSnapshot(` { + "enabled": false, "gcTime": 0, "queryFn": [Function], "queryKey": [ "walletClient", { "chainId": 1, - "connectorUid": undefined, }, ], + "staleTime": Infinity, } `) }) diff --git a/packages/core/src/query/getWalletClient.ts b/packages/core/src/query/getWalletClient.ts index 3c64b39a07..72254b6305 100644 --- a/packages/core/src/query/getWalletClient.ts +++ b/packages/core/src/query/getWalletClient.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type GetWalletClientErrorType, type GetWalletClientParameters, @@ -8,34 +6,51 @@ import { } from '../actions/getWalletClient.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type GetWalletClientOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = GetWalletClientData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + GetWalletClientQueryFnData, + GetWalletClientErrorType, + selectData, + GetWalletClientQueryKey + > export function getWalletClientQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], ->(config: config, options: GetWalletClientOptions = {}) { + selectData = GetWalletClientData, +>( + config: config, + options: GetWalletClientOptions = {}, +): GetWalletClientQueryOptions { return { + ...options.query, + enabled: Boolean( + options.connector?.getProvider && (options.query?.enabled ?? true), + ), gcTime: 0, - async queryFn({ queryKey }) { - const { connector } = options - const { connectorUid: _, scopeKey: _s, ...parameters } = queryKey[1] - return getWalletClient(config, { ...parameters, connector }) + queryFn: async (context) => { + if (!options.connector?.getProvider) + throw new Error('connector is required') + const [, { connectorUid: _, scopeKey: __, ...parameters }] = + context.queryKey + return getWalletClient(config, { + ...parameters, + connector: options.connector, + }) as never }, queryKey: getWalletClientQueryKey(options), - } as const satisfies QueryOptions< - GetWalletClientQueryFnData, - GetWalletClientErrorType, - GetWalletClientData, - GetWalletClientQueryKey - > + staleTime: Number.POSITIVE_INFINITY, + } } export type GetWalletClientQueryFnData< @@ -51,15 +66,26 @@ export type GetWalletClientData< export function getWalletClientQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: GetWalletClientOptions = {}) { - const { connector, ...parameters } = options - return [ - 'walletClient', - { ...filterQueryOptions(parameters), connectorUid: connector?.uid }, - ] as const +>( + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, +) { + return ['walletClient', filterQueryOptions(options)] as const } export type GetWalletClientQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type GetWalletClientQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = GetWalletClientData, +> = QueryOptions< + GetWalletClientQueryFnData, + GetWalletClientErrorType, + selectData, + GetWalletClientQueryKey +> diff --git a/packages/core/src/query/infiniteReadContracts.ts b/packages/core/src/query/infiniteReadContracts.ts index 28a8d3f52a..185e011201 100644 --- a/packages/core/src/query/infiniteReadContracts.ts +++ b/packages/core/src/query/infiniteReadContracts.ts @@ -108,7 +108,7 @@ export function infiniteReadContractsQueryKey< ChainIdParameter & RequiredPageParamsParameters, ) { - const { contracts: _, query: _q, ...parameters } = options + const { contracts: _, ...parameters } = options return ['infiniteReadContracts', filterQueryOptions(parameters)] as const } diff --git a/packages/core/src/query/prepareTransactionRequest.test-d.ts b/packages/core/src/query/prepareTransactionRequest.test-d.ts new file mode 100644 index 0000000000..76e5988e4f --- /dev/null +++ b/packages/core/src/query/prepareTransactionRequest.test-d.ts @@ -0,0 +1,70 @@ +import { accounts, config } from '@wagmi/test' +import { http, parseEther } from 'viem' +import { celo, mainnet } from 'viem/chains' +import { expectTypeOf, test } from 'vitest' + +import { createConfig } from '../createConfig.js' +import { prepareTransactionRequestQueryOptions } from './prepareTransactionRequest.js' + +const context = {} as any +const targetAccount = accounts[1] + +test('default', async () => { + const options = prepareTransactionRequestQueryOptions(config, { + chainId: 1, + to: '0x', + value: parseEther('1'), + }) + const response = await options.queryFn(context) + const { nonce: _nonce, ...request } = response + request.to + request.chainId + + expectTypeOf(response.chainId).toEqualTypeOf<1>() +}) + +test('chain formatters', async () => { + const config = createConfig({ + chains: [celo, mainnet], + transports: { [celo.id]: http(), [mainnet.id]: http() }, + }) + + { + const options = prepareTransactionRequestQueryOptions(config, { + to: targetAccount, + value: parseEther('0.01'), + feeCurrency: '0x', + }) + const request = await options.queryFn(context) + if (request.chainId === celo.id) { + expectTypeOf(request.chainId).toEqualTypeOf(celo.id) + expectTypeOf(request.feeCurrency).toEqualTypeOf< + `0x${string}` | undefined + >() + } + } + + { + const options = prepareTransactionRequestQueryOptions(config, { + chainId: celo.id, + to: targetAccount, + value: parseEther('0.01'), + feeCurrency: '0x', + }) + const request = await options.queryFn(context) + expectTypeOf(request.chainId).toEqualTypeOf(celo.id) + expectTypeOf(request.feeCurrency).toEqualTypeOf<`0x${string}` | undefined>() + } + + { + const options = prepareTransactionRequestQueryOptions(config, { + chainId: mainnet.id, + to: targetAccount, + value: parseEther('0.01'), + // @ts-expect-error + feeCurrency: '0x', + }) + const request = await options.queryFn(context) + expectTypeOf(request.chainId).toEqualTypeOf(mainnet.id) + } +}) diff --git a/packages/core/src/query/prepareTransactionRequest.test.ts b/packages/core/src/query/prepareTransactionRequest.test.ts index e1a70e50b0..675063cae0 100644 --- a/packages/core/src/query/prepareTransactionRequest.test.ts +++ b/packages/core/src/query/prepareTransactionRequest.test.ts @@ -15,11 +15,12 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -38,23 +39,24 @@ test('parameters: account', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "account": { "address": "0x14791697260E4c9A71f18484C9f997B308e59325", - "experimental_signAuthorization": [Function], "nonceManager": undefined, "publicKey": "0x046655feed4d214c261e0a6b554395596f1f1476a77d999560e5a8df9b8a1a3515217e88dd05e938efdd71b2cce322bf01da96cd42087b236e8f5043157a9c068e", "sign": [Function], + "signAuthorization": [Function], "signMessage": [Function], "signTransaction": [Function], "signTypedData": [Function], "source": "privateKey", "type": "local", }, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -71,12 +73,13 @@ test('parameters: data', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "data": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -93,12 +96,13 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "chainId": 456, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -115,12 +119,13 @@ test('parameters: nonce', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "nonce": 5, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -137,12 +142,13 @@ test('parameters: gasPrice', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "gasPrice": 10000000000n, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -159,12 +165,13 @@ test('parameters: maxFeePerGas', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "maxFeePerGas": 100000000000n, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -181,12 +188,13 @@ test('parameters: maxPriorityFeePerGas', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { "maxPriorityFeePerGas": 5000000000n, - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], @@ -203,11 +211,12 @@ test('parameters: type', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", { - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "type": "eip1559", "value": 1000000000000000000n, }, @@ -225,6 +234,7 @@ test('parameters: parameters', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "prepareTransactionRequest", @@ -232,7 +242,7 @@ test('parameters: parameters', () => { "parameters": [ "gas", ], - "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "value": 1000000000000000000n, }, ], diff --git a/packages/core/src/query/prepareTransactionRequest.ts b/packages/core/src/query/prepareTransactionRequest.ts index 5ed4b419fa..774c9bb5eb 100644 --- a/packages/core/src/query/prepareTransactionRequest.ts +++ b/packages/core/src/query/prepareTransactionRequest.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import type { PrepareTransactionRequestRequest as viem_PrepareTransactionRequestRequest } from 'viem' import { @@ -11,6 +9,7 @@ import { import type { Config } from '../createConfig.js' import type { SelectChains } from '../types/chain.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' @@ -21,10 +20,17 @@ export type PrepareTransactionRequestOptions< SelectChains[0], SelectChains[0] >, + selectData = PrepareTransactionRequestData, > = UnionExactPartial< PrepareTransactionRequestParameters > & - ScopeKeyParameter + ScopeKeyParameter & + QueryParameter< + PrepareTransactionRequestQueryFnData, + PrepareTransactionRequestErrorType, + selectData, + PrepareTransactionRequestQueryKey + > export function prepareTransactionRequestQueryOptions< config extends Config, @@ -33,33 +39,35 @@ export function prepareTransactionRequestQueryOptions< SelectChains[0], SelectChains[0] >, + selectData = PrepareTransactionRequestData, >( config: config, options: PrepareTransactionRequestOptions< config, chainId, - request + request, + selectData > = {} as any, -) { +): PrepareTransactionRequestQueryOptions { return { - queryFn({ queryKey }) { - const { scopeKey: _, to, ...parameters } = queryKey[1] - if (!to) throw new Error('to is required') + ...options.query, + enabled: Boolean(options.to && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.to) throw new Error('to is required') return prepareTransactionRequest(config, { - to, ...(parameters as any), + to: parameters.to, }) as unknown as Promise< PrepareTransactionRequestQueryFnData > }, - queryKey: prepareTransactionRequestQueryKey(options), - } as const satisfies QueryOptions< - PrepareTransactionRequestQueryFnData, - PrepareTransactionRequestErrorType, - PrepareTransactionRequestData, - PrepareTransactionRequestQueryKey - > + queryKey: prepareTransactionRequestQueryKey( + options, + ) as PrepareTransactionRequestQueryKey, + } } + export type PrepareTransactionRequestQueryFnData< config extends Config, chainId extends config['chains'][number]['id'] | undefined, @@ -85,7 +93,12 @@ export function prepareTransactionRequestQueryKey< SelectChains[0], SelectChains[0] >, ->(options: PrepareTransactionRequestOptions) { +>( + options: UnionExactPartial< + PrepareTransactionRequestParameters + > & + ScopeKeyParameter = {} as any, +) { return ['prepareTransactionRequest', filterQueryOptions(options)] as const } @@ -99,3 +112,18 @@ export type PrepareTransactionRequestQueryKey< > = ReturnType< typeof prepareTransactionRequestQueryKey > + +export type PrepareTransactionRequestQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'] | undefined, + request extends viem_PrepareTransactionRequestRequest< + SelectChains[0], + SelectChains[0] + >, + selectData = PrepareTransactionRequestData, +> = QueryOptions< + PrepareTransactionRequestQueryFnData, + PrepareTransactionRequestErrorType, + selectData, + PrepareTransactionRequestQueryKey +> diff --git a/packages/core/src/query/readContract.test-d.ts b/packages/core/src/query/readContract.test-d.ts index 286b8819c7..74e9b059bd 100644 --- a/packages/core/src/query/readContract.test-d.ts +++ b/packages/core/src/query/readContract.test-d.ts @@ -1,8 +1,10 @@ import { abi, config } from '@wagmi/test' -import { expectTypeOf, test } from 'vitest' +import { assertType, expectTypeOf, test } from 'vitest' import { readContractQueryOptions } from './readContract.js' +const context = {} as any + test('default', async () => { const options = readContractQueryOptions(config, { address: '0x', @@ -10,6 +12,75 @@ test('default', async () => { functionName: 'balanceOf', args: ['0x'], }) - const result = await options.queryFn({} as any) + const result = await options.queryFn(context) + expectTypeOf(result).toEqualTypeOf() +}) + +test('overloads', async () => { + { + const options = readContractQueryOptions(config, { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + }) + const result = await options.queryFn(context) + assertType(result) + } + { + const options = readContractQueryOptions(config, { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: [], + }) + const result = await options.queryFn(context) + assertType(result) + } + { + const options = readContractQueryOptions(config, { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x'], + }) + const result = await options.queryFn(context) + assertType(result) + } + { + const options = readContractQueryOptions(config, { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x', '0x'], + }) + const result = await options.queryFn(context) + assertType<{ + foo: `0x${string}` + bar: `0x${string}` + }>(result) + } +}) + +test('deployless read (bytecode)', async () => { + const options = readContractQueryOptions(config, { + code: '0x', + abi: abi.erc20, + functionName: 'balanceOf', + args: ['0x'], + }) + const result = await options.queryFn(context) + expectTypeOf(result).toEqualTypeOf() +}) + +test('deployless read (factory)', async () => { + const options = readContractQueryOptions(config, { + address: '0x', + abi: abi.erc20, + functionName: 'balanceOf', + args: ['0x'], + factory: '0x', + factoryData: '0x', + }) + const result = await options.queryFn(context) expectTypeOf(result).toEqualTypeOf() }) diff --git a/packages/core/src/query/readContract.test.ts b/packages/core/src/query/readContract.test.ts index 6c17b849ab..a245394b0f 100644 --- a/packages/core/src/query/readContract.test.ts +++ b/packages/core/src/query/readContract.test.ts @@ -13,6 +13,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "readContract", @@ -24,6 +25,7 @@ test('default', () => { "functionName": "balanceOf", }, ], + "structuralSharing": [Function], } `) }) diff --git a/packages/core/src/query/readContract.ts b/packages/core/src/query/readContract.ts index 52c586665f..bb3eeee13b 100644 --- a/packages/core/src/query/readContract.ts +++ b/packages/core/src/query/readContract.ts @@ -1,6 +1,4 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem' - import { type ReadContractErrorType, type ReadContractParameters, @@ -9,58 +7,62 @@ import { } from '../actions/readContract.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { UnionExactPartial } from '../types/utils.js' -import { filterQueryOptions } from './utils.js' +import { filterQueryOptions, structuralSharing } from './utils.js' export type ReadContractOptions< abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs, config extends Config, + selectData = ReadContractData, > = UnionExactPartial> & - ScopeKeyParameter + ScopeKeyParameter & + QueryParameter< + ReadContractQueryFnData, + ReadContractErrorType, + selectData, + ReadContractQueryKey + > export function readContractQueryOptions< config extends Config, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, - args extends ContractFunctionArgs, + const args extends ContractFunctionArgs, + selectData = ReadContractData, >( config: config, options: ReadContractOptions = {} as any, -) { +): ReadContractQueryOptions { return { + ...options.query, + enabled: Boolean( + Boolean(options.address || ('code' in options && options.code)) && + options.abi && + options.functionName && + (options.query?.enabled ?? true), + ), // TODO: Support `signal` once Viem actions allow passthrough // https://tkdodo.eu/blog/why-you-want-react-query#bonus-cancellation - async queryFn({ queryKey }) { - const abi = options.abi as Abi - if (!abi) throw new Error('abi is required') - - const { functionName, scopeKey: _, ...parameters } = queryKey[1] - const addressOrCodeParams = (() => { - const params = queryKey[1] as unknown as ReadContractParameters - if (params.address) return { address: params.address } - if (params.code) return { code: params.code } - throw new Error('address or code is required') - })() - - if (!functionName) throw new Error('functionName is required') - - return readContract(config, { - abi, - functionName, - args: parameters.args as readonly unknown[], - ...addressOrCodeParams, - ...parameters, - }) as Promise> + queryFn: async (context) => { + if (!options.abi) throw new Error('abi is required') + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.functionName) throw new Error('functionName is required') + const result = await readContract(config, { + ...(parameters as any), + abi: options.abi, + address: parameters.address, + code: + 'code' in parameters && parameters.code ? parameters.code : undefined, + functionName: parameters.functionName, + }) + return result as ReadContractData }, queryKey: readContractQueryKey(options as any) as any, - } as const satisfies QueryOptions< - ReadContractQueryFnData, - ReadContractErrorType, - ReadContractData, - ReadContractQueryKey - > + structuralSharing, + } as ReadContractQueryOptions } export type ReadContractQueryFnData< @@ -80,9 +82,13 @@ export function readContractQueryKey< const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, args extends ContractFunctionArgs, ->(options: ReadContractOptions = {} as any) { - const { abi: _, ...rest } = options - return ['readContract', filterQueryOptions(rest)] as const +>( + options: UnionExactPartial< + ReadContractParameters + > & + ScopeKeyParameter = {} as any, +) { + return ['readContract', filterQueryOptions(options)] as const } export type ReadContractQueryKey< @@ -91,3 +97,16 @@ export type ReadContractQueryKey< args extends ContractFunctionArgs, config extends Config, > = ReturnType> + +export type ReadContractQueryOptions< + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs, + config extends Config, + selectData = ReadContractData, +> = QueryOptions< + ReadContractQueryFnData, + ReadContractErrorType, + selectData, + ReadContractQueryKey +> diff --git a/packages/core/src/query/readContracts.test-d.ts b/packages/core/src/query/readContracts.test-d.ts index b6236e191b..cb0592fcb1 100644 --- a/packages/core/src/query/readContracts.test-d.ts +++ b/packages/core/src/query/readContracts.test-d.ts @@ -1,8 +1,10 @@ import { abi, config } from '@wagmi/test' -import { expectTypeOf, test } from 'vitest' +import { assertType, expectTypeOf, test } from 'vitest' import { readContractsQueryOptions } from './readContracts.js' +const context = {} as any + test('default', async () => { const options = readContractsQueryOptions(config, { contracts: [ @@ -56,3 +58,68 @@ test('allowFailure: false', async () => { const result = await options.queryFn({} as any) expectTypeOf(result).toEqualTypeOf<[bigint, string]>() }) + +test('overloads', async () => { + { + const options = readContractsQueryOptions(config, { + allowFailure: false, + contracts: [ + { address: '0x', abi: abi.viewOverloads, functionName: 'foo' }, + ], + }) + const result = await options.queryFn(context) + assertType<[number]>(result) + } + { + const options = readContractsQueryOptions(config, { + allowFailure: false, + contracts: [ + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: [], + }, + ], + }) + const result = await options.queryFn(context) + assertType<[number]>(result) + } + { + const options = readContractsQueryOptions(config, { + allowFailure: false, + contracts: [ + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x'], + }, + ], + }) + const result = await options.queryFn(context) + assertType<[string]>(result) + } + { + const options = readContractsQueryOptions(config, { + allowFailure: false, + contracts: [ + { + address: '0x', + abi: abi.viewOverloads, + functionName: 'foo', + args: ['0x', '0x'], + }, + ], + }) + const result = await options.queryFn(context) + assertType< + [ + { + foo: `0x${string}` + bar: `0x${string}` + }, + ] + >(result) + } +}) diff --git a/packages/core/src/query/readContracts.ts b/packages/core/src/query/readContracts.ts index 96bb2163cd..5927c74714 100644 --- a/packages/core/src/query/readContracts.ts +++ b/packages/core/src/query/readContracts.ts @@ -1,17 +1,18 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { ContractFunctionParameters, MulticallParameters as viem_MulticallParameters, } from 'viem' - import { type ReadContractsErrorType, type ReadContractsReturnType, readContracts, } from '../actions/readContracts.js' import type { Config } from '../createConfig.js' -import type { ChainIdParameter } from '../types/properties.js' -import type { ScopeKeyParameter } from '../types/properties.js' +import type { + ChainIdParameter, + ScopeKeyParameter, +} from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' @@ -19,6 +20,7 @@ export type ReadContractsOptions< contracts extends readonly unknown[], allowFailure extends boolean, config extends Config, + selectData = ReadContractsData, > = ExactPartial< viem_MulticallParameters< contracts, @@ -26,39 +28,42 @@ export type ReadContractsOptions< { optional: true; properties: ChainIdParameter } > > & - ScopeKeyParameter + ScopeKeyParameter & + QueryParameter< + ReadContractsQueryFnData, + ReadContractsErrorType, + selectData, + ReadContractsQueryKey + > export function readContractsQueryOptions< config extends Config, const contracts extends readonly unknown[], allowFailure extends boolean = true, + selectData = ReadContractsData, >( config: config, - options: ReadContractsOptions & + options: ReadContractsOptions & ChainIdParameter = {}, -) { +): ReadContractsQueryOptions { return { - async queryFn({ queryKey }) { + ...options.query, + queryFn: async (context) => { const contracts: ContractFunctionParameters[] = [] - const length = queryKey[1].contracts.length + const length = context.queryKey[1].contracts.length for (let i = 0; i < length; i++) { - const contract = queryKey[1].contracts[i]! + const contract = context.queryKey[1].contracts[i]! const abi = (options.contracts?.[i] as ContractFunctionParameters).abi contracts.push({ ...contract, abi }) } - const { scopeKey: _, ...parameters } = queryKey[1] + const { scopeKey: _, ...parameters } = context.queryKey[1] return readContracts(config, { ...parameters, contracts, }) as Promise> }, queryKey: readContractsQueryKey(options), - } as const satisfies QueryOptions< - ReadContractsQueryFnData, - ReadContractsErrorType, - ReadContractsData, - ReadContractsQueryKey - > + } } export type ReadContractsQueryFnData< @@ -76,7 +81,14 @@ export function readContractsQueryKey< const contracts extends readonly unknown[], allowFailure extends boolean, >( - options: ReadContractsOptions & + options: ExactPartial< + viem_MulticallParameters< + contracts, + allowFailure, + { optional: true; properties: ChainIdParameter } + > + > & + ScopeKeyParameter & ChainIdParameter = {}, ) { const contracts = [] @@ -96,3 +108,15 @@ export type ReadContractsQueryKey< allowFailure extends boolean, config extends Config, > = ReturnType> + +export type ReadContractsQueryOptions< + contracts extends readonly unknown[], + allowFailure extends boolean, + config extends Config, + selectData = ReadContractsData, +> = QueryOptions< + ReadContractsQueryFnData, + ReadContractsErrorType, + selectData, + ReadContractsQueryKey +> diff --git a/packages/core/src/experimental/query/sendCalls.test.ts b/packages/core/src/query/sendCalls.test.ts similarity index 100% rename from packages/core/src/experimental/query/sendCalls.test.ts rename to packages/core/src/query/sendCalls.test.ts diff --git a/packages/core/src/experimental/query/sendCalls.ts b/packages/core/src/query/sendCalls.ts similarity index 71% rename from packages/core/src/experimental/query/sendCalls.ts rename to packages/core/src/query/sendCalls.ts index a28b970943..5d07b89b8f 100644 --- a/packages/core/src/experimental/query/sendCalls.ts +++ b/packages/core/src/query/sendCalls.ts @@ -1,13 +1,13 @@ import type { MutateOptions, MutationOptions } from '@tanstack/query-core' -import type { Config } from '../../createConfig.js' -import type { Compute } from '../../types/utils.js' import { type SendCallsErrorType, type SendCallsParameters, type SendCallsReturnType, sendCalls, } from '../actions/sendCalls.js' +import type { Config } from '../createConfig.js' +import type { Compute } from '../types/utils.js' export function sendCallsMutationOptions( config: config, @@ -29,18 +29,20 @@ export type SendCallsData = Compute export type SendCallsVariables< config extends Config, chainId extends config['chains'][number]['id'], -> = SendCallsParameters + calls extends readonly unknown[] = readonly unknown[], +> = SendCallsParameters export type SendCallsMutate = < + const calls extends readonly unknown[], chainId extends config['chains'][number]['id'], >( - variables: SendCallsVariables, + variables: SendCallsVariables, options?: | Compute< MutateOptions< SendCallsData, SendCallsErrorType, - Compute>, + Compute>, context > > @@ -48,15 +50,16 @@ export type SendCallsMutate = < ) => void export type SendCallsMutateAsync = < + const calls extends readonly unknown[], chainId extends config['chains'][number]['id'], >( - variables: SendCallsVariables, + variables: SendCallsVariables, options?: | Compute< MutateOptions< SendCallsData, SendCallsErrorType, - Compute>, + Compute>, context > > diff --git a/packages/core/src/query/switchAccount.test.ts b/packages/core/src/query/sendCallsSync.test.ts similarity index 55% rename from packages/core/src/query/switchAccount.test.ts rename to packages/core/src/query/sendCallsSync.test.ts index 25a7066c61..f06104de9c 100644 --- a/packages/core/src/query/switchAccount.test.ts +++ b/packages/core/src/query/sendCallsSync.test.ts @@ -1,14 +1,14 @@ import { config } from '@wagmi/test' import { expect, test } from 'vitest' -import { switchAccountMutationOptions } from './switchAccount.js' +import { sendCallsSyncMutationOptions } from './sendCallsSync.js' test('default', () => { - expect(switchAccountMutationOptions(config)).toMatchInlineSnapshot(` + expect(sendCallsSyncMutationOptions(config)).toMatchInlineSnapshot(` { "mutationFn": [Function], "mutationKey": [ - "switchAccount", + "sendCallsSync", ], } `) diff --git a/packages/core/src/query/sendCallsSync.ts b/packages/core/src/query/sendCallsSync.ts new file mode 100644 index 0000000000..cafcc03af1 --- /dev/null +++ b/packages/core/src/query/sendCallsSync.ts @@ -0,0 +1,70 @@ +import type { MutateOptions, MutationOptions } from '@tanstack/query-core' + +import { + type SendCallsSyncErrorType, + type SendCallsSyncParameters, + type SendCallsSyncReturnType, + sendCallsSync, +} from '../actions/sendCallsSync.js' +import type { Config } from '../createConfig.js' +import type { Compute } from '../types/utils.js' + +export function sendCallsSyncMutationOptions( + config: config, +) { + return { + mutationFn(variables) { + return sendCallsSync(config, variables) + }, + mutationKey: ['sendCallsSync'], + } as const satisfies MutationOptions< + SendCallsSyncData, + SendCallsSyncErrorType, + SendCallsSyncVariables + > +} + +export type SendCallsSyncData = Compute + +export type SendCallsSyncVariables< + config extends Config, + chainId extends config['chains'][number]['id'], + calls extends readonly unknown[] = readonly unknown[], +> = SendCallsSyncParameters + +export type SendCallsSyncMutate = < + const calls extends readonly unknown[], + chainId extends config['chains'][number]['id'], +>( + variables: SendCallsSyncVariables, + options?: + | Compute< + MutateOptions< + SendCallsSyncData, + SendCallsSyncErrorType, + Compute>, + context + > + > + | undefined, +) => void + +export type SendCallsSyncMutateAsync< + config extends Config, + context = unknown, +> = < + const calls extends readonly unknown[], + chainId extends config['chains'][number]['id'], +>( + variables: SendCallsSyncVariables, + options?: + | Compute< + MutateOptions< + SendCallsSyncData, + SendCallsSyncErrorType, + Compute>, + context + > + > + | undefined, +) => Promise diff --git a/packages/core/src/query/sendTransactionSync.test.ts b/packages/core/src/query/sendTransactionSync.test.ts new file mode 100644 index 0000000000..c123abbf9b --- /dev/null +++ b/packages/core/src/query/sendTransactionSync.test.ts @@ -0,0 +1,15 @@ +import { config } from '@wagmi/test' +import { expect, test } from 'vitest' + +import { sendTransactionSyncMutationOptions } from './sendTransactionSync.js' + +test('default', () => { + expect(sendTransactionSyncMutationOptions(config)).toMatchInlineSnapshot(` + { + "mutationFn": [Function], + "mutationKey": [ + "sendTransactionSync", + ], + } + `) +}) diff --git a/packages/core/src/query/sendTransactionSync.ts b/packages/core/src/query/sendTransactionSync.ts new file mode 100644 index 0000000000..3b29913c84 --- /dev/null +++ b/packages/core/src/query/sendTransactionSync.ts @@ -0,0 +1,66 @@ +import type { MutateOptions, MutationOptions } from '@tanstack/query-core' + +import { + type SendTransactionSyncErrorType, + type SendTransactionSyncParameters, + type SendTransactionSyncReturnType, + sendTransactionSync, +} from '../actions/sendTransactionSync.js' +import type { Config } from '../createConfig.js' +import type { Compute } from '../types/utils.js' + +export function sendTransactionSyncMutationOptions( + config: config, +) { + return { + mutationFn(variables) { + return sendTransactionSync(config, variables) + }, + mutationKey: ['sendTransactionSync'], + } as const satisfies MutationOptions< + SendTransactionSyncData, + SendTransactionSyncErrorType, + SendTransactionSyncVariables + > +} + +export type SendTransactionSyncData = Compute + +export type SendTransactionSyncVariables< + config extends Config, + chainId extends config['chains'][number]['id'], +> = SendTransactionSyncParameters + +export type SendTransactionSyncMutate< + config extends Config, + context = unknown, +> = ( + variables: SendTransactionSyncVariables, + options?: + | Compute< + MutateOptions< + SendTransactionSyncData, + SendTransactionSyncErrorType, + Compute>, + context + > + > + | undefined, +) => void + +export type SendTransactionSyncMutateAsync< + config extends Config, + context = unknown, +> = ( + variables: SendTransactionSyncVariables, + options?: + | Compute< + MutateOptions< + SendTransactionSyncData, + SendTransactionSyncErrorType, + Compute>, + context + > + > + | undefined, +) => Promise diff --git a/packages/core/src/experimental/query/showCallsStatus.test.ts b/packages/core/src/query/showCallsStatus.test.ts similarity index 100% rename from packages/core/src/experimental/query/showCallsStatus.test.ts rename to packages/core/src/query/showCallsStatus.test.ts diff --git a/packages/core/src/experimental/query/showCallsStatus.ts b/packages/core/src/query/showCallsStatus.ts similarity index 93% rename from packages/core/src/experimental/query/showCallsStatus.ts rename to packages/core/src/query/showCallsStatus.ts index 1d684e9523..86a703cbc8 100644 --- a/packages/core/src/experimental/query/showCallsStatus.ts +++ b/packages/core/src/query/showCallsStatus.ts @@ -1,13 +1,13 @@ import type { MutateOptions, MutationOptions } from '@tanstack/query-core' -import type { Config } from '../../createConfig.js' -import type { Compute } from '../../types/utils.js' import { type ShowCallsStatusErrorType, type ShowCallsStatusParameters, type ShowCallsStatusReturnType, showCallsStatus, } from '../actions/showCallsStatus.js' +import type { Config } from '../createConfig.js' +import type { Compute } from '../types/utils.js' export function showCallsStatusMutationOptions( config: config, diff --git a/packages/core/src/query/simulateContract.test-d.ts b/packages/core/src/query/simulateContract.test-d.ts index 11023e7297..65b3408414 100644 --- a/packages/core/src/query/simulateContract.test-d.ts +++ b/packages/core/src/query/simulateContract.test-d.ts @@ -1,14 +1,48 @@ -import { abi } from '@wagmi/test' -import { http, type Address } from 'viem' +import { abi, config } from '@wagmi/test' +import { type Address, http } from 'viem' import { celo, mainnet } from 'viem/chains' -import { expectTypeOf, test } from 'vitest' - +import { assertType, expectTypeOf, test } from 'vitest' import { createConfig } from '../createConfig.js' import { type SimulateContractOptions, simulateContractQueryOptions, } from './simulateContract.js' +const context = {} as any + +test('default', async () => { + const options = simulateContractQueryOptions(config, { + address: '0x', + abi: abi.erc20, + functionName: 'transferFrom', + args: ['0x', '0x', 123n], + chainId: 1, + }) + const response = await options.queryFn(context) + + expectTypeOf(response).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('chain formatters', () => { const config = createConfig({ chains: [mainnet, celo], @@ -79,3 +113,49 @@ test('chain formatters', () => { feeCurrency: '0x', }) }) + +test('overloads', async () => { + { + const options = simulateContractQueryOptions(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + }) + const result = await options.queryFn(context) + assertType(result.result) + } + { + const options = simulateContractQueryOptions(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: [], + }) + const result = await options.queryFn(context) + assertType(result.result) + } + { + const options = simulateContractQueryOptions(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: ['0x'], + }) + const result = await options.queryFn(context) + assertType(result.result) + } + { + const options = simulateContractQueryOptions(config, { + address: '0x', + abi: abi.writeOverloads, + functionName: 'foo', + args: ['0x', '0x'], + //^? + }) + const result = await options.queryFn(context) + assertType<{ + foo: `0x${string}` + bar: `0x${string}` + }>(result.result) + } +}) diff --git a/packages/core/src/query/simulateContract.test.ts b/packages/core/src/query/simulateContract.test.ts index 354e4b0f02..f9aa511930 100644 --- a/packages/core/src/query/simulateContract.test.ts +++ b/packages/core/src/query/simulateContract.test.ts @@ -13,6 +13,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "simulateContract", diff --git a/packages/core/src/query/simulateContract.ts b/packages/core/src/query/simulateContract.ts index c3970999d4..0ef1f620a1 100644 --- a/packages/core/src/query/simulateContract.ts +++ b/packages/core/src/query/simulateContract.ts @@ -1,4 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { Abi, ContractFunctionArgs, ContractFunctionName } from 'viem' import { @@ -9,6 +8,7 @@ import { } from '../actions/simulateContract.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' @@ -22,21 +22,29 @@ export type SimulateContractOptions< >, config extends Config, chainId extends config['chains'][number]['id'] | undefined, + selectData = SimulateContractData, > = UnionExactPartial< SimulateContractParameters > & - ScopeKeyParameter + ScopeKeyParameter & + QueryParameter< + SimulateContractQueryFnData, + SimulateContractErrorType, + selectData, + SimulateContractQueryKey + > export function simulateContractQueryOptions< - config extends Config, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, - args extends ContractFunctionArgs< + const args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName >, + config extends Config, chainId extends config['chains'][number]['id'] | undefined, + selectData = SimulateContractData, >( config: config, options: SimulateContractOptions< @@ -44,30 +52,42 @@ export function simulateContractQueryOptions< functionName, args, config, - chainId + chainId, + selectData > = {} as any, -) { +): SimulateContractQueryOptions< + abi, + functionName, + args, + config, + chainId, + selectData +> { return { - async queryFn({ queryKey }) { - const { abi, connector } = options - if (!abi) throw new Error('abi is required') - const { scopeKey: _, ...parameters } = queryKey[1] - const { address, functionName } = parameters - if (!address) throw new Error('address is required') - if (!functionName) throw new Error('functionName is required') + ...options.query, + enabled: Boolean( + options.abi && + options.address && + options.connector && + options.functionName && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + if (!options.abi) throw new Error('abi is required') + if (!options.connector) throw new Error('connector is required') + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') + if (!parameters.functionName) throw new Error('functionName is required') return simulateContract(config, { - abi, - connector, ...(parameters as any), + abi: options.abi, + address: parameters.address, + connector: options.connector, + functionName: parameters.functionName, }) }, - queryKey: simulateContractQueryKey(options), - } as const satisfies QueryOptions< - SimulateContractQueryFnData, - SimulateContractErrorType, - SimulateContractData, - SimulateContractQueryKey - > + queryKey: simulateContractQueryKey(options as any), + } } export type SimulateContractQueryFnData< @@ -95,25 +115,22 @@ export type SimulateContractData< > = SimulateContractQueryFnData export function simulateContractQueryKey< - config extends Config, abi extends Abi | readonly unknown[], functionName extends ContractFunctionName, - args extends ContractFunctionArgs< + const args extends ContractFunctionArgs< abi, 'nonpayable' | 'payable', functionName >, + const config extends Config, chainId extends config['chains'][number]['id'] | undefined, >( - options: SimulateContractOptions< - abi, - functionName, - args, - config, - chainId - > = {} as any, + options: UnionExactPartial< + SimulateContractParameters + > & + ScopeKeyParameter = {} as any, ) { - const { abi: _, connector: _c, ...rest } = options + const { connector: _, ...rest } = options return ['simulateContract', filterQueryOptions(rest)] as const } @@ -128,5 +145,23 @@ export type SimulateContractQueryKey< config extends Config, chainId extends config['chains'][number]['id'] | undefined, > = ReturnType< - typeof simulateContractQueryKey + typeof simulateContractQueryKey +> + +export type SimulateContractQueryOptions< + abi extends Abi | readonly unknown[], + functionName extends ContractFunctionName, + args extends ContractFunctionArgs< + abi, + 'nonpayable' | 'payable', + functionName + >, + config extends Config, + chainId extends config['chains'][number]['id'] | undefined, + selectData = SimulateContractData, +> = QueryOptions< + SimulateContractQueryFnData, + SimulateContractErrorType, + selectData, + SimulateContractQueryKey > diff --git a/packages/core/src/query/switchAccount.ts b/packages/core/src/query/switchAccount.ts deleted file mode 100644 index 29a10b2ce8..0000000000 --- a/packages/core/src/query/switchAccount.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { MutationOptions } from '@tanstack/query-core' - -import { - type SwitchAccountErrorType, - type SwitchAccountParameters, - type SwitchAccountReturnType, - switchAccount, -} from '../actions/switchAccount.js' -import type { Config } from '../createConfig.js' -import type { Compute } from '../types/utils.js' -import type { Mutate, MutateAsync } from './types.js' - -export function switchAccountMutationOptions( - config: config, -) { - return { - mutationFn(variables) { - return switchAccount(config, variables) - }, - mutationKey: ['switchAccount'], - } as const satisfies MutationOptions< - SwitchAccountData, - SwitchAccountErrorType, - SwitchAccountVariables - > -} - -export type SwitchAccountData = Compute< - SwitchAccountReturnType -> - -export type SwitchAccountVariables = Compute - -export type SwitchAccountMutate< - config extends Config, - context = unknown, -> = Mutate< - SwitchAccountData, - SwitchAccountErrorType, - SwitchAccountVariables, - context -> - -export type SwitchAccountMutateAsync< - config extends Config, - context = unknown, -> = MutateAsync< - SwitchAccountData, - SwitchAccountErrorType, - SwitchAccountVariables, - context -> diff --git a/packages/core/src/experimental/query/writeContracts.test.ts b/packages/core/src/query/switchConnection.test.ts similarity index 51% rename from packages/core/src/experimental/query/writeContracts.test.ts rename to packages/core/src/query/switchConnection.test.ts index 5f4a1f28dd..a477237ced 100644 --- a/packages/core/src/experimental/query/writeContracts.test.ts +++ b/packages/core/src/query/switchConnection.test.ts @@ -1,14 +1,14 @@ import { config } from '@wagmi/test' import { expect, test } from 'vitest' -import { writeContractsMutationOptions } from './writeContracts.js' +import { switchConnectionMutationOptions } from './switchConnection.js' test('default', () => { - expect(writeContractsMutationOptions(config)).toMatchInlineSnapshot(` + expect(switchConnectionMutationOptions(config)).toMatchInlineSnapshot(` { "mutationFn": [Function], "mutationKey": [ - "writeContracts", + "switchConnection", ], } `) diff --git a/packages/core/src/query/switchConnection.ts b/packages/core/src/query/switchConnection.ts new file mode 100644 index 0000000000..61557c52e5 --- /dev/null +++ b/packages/core/src/query/switchConnection.ts @@ -0,0 +1,52 @@ +import type { MutationOptions } from '@tanstack/query-core' + +import { + type SwitchConnectionErrorType, + type SwitchConnectionParameters, + type SwitchConnectionReturnType, + switchConnection, +} from '../actions/switchConnection.js' +import type { Config } from '../createConfig.js' +import type { Compute } from '../types/utils.js' +import type { Mutate, MutateAsync } from './types.js' + +export function switchConnectionMutationOptions( + config: config, +) { + return { + mutationFn(variables) { + return switchConnection(config, variables) + }, + mutationKey: ['switchConnection'], + } as const satisfies MutationOptions< + SwitchConnectionData, + SwitchConnectionErrorType, + SwitchConnectionVariables + > +} + +export type SwitchConnectionData = Compute< + SwitchConnectionReturnType +> + +export type SwitchConnectionVariables = Compute + +export type SwitchConnectionMutate< + config extends Config, + context = unknown, +> = Mutate< + SwitchConnectionData, + SwitchConnectionErrorType, + SwitchConnectionVariables, + context +> + +export type SwitchConnectionMutateAsync< + config extends Config, + context = unknown, +> = MutateAsync< + SwitchConnectionData, + SwitchConnectionErrorType, + SwitchConnectionVariables, + context +> diff --git a/packages/core/src/query/utils.test.ts b/packages/core/src/query/utils.test.ts index 920b2e5f37..6371b1e63d 100644 --- a/packages/core/src/query/utils.test.ts +++ b/packages/core/src/query/utils.test.ts @@ -1,6 +1,6 @@ -import { expect, test } from 'vitest' - -import { structuralSharing } from './utils.js' +import { abi } from '@wagmi/test' +import { expect, expectTypeOf, test } from 'vitest' +import { filterQueryOptions, structuralSharing } from './utils.js' test('structuralSharing', () => { expect( @@ -18,3 +18,23 @@ test('structuralSharing', () => { } `) }) + +test('filterQueryOptions', () => { + const options = filterQueryOptions({ + foo: 'bar', + baz: true, + abi: abi.erc20, + connector: undefined, + }) + expectTypeOf(options).toEqualTypeOf<{ + foo: string + baz: boolean + connectorUid?: string | undefined + }>() + expect(options).toMatchInlineSnapshot(` + { + "baz": true, + "foo": "bar", + } + `) +}) diff --git a/packages/core/src/query/utils.ts b/packages/core/src/query/utils.ts index ab4ea3b989..5ca4d84957 100644 --- a/packages/core/src/query/utils.ts +++ b/packages/core/src/query/utils.ts @@ -1,4 +1,6 @@ import { type QueryKey, replaceEqualDeep } from '@tanstack/query-core' +import type { Connector } from '../createConfig.js' +import type { Compute, StrictOmit } from '../types/utils.js' export function structuralSharing( oldData: data | undefined, @@ -21,7 +23,7 @@ export function hashFn(queryKey: QueryKey): string { }) } -// biome-ignore lint/complexity/noBannedTypes: +// biome-ignore lint/complexity/noBannedTypes: using function isPlainObject(value: any): value is Object { if (!hasObjectPrototype(value)) { return false @@ -36,7 +38,7 @@ function isPlainObject(value: any): value is Object { if (!hasObjectPrototype(prot)) return false // If constructor does not have an Object-specific method - // biome-ignore lint/suspicious/noPrototypeBuiltins: + // biome-ignore lint/suspicious/noPrototypeBuiltins: using if (!prot.hasOwnProperty('isPrototypeOf')) return false // Most likely a plain Object @@ -47,27 +49,38 @@ function hasObjectPrototype(o: any): boolean { return Object.prototype.toString.call(o) === '[object Object]' } -export function filterQueryOptions>( +export function filterQueryOptions< + type extends Record & { connector?: Connector | undefined }, +>( options: type, -): type { +): Compute< + StrictOmit & + (type extends { connector?: Connector | undefined } + ? { connectorUid?: string } + : unknown) +> { // destructuring is super fast // biome-ignore format: no formatting const { // import('@tanstack/query-core').QueryOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing _defaulted, behavior, gcTime, initialData, initialDataUpdatedAt, maxPages, meta, networkMode, queryFn, queryHash, queryKey, queryKeyHashFn, retry, retryDelay, structuralSharing, // import('@tanstack/query-core').InfiniteQueryObserverOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing getPreviousPageParam, getNextPageParam, initialPageParam, // import('@tanstack/react-query').UseQueryOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing _optimisticResults, enabled, notifyOnChangeProps, placeholderData, refetchInterval, refetchIntervalInBackground, refetchOnMount, refetchOnReconnect, refetchOnWindowFocus, retryOnMount, select, staleTime, suspense, throwOnError, //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // wagmi //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - config, connector, query, + // biome-ignore lint/correctness/noUnusedVariables: tossing + abi, config, connector, query, watch, ...rest } = options - - return rest as type + if (connector) return { connectorUid: connector?.uid, ...rest } as never + return rest as never } diff --git a/packages/core/src/query/verifyMessage.test.ts b/packages/core/src/query/verifyMessage.test.ts index ae43f6b07f..749639ff00 100644 --- a/packages/core/src/query/verifyMessage.test.ts +++ b/packages/core/src/query/verifyMessage.test.ts @@ -15,11 +15,12 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyMessage", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "message": "This is a test message for viem!", "signature": "0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c", }, @@ -39,11 +40,12 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyMessage", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 456, "message": "This is a test message for viem!", "signature": "0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c", @@ -64,11 +66,12 @@ test('parameters: blockNumber', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyMessage", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockNumber": 1234567890n, "message": "This is a test message for viem!", "signature": "0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c", @@ -89,11 +92,12 @@ test('parameters: blockTag', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyMessage", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockTag": "safe", "message": "This is a test message for viem!", "signature": "0xefd5fb29a274ea6682673d8b3caa9263e936d48d486e5df68893003e0a76496439594d12245008c6fba1c8e3ef28241cffe1bef27ff6bca487b167f261f329251c", diff --git a/packages/core/src/query/verifyMessage.ts b/packages/core/src/query/verifyMessage.ts index d827e64b2b..2aef35e9eb 100644 --- a/packages/core/src/query/verifyMessage.ts +++ b/packages/core/src/query/verifyMessage.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type VerifyMessageErrorType, type VerifyMessageParameters, @@ -8,45 +6,61 @@ import { } from '../actions/verifyMessage.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' -export type VerifyMessageOptions = Compute< - ExactPartial> & ScopeKeyParameter -> +export type VerifyMessageOptions< + config extends Config, + selectData = VerifyMessageData, +> = Compute> & ScopeKeyParameter> & + QueryParameter< + VerifyMessageQueryFnData, + VerifyMessageErrorType, + selectData, + VerifyMessageQueryKey + > -export function verifyMessageQueryOptions( +export function verifyMessageQueryOptions< + config extends Config, + selectData = VerifyMessageData, +>( config: config, - options: VerifyMessageOptions = {}, -) { + options: VerifyMessageOptions = {}, +): VerifyMessageQueryOptions { return { - async queryFn({ queryKey }) { - const { address, message, signature } = queryKey[1] - if (!address || !message || !signature) - throw new Error('address, message, and signature are required') - - const { scopeKey: _, ...parameters } = queryKey[1] - - const verified = await verifyMessage( - config, - parameters as VerifyMessageParameters, - ) + ...options.query, + enabled: Boolean( + options.address && + options.message && + options.signature && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') + if (!parameters.message) throw new Error('message is required') + if (!parameters.signature) throw new Error('signature is required') + const verified = await verifyMessage(config, { + ...parameters, + address: parameters.address, + message: parameters.message, + signature: parameters.signature, + }) return verified ?? null }, queryKey: verifyMessageQueryKey(options), - } as const satisfies QueryOptions< - VerifyMessageQueryFnData, - VerifyMessageErrorType, - VerifyMessageData, - VerifyMessageQueryKey - > + } } + export type VerifyMessageQueryFnData = VerifyMessageReturnType export type VerifyMessageData = VerifyMessageQueryFnData export function verifyMessageQueryKey( - options: VerifyMessageOptions, + options: Compute< + ExactPartial> & ScopeKeyParameter + > = {}, ) { return ['verifyMessage', filterQueryOptions(options)] as const } @@ -54,3 +68,13 @@ export function verifyMessageQueryKey( export type VerifyMessageQueryKey = ReturnType< typeof verifyMessageQueryKey > + +export type VerifyMessageQueryOptions< + config extends Config, + selectData = VerifyMessageData, +> = QueryOptions< + VerifyMessageQueryFnData, + VerifyMessageErrorType, + selectData, + VerifyMessageQueryKey +> diff --git a/packages/core/src/query/verifyTypedData.test-d.ts b/packages/core/src/query/verifyTypedData.test-d.ts new file mode 100644 index 0000000000..34ad2e3018 --- /dev/null +++ b/packages/core/src/query/verifyTypedData.test-d.ts @@ -0,0 +1,20 @@ +import { config, typedData } from '@wagmi/test' +import { test } from 'vitest' + +import { verifyTypedDataQueryOptions } from './verifyTypedData.js' + +test('default', async () => { + verifyTypedDataQueryOptions(config, { + address: '0x', + ...typedData.basic, + primaryType: 'Mail', + signature: '0x', + }) + verifyTypedDataQueryOptions(config, { + address: '0x', + ...typedData.basic, + // @ts-expect-error + primaryType: 'foobarbaz', + signature: '0x', + }) +}) diff --git a/packages/core/src/query/verifyTypedData.test.ts b/packages/core/src/query/verifyTypedData.test.ts index f4145099ce..4536170481 100644 --- a/packages/core/src/query/verifyTypedData.test.ts +++ b/packages/core/src/query/verifyTypedData.test.ts @@ -16,11 +16,12 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyTypedData", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "domain": { "chainId": 1, "name": "Ether Mail", @@ -88,11 +89,12 @@ test('parameters: chainId', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyTypedData", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "chainId": 456, "domain": { "chainId": 456, @@ -157,11 +159,12 @@ test('parameters: blockNumber', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyTypedData", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockNumber": 1234567890n, "domain": { "chainId": 1, @@ -226,11 +229,12 @@ test('parameters: blockTag', () => { }), ).toMatchInlineSnapshot(` { + "enabled": true, "queryFn": [Function], "queryKey": [ "verifyTypedData", { - "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "address": "0x95132632579b073D12a6673e18Ab05777a6B86f8", "blockTag": "pending", "domain": { "chainId": 1, diff --git a/packages/core/src/query/verifyTypedData.ts b/packages/core/src/query/verifyTypedData.ts index d7d3970b7e..101c806a8f 100644 --- a/packages/core/src/query/verifyTypedData.ts +++ b/packages/core/src/query/verifyTypedData.ts @@ -1,4 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' import type { TypedData } from 'viem' import { @@ -9,58 +8,69 @@ import { } from '../actions/verifyTypedData.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' -import type { ExactPartial } from '../types/utils.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { UnionExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type VerifyTypedDataOptions< typedData extends TypedData | Record, primaryType extends keyof typedData | 'EIP712Domain', config extends Config, -> = ExactPartial> & - ScopeKeyParameter + selectData = VerifyTypedDataData, +> = UnionExactPartial< + VerifyTypedDataParameters +> & + ScopeKeyParameter & + QueryParameter< + VerifyTypedDataQueryFnData, + VerifyTypedDataErrorType, + selectData, + VerifyTypedDataQueryKey + > export function verifyTypedDataQueryOptions< - config extends Config, const typedData extends TypedData | Record, primaryType extends keyof typedData | 'EIP712Domain', + config extends Config, + selectData = VerifyTypedDataData, >( config: config, - options: VerifyTypedDataOptions = {} as any, -) { + options: VerifyTypedDataOptions< + typedData, + primaryType, + config, + selectData + > = {} as any, +): VerifyTypedDataQueryOptions { return { - async queryFn({ queryKey }) { - const { - address, - message, - primaryType, - signature, - types, - scopeKey: _, - ...parameters - } = queryKey[1] - if (!address) throw new Error('address is required') - if (!message) throw new Error('message is required') - if (!primaryType) throw new Error('primaryType is required') - if (!signature) throw new Error('signature is required') - if (!types) throw new Error('types is required') - + ...options.query, + enabled: Boolean( + options.address && + options.message && + options.primaryType && + options.signature && + options.types && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.address) throw new Error('address is required') + if (!parameters.message) throw new Error('message is required') + if (!parameters.primaryType) throw new Error('primaryType is required') + if (!parameters.signature) throw new Error('signature is required') + if (!parameters.types) throw new Error('types is required') const verified = await verifyTypedData(config, { - ...parameters, - address, - message, - primaryType, - signature, - types, - } as VerifyTypedDataParameters) + ...(parameters as any), + address: parameters.address, + message: parameters.message, + primaryType: parameters.primaryType, + signature: parameters.signature, + types: parameters.types, + }) return verified ?? null }, - queryKey: verifyTypedDataQueryKey(options), - } as const satisfies QueryOptions< - VerifyTypedDataQueryFnData, - VerifyTypedDataErrorType, - VerifyTypedDataData, - VerifyTypedDataQueryKey - > + queryKey: verifyTypedDataQueryKey(options as any) as any, + } } export type VerifyTypedDataQueryFnData = VerifyTypedDataReturnType @@ -71,7 +81,12 @@ export function verifyTypedDataQueryKey< config extends Config, const typedData extends TypedData | Record, primaryType extends keyof typedData | 'EIP712Domain', ->(options: VerifyTypedDataOptions) { +>( + options: UnionExactPartial< + VerifyTypedDataParameters + > & + ScopeKeyParameter = {} as any, +) { return ['verifyTypedData', filterQueryOptions(options)] as const } @@ -80,3 +95,15 @@ export type VerifyTypedDataQueryKey< primaryType extends keyof typedData | 'EIP712Domain', config extends Config, > = ReturnType> + +export type VerifyTypedDataQueryOptions< + typedData extends TypedData | Record, + primaryType extends keyof typedData | 'EIP712Domain', + config extends Config, + selectData = VerifyTypedDataData, +> = QueryOptions< + VerifyTypedDataQueryFnData, + VerifyTypedDataErrorType, + selectData, + VerifyTypedDataQueryKey +> diff --git a/packages/core/src/experimental/query/waitForCallsStatus.test.ts b/packages/core/src/query/waitForCallsStatus.test.ts similarity index 94% rename from packages/core/src/experimental/query/waitForCallsStatus.test.ts rename to packages/core/src/query/waitForCallsStatus.test.ts index 215ec72759..32bea01e36 100644 --- a/packages/core/src/experimental/query/waitForCallsStatus.test.ts +++ b/packages/core/src/query/waitForCallsStatus.test.ts @@ -10,6 +10,7 @@ test('default', () => { }), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "callsStatus", @@ -17,7 +18,6 @@ test('default', () => { "id": "0x0000000000000000000000000000000000000000", }, ], - "retry": [Function], } `) }) diff --git a/packages/core/src/query/waitForCallsStatus.ts b/packages/core/src/query/waitForCallsStatus.ts new file mode 100644 index 0000000000..ce3a10d3b6 --- /dev/null +++ b/packages/core/src/query/waitForCallsStatus.ts @@ -0,0 +1,75 @@ +import { + type WaitForCallsStatusErrorType, + type WaitForCallsStatusParameters, + type WaitForCallsStatusReturnType, + waitForCallsStatus, +} from '../actions/waitForCallsStatus.js' +import type { Config } from '../createConfig.js' +import { filterQueryOptions } from '../query/utils.js' +import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' +import type { Compute, ExactPartial } from '../types/utils.js' + +export type WaitForCallsStatusOptions = + Compute & ScopeKeyParameter> & + QueryParameter< + WaitForCallsStatusQueryFnData, + WaitForCallsStatusErrorType, + selectData, + WaitForCallsStatusQueryKey + > + +export function waitForCallsStatusQueryOptions< + config extends Config, + selectData = WaitForCallsStatusData, +>( + config: config, + options: WaitForCallsStatusOptions, +): WaitForCallsStatusQueryOptions { + return { + ...options.query, + enabled: Boolean( + options.id && + options.connector?.getProvider && + (options.query?.enabled ?? true), + ), + queryFn: async (context) => { + if (!options.connector?.getProvider) + throw new Error('connector is required') + const [, { connectorUid: _, scopeKey: __, ...parameters }] = + context.queryKey + if (!parameters.id) throw new Error('id is required') + const status = await waitForCallsStatus(config, { + ...parameters, + id: parameters.id, + }) + return status + }, + queryKey: waitForCallsStatusQueryKey(options), + } +} + +export type WaitForCallsStatusQueryFnData = WaitForCallsStatusReturnType + +export type WaitForCallsStatusData = WaitForCallsStatusQueryFnData + +export function waitForCallsStatusQueryKey( + options: Compute< + ExactPartial & ScopeKeyParameter + > = {}, +) { + return ['callsStatus', filterQueryOptions(options)] as const +} + +export type WaitForCallsStatusQueryKey = ReturnType< + typeof waitForCallsStatusQueryKey +> + +export type WaitForCallsStatusQueryOptions< + selectData = WaitForCallsStatusData, +> = QueryOptions< + WaitForCallsStatusQueryFnData, + WaitForCallsStatusErrorType, + selectData, + WaitForCallsStatusQueryKey +> diff --git a/packages/core/src/query/waitForTransactionReceipt.test-d.ts b/packages/core/src/query/waitForTransactionReceipt.test-d.ts new file mode 100644 index 0000000000..e537c93485 --- /dev/null +++ b/packages/core/src/query/waitForTransactionReceipt.test-d.ts @@ -0,0 +1,44 @@ +import { http } from 'viem' +import { mainnet, zkSync } from 'viem/chains' +import type { ZkSyncL2ToL1Log, ZkSyncLog } from 'viem/zksync' +import { expectTypeOf, test } from 'vitest' + +import { createConfig } from '../createConfig.js' +import { waitForTransactionReceiptQueryOptions } from './waitForTransactionReceipt.js' + +const context = {} as any + +test('chain formatters', async () => { + const config = createConfig({ + chains: [mainnet, zkSync], + transports: { [mainnet.id]: http(), [zkSync.id]: http() }, + }) + const options = waitForTransactionReceiptQueryOptions(config, { + hash: '0x123', + }) + const result = await options.queryFn(context) + if (result.chainId === zkSync.id) { + expectTypeOf(result.l1BatchNumber).toEqualTypeOf() + expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf() + expectTypeOf(result.logs).toEqualTypeOf() + expectTypeOf(result.l2ToL1Logs).toEqualTypeOf() + } + // @ts-expect-error + result.l1BatchNumber +}) + +test('chainId', async () => { + const config = createConfig({ + chains: [zkSync], + transports: { [zkSync.id]: http() }, + }) + const options = waitForTransactionReceiptQueryOptions(config, { + hash: '0x123', + chainId: zkSync.id, + }) + const result = await options.queryFn(context) + expectTypeOf(result.l1BatchNumber).toEqualTypeOf() + expectTypeOf(result.l1BatchTxIndex).toEqualTypeOf() + expectTypeOf(result.logs).toEqualTypeOf() + expectTypeOf(result.l2ToL1Logs).toEqualTypeOf() +}) diff --git a/packages/core/src/query/waitForTransactionReceipt.test.ts b/packages/core/src/query/waitForTransactionReceipt.test.ts index 1877e1bfeb..645c3e3d1d 100644 --- a/packages/core/src/query/waitForTransactionReceipt.test.ts +++ b/packages/core/src/query/waitForTransactionReceipt.test.ts @@ -8,6 +8,7 @@ test('default', () => { waitForTransactionReceiptQueryOptions(config, {}), ).toMatchInlineSnapshot(` { + "enabled": false, "queryFn": [Function], "queryKey": [ "waitForTransactionReceipt", diff --git a/packages/core/src/query/waitForTransactionReceipt.ts b/packages/core/src/query/waitForTransactionReceipt.ts index 3507dabeb8..736fcd29f2 100644 --- a/packages/core/src/query/waitForTransactionReceipt.ts +++ b/packages/core/src/query/waitForTransactionReceipt.ts @@ -1,5 +1,3 @@ -import type { QueryOptions } from '@tanstack/query-core' - import { type WaitForTransactionReceiptErrorType, type WaitForTransactionReceiptParameters, @@ -8,43 +6,49 @@ import { } from '../actions/waitForTransactionReceipt.js' import type { Config } from '../createConfig.js' import type { ScopeKeyParameter } from '../types/properties.js' +import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' import { filterQueryOptions } from './utils.js' export type WaitForTransactionReceiptOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = WaitForTransactionReceiptData, > = Compute< ExactPartial> & ScopeKeyParameter -> +> & + QueryParameter< + WaitForTransactionReceiptQueryFnData, + WaitForTransactionReceiptErrorType, + selectData, + WaitForTransactionReceiptQueryKey + > export function waitForTransactionReceiptQueryOptions< config extends Config, chainId extends config['chains'][number]['id'], + selectData = WaitForTransactionReceiptData, >( config: config, - options: WaitForTransactionReceiptOptions = {}, -) { + options: WaitForTransactionReceiptOptions = {}, +): WaitForTransactionReceiptQueryOptions { return { - async queryFn({ queryKey }) { - const { hash, ...parameters } = queryKey[1] - if (!hash) throw new Error('hash is required') + ...options.query, + enabled: Boolean(options.hash && (options.query?.enabled ?? true)), + queryFn: async (context) => { + const [, { scopeKey: _, ...parameters }] = context.queryKey + if (!parameters.hash) throw new Error('hash is required') return waitForTransactionReceipt(config, { ...parameters, onReplaced: options.onReplaced, - hash, + hash: parameters.hash, }) as unknown as Promise< WaitForTransactionReceiptReturnType > }, queryKey: waitForTransactionReceiptQueryKey(options), - } as const satisfies QueryOptions< - WaitForTransactionReceiptQueryFnData, - WaitForTransactionReceiptErrorType, - WaitForTransactionReceiptData, - WaitForTransactionReceiptQueryKey - > + } } export type WaitForTransactionReceiptQueryFnData< @@ -60,7 +64,12 @@ export type WaitForTransactionReceiptData< export function waitForTransactionReceiptQueryKey< config extends Config, chainId extends config['chains'][number]['id'], ->(options: WaitForTransactionReceiptOptions = {}) { +>( + options: Compute< + ExactPartial> & + ScopeKeyParameter + > = {}, +) { const { onReplaced: _, ...rest } = options return ['waitForTransactionReceipt', filterQueryOptions(rest)] as const } @@ -69,3 +78,14 @@ export type WaitForTransactionReceiptQueryKey< config extends Config, chainId extends config['chains'][number]['id'], > = ReturnType> + +export type WaitForTransactionReceiptQueryOptions< + config extends Config, + chainId extends config['chains'][number]['id'], + selectData = WaitForTransactionReceiptData, +> = QueryOptions< + WaitForTransactionReceiptQueryFnData, + WaitForTransactionReceiptErrorType, + selectData, + WaitForTransactionReceiptQueryKey +> diff --git a/packages/core/src/tempo/AGENTS.md b/packages/core/src/tempo/AGENTS.md new file mode 100644 index 0000000000..a30f372221 --- /dev/null +++ b/packages/core/src/tempo/AGENTS.md @@ -0,0 +1,324 @@ +# Agent Guidelines + +Agent guidance for `@wagmi/core/tempo`. + +> **Communication Style**: Be brief, concise. Maximize information density, minimize tokens. Incomplete sentences acceptable when clear. Remove filler words. Prioritize clarity over grammar. + +## Code Generation + +### Wagmi Actions + +When generating Wagmi actions (in `actions/`), follow these guidelines. + +An example of a generated action set can be found in `actions/fee.ts`. + +#### Source of Truth + +- **All actions must be based on their corresponding Viem actions** from `import { Actions } from viem/tempo` (local path might be `../viem/src/tempo/actions` or you can clone `gh repo clone wevm/viem`) +- Wagmi actions are wrappers around Viem actions that integrate with Wagmi's config and TanStack Query + +#### Documentation Requirements + +All actions **must include comprehensive TSDoc** with: + +1. **Function description** - What the action does +2. **`@example` block** - Complete working example showing: + - Required imports (`createConfig`, `http`, action imports) + - Config setup with chains and transports + - Action usage with realistic parameters + - Expected return value handling (if applicable) +3. **`@param` tags** - For each parameter (config, parameters) +4. **`@returns` tag** - Description of the return value + +Example: +```ts +/** + * Gets the user's default fee token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const token = await Actions.fee.getUserToken(config, { + * account: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The user's fee token address. + */ +``` + +#### Action Types + +##### Query-based Actions (Read-Only) + +For read-only actions that fetch data: + +- Return the result from the corresponding Viem action +- Parameters include `ChainIdParameter` and the Viem action's parameters +- Must include query utilities for TanStack Query integration + +```ts +export function myAction( + config: config, + parameters: myAction.Parameters, +): Promise> { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return viem_Actions.myAction(client, rest) +} +``` + +##### Mutation-based Actions (Write) + +For state-changing actions, both variants must be implemented: + +**1. Standard Variant** + +- Uses `getConnectorClient` to get the wallet client +- Returns the result from the corresponding Viem action +- Does not wait for transaction confirmation + +```ts +export async function myAction( + config: config, + parameters: myAction.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return viem_Actions.myAction( + client, + parameters as viem_Actions.myAction.Parameters, + ) +} +``` + +**2. Sync Variant (`*Sync`)** + +- Named with `Sync` suffix (e.g., `setUserTokenSync`) +- Uses `getConnectorClient` to get the wallet client +- Waits for transaction inclusion on a block before returning a response +- Returns both the receipt and extracted event data + +```ts +export async function myActionSync( + config: config, + parameters: myActionSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return viem_Actions.myActionSync( + client, + parameters as viem_Actions.myActionSync.Parameters, + ) +} +``` + +#### Namespace Properties + +##### Query-based Actions + +All query-based actions must include the following components: + +- Include `enabled` logic to disable the query when required reactive parameters (e.g. addresses) are undefined +- The `enabled` conditional must check ALL required reactive parameters (e.g., `account && spender` for allowance checks) +- If there isn't an `ErrorType` for the Viem Action, use `import { BaseError } from 'viem'` + +```ts +import { filterQueryOptions } from './utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' + +export function myAction( + config: config, + parameters: myAction.Parameters, +): Promise { ... } + +export namespace myAction { + export type Parameters = ChainIdParameter & + viem_Actions.myAction.Parameters + + export type ReturnValue = viem_Actions.myAction.ReturnValue + + export type ErrorType = viem_Actions.myAction.ErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['myAction', filterQueryOptions(parameters)] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.account && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return await myAction(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = myAction.ReturnValue, + > = myAction.Parameters & + QueryParameter< + myAction.ReturnValue, + myAction.ErrorType, + selectData, + myAction.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = myAction.ReturnValue, + > = QueryOptions< + myAction.ReturnValue, + myAction.ErrorType, + selectData, + myAction.QueryKey + > + } +} +``` + +##### Mutation-based Actions + +All mutation-based actions must include the following components: + +- If there isn't an `ErrorType` for the Viem Action, use `import { BaseError } from 'viem'` + +```ts +export async function myAction( + config: config, + parameters: myAction.Parameters, +): Promise { ... } + +export declare namespace myAction { + export type Parameters = ChainIdParameter & + ConnectorParameter & + Omit, 'chain'> + + export type ReturnValue = viem_Actions.myAction.ReturnValue + + export type ErrorType = viem_Actions.myAction.ErrorType +} + +export declare namespace myActionSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + Omit, 'chain'> + + export type ReturnValue = viem_Actions.myActionSync.ReturnValue + + export type ErrorType = viem_Actions.myActionSync.ErrorType +} +``` + +#### Testing + +Tests should be co-located with actions in `*action-name*.test.ts` files. + +**Important**: Wagmi action tests should follow the same test flows as the corresponding Viem action tests in `src/tempo/actions/`. This includes: +- Setting up the same initial state (creating tokens, granting roles, minting tokens, etc.) +- Testing the same behaviors and edge cases +- Using the same test data and assertions where applicable + +The main difference is that Wagmi tests use `config` instead of `client`, and mutation actions don't require explicit `account` parameters since they use the connector's account. + +See `actions/token.test.ts` for a comprehensive example of test patterns and structure. + +##### Test Structure + +Organize tests by action name with a default test case. Use namespace imports for cleaner code: + +```ts +import { connect } from '@wagmi/core' +import { accounts, config, queryClient } from '@wagmi/test/tempo' +import { describe, expect, test } from 'vitest' +import * as myNamespace from './myNamespace.js' + +const account = accounts[0] + +// Query-based actions +describe('myAction', () => { + test('default', async () => { + const result = await myNamespace.myAction(config, { + // ... + }) + expect(result).toMatchInlineSnapshot(`...`) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = myNamespace.myAction.queryOptions(config, { + // ... + }) + expect(await queryClient.fetchQuery(options)).toMatchInlineSnapshot(`...`) + }) + }) +}) + +// Mutation-based actions +describe('myAction', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Include any necessary setup from the corresponding viem test + // e.g., create tokens, grant roles, mint tokens, etc. + + const hash = await myNamespace.myAction(config, { + // ... (no account parameter needed) + }) + expect(hash).toBeDefined() + }) +}) + +describe('myActionSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Include any necessary setup from the corresponding viem test + + const result = await myNamespace.myActionSync(config, { + // ... (no account parameter needed) + }) + expect(result).toBeDefined() + }) +}) +``` diff --git a/packages/core/src/tempo/Connectors.ts b/packages/core/src/tempo/Connectors.ts new file mode 100644 index 0000000000..d52e8b84f0 --- /dev/null +++ b/packages/core/src/tempo/Connectors.ts @@ -0,0 +1,772 @@ +import * as Address from 'ox/Address' +import type * as Hex from 'ox/Hex' +import * as PublicKey from 'ox/PublicKey' +import { KeyAuthorization, SignatureEnvelope } from 'ox/tempo' +import { + createClient, + defineChain, + type EIP1193Provider, + getAddress, + SwitchChainError, +} from 'viem' +import { + generatePrivateKey, + type LocalAccount, + privateKeyToAccount, +} from 'viem/accounts' +import { + Account, + WebAuthnP256, + WebCryptoP256, + walletNamespaceCompat, +} from 'viem/tempo' +import { createConnector } from '../connectors/createConnector.js' +import { ChainNotConfiguredError } from '../errors/config.js' +import type { OneOf } from '../types/utils.js' +import type * as KeyManager from './KeyManager.js' + +/** @deprecated use `webAuthn.Parameters` instead */ +export type WebAuthnParameters = webAuthn.Parameters + +webAuthn.type = 'webAuthn' as const + +/** + * Connector for a WebAuthn EOA. + */ +export function webAuthn(options: webAuthn.Parameters) { + let account: Account.RootAccount | undefined + let accessKey: Account.AccessKeyAccount | undefined + + const defaultAccessKeyOptions = { + expiry: Math.floor( + (Date.now() + 24 * 60 * 60 * 1000) / 1000, // one day + ), + strict: false, + } + const accessKeyOptions = (() => { + if (typeof options.grantAccessKey === 'object') + return { ...defaultAccessKeyOptions, ...options.grantAccessKey } + if (options.grantAccessKey === true) return defaultAccessKeyOptions + return undefined + })() + + type Properties = { + // TODO(v3): Make `withCapabilities: true` default behavior + connect(parameters: { + chainId?: number | undefined + capabilities?: + | OneOf< + | { + label?: string | undefined + type: 'sign-up' + } + | { + selectAccount?: boolean | undefined + type: 'sign-in' + } + | { + type?: undefined + } + > + | undefined + isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined + }): Promise<{ accounts: readonly Address.Address[]; chainId: number }> + } + type Provider = Pick + type StorageItem = { + [ + key: `pendingKeyAuthorization:${string}` + ]: KeyAuthorization.KeyAuthorization + 'webAuthn.activeCredential': WebAuthnP256.P256Credential + 'webAuthn.lastActiveCredential': WebAuthnP256.P256Credential + } + + return createConnector((config) => ({ + id: 'webAuthn', + name: 'EOA (WebAuthn)', + type: 'webAuthn', + async setup() { + const credential = await config.storage?.getItem( + 'webAuthn.activeCredential', + ) + if (!credential) return + account = Account.fromWebAuthnP256(credential) + }, + async connect(parameters = {}) { + const capabilities = + 'capabilities' in parameters ? (parameters.capabilities ?? {}) : {} + + if ( + accessKeyOptions?.strict && + accessKeyOptions.expiry && + accessKeyOptions.expiry < Date.now() / 1000 + ) + throw new Error( + `\`grantAccessKey.expiry = ${accessKeyOptions.expiry}\` is in the past (${new Date(accessKeyOptions.expiry * 1000).toLocaleString()}). Please provide a valid expiry.`, + ) + + // We are going to need to find: + // - a WebAuthn `credential` to instantiate an account + // - optionally, a `keyPair` to use as the access key for the account + // - optionally, a signed `keyAuthorization` to provision the access key + const { credential, keyAuthorization, keyPair } = await (async () => { + // If the connection type is of "sign-up", we are going to create a new credential + // and provision an access key (if needed). + if (capabilities.type === 'sign-up') { + // Create credential (sign up) + const createOptions_remote = await options.keyManager.getChallenge?.() + const label = + capabilities.label ?? + options.createOptions?.label ?? + new Date().toISOString() + const rpId = + createOptions_remote?.rp?.id ?? + options.createOptions?.rpId ?? + options.rpId + const credential = await WebAuthnP256.createCredential({ + ...(options.createOptions ?? {}), + label, + rpId, + ...(createOptions_remote ?? {}), + }) + await options.keyManager.setPublicKey({ + credential: credential.raw, + publicKey: credential.publicKey, + }) + + // Get key pair (access key) to use for the account. + const keyPair = await (async () => { + if (!accessKeyOptions) return undefined + return await WebCryptoP256.createKeyPair() + })() + + return { credential, keyPair } + } + + // If we are not selecting an account, we will check if an active credential is present in + // storage and if so, we will use it to instantiate an account. + if (!capabilities.selectAccount) { + const credential = (await config.storage?.getItem( + 'webAuthn.activeCredential', + )) as WebAuthnP256.getCredential.ReturnValue | undefined + + if (credential) { + // Get key pair (access key) to use for the account. + const keyPair = await (async () => { + if (!accessKeyOptions) return undefined + const address = Address.fromPublicKey( + PublicKey.fromHex(credential.publicKey), + ) + return await idb.get(`accessKey:${address}`) + })() + + // If the access key provisioning is not in strict mode, return the credential and key pair (if exists). + if (!accessKeyOptions?.strict) return { credential, keyPair } + + // If a key pair is found, return the credential and key pair. + if (keyPair) return { credential, keyPair } + + // If we are reconnecting, throw an error if not found. + if (parameters.isReconnecting) + throw new Error('credential not found.') + + // Otherwise, we want to continue to sign up or register against new key pair. + } + } + + // Discover credential + { + // Get key pair (access key) to use for the account. + const keyPair = await (async () => { + if (!accessKeyOptions) return undefined + return await WebCryptoP256.createKeyPair() + })() + + // If we are provisioning an access key, we will need to sign a key authorization. + // We will need the hash (digest) to sign, and the address of the access key to construct the key authorization. + const { hash, keyAuthorization_unsigned } = await (async () => { + if (!keyPair) + return { accessKeyAddress: undefined, hash: undefined } + const accessKeyAddress = Address.fromPublicKey(keyPair.publicKey) + const keyAuthorization_unsigned = KeyAuthorization.from({ + ...accessKeyOptions, + address: accessKeyAddress, + type: 'p256', + }) + const hash = KeyAuthorization.getSignPayload( + keyAuthorization_unsigned, + ) + return { keyAuthorization_unsigned, hash } + })() + + // If no active credential, we will attempt to load the last active credential from storage. + const lastActiveCredential = !capabilities.selectAccount + ? await config.storage?.getItem('webAuthn.lastActiveCredential') + : undefined + const credential = await WebAuthnP256.getCredential({ + ...(options.getOptions ?? {}), + credentialId: lastActiveCredential?.id, + async getPublicKey(credential) { + const publicKey = await options.keyManager.getPublicKey({ + credential, + }) + if (!publicKey) throw new Error('publicKey not found.') + return publicKey + }, + hash, + rpId: options.getOptions?.rpId ?? options.rpId, + }) + + const keyAuthorization = keyAuthorization_unsigned + ? KeyAuthorization.from({ + ...keyAuthorization_unsigned, + signature: SignatureEnvelope.from({ + metadata: credential.metadata, + signature: credential.signature, + publicKey: PublicKey.fromHex(credential.publicKey), + type: 'webAuthn', + }), + }) + : undefined + + return { credential, keyAuthorization, keyPair } + } + })() + + config.storage?.setItem( + 'webAuthn.lastActiveCredential', + normalizeValue(credential), + ) + config.storage?.setItem( + 'webAuthn.activeCredential', + normalizeValue(credential), + ) + + account = Account.fromWebAuthnP256(credential) + + if (keyPair) { + accessKey = Account.fromWebCryptoP256(keyPair, { + access: account, + }) + + // If we are reconnecting, check if the access key is expired. + if (parameters.isReconnecting) { + if ( + 'keyAuthorization' in keyPair && + keyPair.keyAuthorization.expiry && + keyPair.keyAuthorization.expiry < Date.now() / 1000 + ) { + // remove any pending key authorizations from storage. + await config?.storage?.removeItem( + `pendingKeyAuthorization:${account.address.toLowerCase()}`, + ) + + const message = `Access key expired (on ${new Date(keyPair.keyAuthorization.expiry * 1000).toLocaleString()}).` + accessKey = undefined + + // if in strict mode, disconnect and throw an error. + if (accessKeyOptions?.strict) { + await this.disconnect() + throw new Error(message) + } + // otherwise, fall back to the root account. + // biome-ignore lint/suspicious/noConsole: notify + console.warn(`${message} Falling back to passkey.`) + } + } + // If we are not reconnecting, orchestrate the provisioning of the access key. + else { + const keyAuth = + keyAuthorization ?? + (await account.signKeyAuthorization(accessKey, accessKeyOptions)) + + await config?.storage?.setItem( + `pendingKeyAuthorization:${account.address.toLowerCase()}`, + keyAuth, + ) + await idb.set(`accessKey:${account.address.toLowerCase()}`, { + ...keyPair, + keyAuthorization: keyAuth, + }) + } + // If we are granting an access key and it is in strict mode, throw an error if the access key is not provisioned. + } else if (accessKeyOptions?.strict) { + await config.storage?.removeItem('webAuthn.activeCredential') + throw new Error('access key not found') + } + + const address = getAddress(account.address) + + const chainId = parameters.chainId ?? config.chains[0]?.id + if (!chainId) throw new ChainNotConfiguredError() + + return { + accounts: (parameters.withCapabilities + ? [{ address }] + : [address]) as never, + chainId, + } + }, + async disconnect() { + await config.storage?.removeItem('webAuthn.activeCredential') + config.emitter.emit('disconnect') + account = undefined + }, + async getAccounts() { + if (!account) return [] + return [getAddress(account.address)] + }, + async getChainId() { + return config.chains[0]?.id! + }, + async isAuthorized() { + try { + const accounts = await this.getAccounts() + return !!accounts.length + } catch (error) { + // biome-ignore lint/suspicious/noConsole: notify + console.error( + 'Connector.webAuthn: Failed to check authorization', + error, + ) + return false + } + }, + async switchChain({ chainId }) { + const chain = config.chains.find((chain) => chain.id === chainId) + if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) + return chain + }, + onAccountsChanged() {}, + onChainChanged(chain) { + const chainId = Number(chain) + config.emitter.emit('change', { chainId }) + }, + async onDisconnect() { + config.emitter.emit('disconnect') + account = undefined + }, + async getClient({ chainId } = {}) { + const chain = + config.chains.find((x) => x.id === chainId) ?? config.chains[0] + if (!chain) throw new ChainNotConfiguredError() + + const transports = config.transports + if (!transports) throw new ChainNotConfiguredError() + + const transport = transports[chain.id] + if (!transport) throw new ChainNotConfiguredError() + + const targetAccount = await (async () => { + if (!accessKey) return account + + const item = await idb.get( + `accessKey:${accessKey.address.toLowerCase()}`, + ) + if ( + item?.keyAuthorization.expiry && + item.keyAuthorization.expiry < Date.now() / 1000 + ) { + // remove any pending key authorizations from storage. + await config?.storage?.removeItem( + `pendingKeyAuthorization:${accessKey.address.toLowerCase()}`, + ) + + const message = `Access key expired (on ${new Date(item.keyAuthorization.expiry * 1000).toLocaleString()}).` + + // if in strict mode, disconnect and throw an error. + if (accessKeyOptions?.strict) { + await this.disconnect() + throw new Error(message) + } + + // otherwise, fall back to the root account. + // biome-ignore lint/suspicious/noConsole: notify + console.warn(`${message} Falling back to passkey.`) + return account + } + return accessKey + })() + if (!targetAccount) throw new Error('account not found.') + + const targetChain = defineChain({ + ...chain, + prepareTransactionRequest: [ + async (args, { phase }) => { + const keyAuthorization = await (async () => { + { + const keyAuthorization = ( + args as { + keyAuthorization?: + | KeyAuthorization.KeyAuthorization + | undefined + } + ).keyAuthorization + if (keyAuthorization) return keyAuthorization + } + + const keyAuthorization = await config.storage?.getItem( + `pendingKeyAuthorization:${targetAccount?.address.toLowerCase()}`, + ) + await config.storage?.removeItem( + `pendingKeyAuthorization:${targetAccount?.address.toLowerCase()}`, + ) + return keyAuthorization + })() + + const [prepareTransactionRequestFn, options] = (() => { + if (!chain.prepareTransactionRequest) + return [undefined, undefined] + if (typeof chain.prepareTransactionRequest === 'function') + return [chain.prepareTransactionRequest, undefined] + return chain.prepareTransactionRequest + })() + + const request = await (async () => { + if (!prepareTransactionRequestFn) return {} + if (!options || options?.runAt?.includes(phase)) + return await prepareTransactionRequestFn(args, { phase }) + return {} + })() + + return { + ...args, + ...request, + keyAuthorization, + } + }, + { + runAt: [ + 'afterFillParameters', + 'beforeFillParameters', + 'beforeFillTransaction', + ], + }, + ], + }) + + return createClient({ + account: targetAccount, + chain: targetChain, + transport: walletNamespaceCompat(transport, { + account: targetAccount, + }), + }) + }, + async getProvider({ chainId } = {}) { + const { request } = await this.getClient!({ chainId }) + return { request } + }, + })) +} + +export namespace webAuthn { + export type Parameters = { + /** Options for WebAuthn registration. */ + createOptions?: + | Pick< + WebAuthnP256.createCredential.Parameters, + 'createFn' | 'label' | 'rpId' | 'userId' | 'timeout' + > + | undefined + /** Options for WebAuthn authentication. */ + getOptions?: + | Pick + | undefined + /** + * Whether or not to grant an access key upon connection, and optionally, expiry + limits to assign to the key. + */ + grantAccessKey?: + | boolean + | (Pick & { + /** Whether or not to throw an error and disconnect if the access key is not provisioned or is expired. */ + strict?: boolean | undefined + }) + /** Public key manager. */ + keyManager: KeyManager.KeyManager + /** The RP ID to use for WebAuthn. */ + rpId?: string | undefined + } +} + +/** + * Normalizes a value into a structured-clone compatible format. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone + */ +function normalizeValue(value: type): type { + if (Array.isArray(value)) return value.map(normalizeValue) as never + if (typeof value === 'function') return undefined as never + if (typeof value !== 'object' || value === null) return value + if (Object.getPrototypeOf(value) !== Object.prototype) + try { + return structuredClone(value) + } catch { + return undefined as never + } + + const normalized: Record = {} + for (const [k, v] of Object.entries(value)) normalized[k] = normalizeValue(v) + return normalized as never +} + +// Based on `idb-keyval` +// https://github.com/jakearchibald/idb-keyval +let defaultGetStoreFunc: + | (( + txMode: IDBTransactionMode, + callback: (store: IDBObjectStore) => type | PromiseLike, + ) => Promise) + | undefined + +const idb = { + /** + * Get a value by its key. + * + * @param key + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ + get(key: IDBValidKey): Promise { + return this.defaultGetStore()('readonly', (store) => + this.promisifyRequest(store.get(key)), + ) + }, + /** + * Set a value with a key. + * + * @param key + * @param value + * @param customStore Method to get a custom store. Use with caution (see the docs). + */ + set(key: IDBValidKey, value: any): Promise { + return this.defaultGetStore()('readwrite', (store) => { + store.put(value, key) + return this.promisifyRequest(store.transaction) + }) + }, + defaultGetStore() { + if (!defaultGetStoreFunc) + defaultGetStoreFunc = this.createStore('keyval-store', 'keyval') + return defaultGetStoreFunc + }, + createStore( + dbName: string, + storeName: string, + ): NonNullable { + let dbp: Promise | undefined + + const getDB = () => { + if (dbp) return dbp + const request = indexedDB.open(dbName) + request.onupgradeneeded = () => + request.result.createObjectStore(storeName) + dbp = this.promisifyRequest(request) + + dbp.then( + (db) => { + // It seems like Safari sometimes likes to just close the connection. + // It's supposed to fire this event when that happens. Let's hope it does! + db.onclose = () => { + dbp = undefined + } + }, + () => {}, + ) + return dbp + } + + return (txMode, callback) => + getDB().then((db) => + callback(db.transaction(storeName, txMode).objectStore(storeName)), + ) + }, + promisifyRequest( + request: IDBRequest | IDBTransaction, + ): Promise { + return new Promise((resolve, reject) => { + // @ts-ignore - file size hacks + request.oncomplete = request.onsuccess = () => resolve(request.result) + // @ts-ignore - file size hacks + request.onabort = request.onerror = () => reject(request.error) + }) + }, +} + +/** @deprecated use `dangerous_secp256k1.Parameters` instead */ +export type Dangerous_Secp256k1Parameters = dangerous_secp256k1.Parameters + +dangerous_secp256k1.type = 'dangerous_secp256k1' as const + +/** + * Connector for a Secp256k1 EOA. + * + * WARNING: NOT RECOMMENDED FOR PRODUCTION USAGE. + * This connector stores private keys in clear text, and are bound to the session + * length of the storage used. + */ +export function dangerous_secp256k1( + options: dangerous_secp256k1.Parameters = {}, +) { + let account: LocalAccount | undefined + + type Properties = { + // TODO(v3): Make `withCapabilities: true` default behavior + connect(parameters: { + capabilities?: { type?: 'sign-up' | undefined } | undefined + chainId?: number | undefined + isReconnecting?: boolean | undefined + withCapabilities?: withCapabilities | boolean | undefined + }): Promise<{ + accounts: readonly Address.Address[] + chainId: number + }> + } + type Provider = Pick + type StorageItem = { + 'secp256k1.activeAddress': Address.Address + 'secp256k1.lastActiveAddress': Address.Address + [key: `secp256k1.${string}.privateKey`]: Hex.Hex + } + + return createConnector((config) => ({ + id: 'secp256k1', + name: 'EOA (Secp256k1)', + type: 'secp256k1', + async setup() { + const address = await config.storage?.getItem('secp256k1.activeAddress') + const privateKey = await config.storage?.getItem( + `secp256k1.${address}.privateKey`, + ) + if (privateKey) account = privateKeyToAccount(privateKey) + else if ( + address && + options.account && + Address.isEqual(address, options.account.address) + ) + account = options.account + }, + async connect(parameters = {}) { + const address = await (async () => { + if ( + 'capabilities' in parameters && + parameters.capabilities?.type === 'sign-up' + ) { + const privateKey = generatePrivateKey() + const account = privateKeyToAccount(privateKey) + const address = account.address + await config.storage?.setItem( + `secp256k1.${address}.privateKey`, + privateKey, + ) + await config.storage?.setItem('secp256k1.activeAddress', address) + await config.storage?.setItem('secp256k1.lastActiveAddress', address) + return address + } + + const address = await config.storage?.getItem( + 'secp256k1.lastActiveAddress', + ) + const privateKey = await config.storage?.getItem( + `secp256k1.${address}.privateKey`, + ) + + if (privateKey) account = privateKeyToAccount(privateKey) + else if (options.account) { + account = options.account + await config.storage?.setItem( + 'secp256k1.lastActiveAddress', + account.address, + ) + } + + if (!account) throw new Error('account not found.') + + await config.storage?.setItem( + 'secp256k1.activeAddress', + account.address, + ) + return account.address + })() + + const chainId = parameters.chainId ?? config.chains[0]?.id + if (!chainId) throw new ChainNotConfiguredError() + + return { + accounts: (parameters.withCapabilities + ? [{ address }] + : [address]) as never, + chainId, + } + }, + async disconnect() { + await config.storage?.removeItem('secp256k1.activeAddress') + account = undefined + }, + async getAccounts() { + if (!account) return [] + return [getAddress(account.address)] + }, + async getChainId() { + return config.chains[0]?.id! + }, + async isAuthorized() { + try { + const accounts = await this.getAccounts() + return !!accounts.length + } catch (error) { + // biome-ignore lint/suspicious/noConsole: notify + console.error( + 'Connector.secp256k1: Failed to check authorization', + error, + ) + return false + } + }, + async switchChain({ chainId }) { + const chain = config.chains.find((chain) => chain.id === chainId) + if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()) + return chain + }, + onAccountsChanged() {}, + onChainChanged(chain) { + const chainId = Number(chain) + config.emitter.emit('change', { chainId }) + }, + async onDisconnect() { + config.emitter.emit('disconnect') + account = undefined + }, + async getClient({ chainId } = {}) { + const chain = + config.chains.find((x) => x.id === chainId) ?? config.chains[0] + if (!chain) throw new ChainNotConfiguredError() + + const transports = config.transports + if (!transports) throw new ChainNotConfiguredError() + + const transport = transports[chain.id] + if (!transport) throw new ChainNotConfiguredError() + + if (!account) throw new Error('account not found.') + + return createClient({ + account, + chain, + transport: walletNamespaceCompat(transport, { + account, + }), + }) + }, + async getProvider({ chainId } = {}) { + const { request } = await this.getClient!({ chainId }) + return { request } + }, + })) +} + +export declare namespace dangerous_secp256k1 { + export type Parameters = { + account?: LocalAccount | undefined + } +} diff --git a/packages/core/src/tempo/KeyManager.ts b/packages/core/src/tempo/KeyManager.ts new file mode 100644 index 0000000000..4fad576080 --- /dev/null +++ b/packages/core/src/tempo/KeyManager.ts @@ -0,0 +1,176 @@ +import type { WebAuthnP256 } from 'ox' +import type * as Hex from 'ox/Hex' +import * as Json from 'ox/Json' +import { + type CreateStorageParameters, + createStorage, + type Storage, +} from '../createStorage.js' + +export type KeyManager = { + /** Function to fetch create options for WebAuthn. */ + getChallenge?: + | (() => Promise<{ + challenge: Hex.Hex + rp?: { id: string; name: string } | undefined + }>) + | undefined + /** Function to fetch the public key for a credential. */ + getPublicKey: (parameters: { + credential: WebAuthnP256.P256Credential['raw'] + }) => Promise + /** Function to set the public key for a credential. */ + setPublicKey: (parameters: { + credential: WebAuthnP256.P256Credential['raw'] + publicKey: Hex.Hex + }) => Promise +} + +/** Instantiates a key manager. */ +export function from(manager: manager): manager { + return manager +} + +/** Instantiates a key manager from a Storage instance. */ +export function fromStorage(storage: Storage): KeyManager { + return from({ + async getPublicKey(parameters) { + const publicKey = await storage.getItem(parameters.credential.id) + if (!publicKey) throw new Error('publicKey not found.') + return publicKey as Hex.Hex + }, + async setPublicKey(parameters) { + await storage.setItem(parameters.credential.id, parameters.publicKey) + }, + }) +} + +/** + * Instantiates a key manager from a localStorage instance. + * + * WARNING: Do not use this in production. + * This is because we are unable to extract a user's public key after the registration + * process. If a user clears their storage, or visits the website on a different device, + * they will not be able to access their account. + * + * Instead, we recommend to set up a remote store such as [`KeyManager.http`](#http) to register + * public keys against their WebAuthn credential. + * + * @see {@link http} + * + * @deprecated + */ +export function localStorage(options: localStorage.Options = {}) { + const { key = 'wagmi.keyManager' } = options + const storage = createStorage({ + ...options, + key, + storage: typeof window !== 'undefined' ? window.localStorage : undefined, + }) + return fromStorage(storage) +} + +export namespace localStorage { + export type Options = Omit +} + +/** + * Instantiates a key manager that uses HTTP endpoints for credential management. + * + * @example + * ```tsx + * import { KeyManager } from '@wagmi/core/tempo' + * + * const keyManager = KeyManager.http('https://api.example.com') + * ``` + * + * @param url - The URL to use for the HTTP endpoints. + * @param options - Configuration options for HTTP endpoints. + * @returns A KeyManager instance that uses HTTP for credential operations. + */ +export function http( + url: + | string + | { + getChallenge?: string | Request | undefined + getPublicKey?: string | Request | undefined + setPublicKey?: string | Request | undefined + }, + options: http.Options = {}, +): KeyManager { + const { fetch: fetchFn = globalThis.fetch } = options + const { getChallenge, getPublicKey, setPublicKey } = (() => { + const base = typeof url === 'string' ? url : '' + const urls = typeof url === 'object' ? url : {} + return { + getChallenge: urls.getChallenge ?? `${base}/challenge`, + getPublicKey: urls.getPublicKey ?? `${base}/:credentialId`, + setPublicKey: urls.setPublicKey ?? `${base}/:credentialId`, + } + })() + + return from({ + async getChallenge() { + const request = + getChallenge instanceof Request + ? getChallenge + : new Request(getChallenge) + + const response = await fetchFn(request) + + if (!response.ok) + throw new Error(`Failed to get create options: ${response.statusText}`) + return await response.json() + }, + + async getPublicKey(parameters) { + const request = + getPublicKey instanceof Request + ? getPublicKey + : new Request(getPublicKey) + + const response = await fetchFn( + new Request( + request.url.replace(':credentialId', parameters.credential.id), + request, + ), + ) + + if (!response.ok) + throw new Error(`Failed to get public key: ${response.statusText}`) + const data = await response.json() + return data.publicKey as Hex.Hex + }, + + async setPublicKey(parameters) { + const request = + setPublicKey instanceof Request + ? setPublicKey + : new Request(setPublicKey) + + const response = await fetchFn( + new Request( + request.url.replace(':credentialId', parameters.credential.id), + request, + ), + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: Json.stringify(parameters), + }, + ) + + if (!response.ok) + throw new Error(`Failed to set public key: ${response.statusText}`) + }, + }) +} + +export namespace http { + export type Options = { + /** Custom fetch function. @default `globalThis.fetch`. */ + fetch?: typeof fetch | undefined + } +} diff --git a/packages/core/src/tempo/actions/amm.test.ts b/packages/core/src/tempo/actions/amm.test.ts new file mode 100644 index 0000000000..7a4dffa3f4 --- /dev/null +++ b/packages/core/src/tempo/actions/amm.test.ts @@ -0,0 +1,209 @@ +import { connect, getConnectorClient } from '@wagmi/core' +import { + accounts, + addresses, + config, + queryClient, + viem_setupPoolWithLiquidity, +} from '@wagmi/test/tempo' +import { parseUnits } from 'viem' +import { describe, expect, test } from 'vitest' +import * as ammActions from './amm.js' +import * as tokenActions from './token.js' + +const account = accounts[0] + +describe('getPool', () => { + test('default', async () => { + const pool = await ammActions.getPool(config, { + userToken: addresses.alphaUsd, + validatorToken: '0x20c0000000000000000000000000000000000001', + }) + expect(pool).toMatchInlineSnapshot(` + { + "reserveUserToken": 0n, + "reserveValidatorToken": 0n, + "totalSupply": 0n, + } + `) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = ammActions.getPool.queryOptions(config, { + userToken: addresses.alphaUsd, + validatorToken: '0x20c0000000000000000000000000000000000001', + }) + const pool = await queryClient.fetchQuery(options) + expect(pool).toMatchInlineSnapshot(` + { + "reserveUserToken": 0n, + "reserveValidatorToken": 0n, + "totalSupply": 0n, + } + `) + }) + }) +}) + +describe('getLiquidityBalance', () => { + test('default', async () => { + const balance = await ammActions.getLiquidityBalance(config, { + userToken: addresses.alphaUsd, + validatorToken: '0x20c0000000000000000000000000000000000001', + address: account.address, + }) + expect(balance).toMatchInlineSnapshot('0n') + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = ammActions.getLiquidityBalance.queryOptions(config, { + userToken: addresses.alphaUsd, + validatorToken: '0x20c0000000000000000000000000000000000001', + address: account.address, + }) + const balance = await queryClient.fetchQuery(options) + expect(balance).toMatchInlineSnapshot('0n') + }) + }) +}) + +describe('mintSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token for testing + const { token } = await tokenActions.createSync(config, { + name: 'Test Token', + symbol: 'TEST', + currency: 'USD', + }) + + // Grant issuer role to mint tokens + await tokenActions.grantRolesSync(config, { + token, + roles: ['issuer'], + to: account.address, + }) + + // Mint some tokens to account + await tokenActions.mintSync(config, { + to: account.address, + amount: parseUnits('1000', 6), + token, + }) + + // Add liquidity to pool + const { receipt: mintReceipt, ...mintResult } = await ammActions.mintSync( + config, + { + userTokenAddress: token, + validatorTokenAddress: addresses.alphaUsd, + validatorTokenAmount: parseUnits('100', 6), + to: account.address, + }, + ) + expect(mintReceipt).toBeDefined() + expect(mintResult.amountValidatorToken).toBe(100000000n) + expect(mintResult.liquidity).toBe(49999000n) + expect(mintResult.sender).toBe(account.address) + expect(mintResult.to).toBe(account.address) + expect(mintResult.validatorToken.toLowerCase()).toBe( + addresses.alphaUsd.toLowerCase(), + ) + }) +}) + +describe.skip('burnSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const client = await getConnectorClient(config) + const { tokenAddress } = await viem_setupPoolWithLiquidity(client) + + const account2 = accounts[1] + + // Get LP balance before burn + const lpBalanceBefore = await ammActions.getLiquidityBalance(config, { + userToken: tokenAddress, + validatorToken: addresses.alphaUsd, + address: account.address, + }) + + // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool + await tokenActions.transferSync(config, { + to: account2.address, + amount: 600n, + token: tokenAddress, + feeToken: tokenAddress, + }) + + // Burn half of LP tokens + const { receipt: burnReceipt, ...burnResult } = await ammActions.burnSync( + config, + { + userToken: tokenAddress, + validatorToken: addresses.alphaUsd, + liquidity: lpBalanceBefore / 2n, + to: account.address, + }, + ) + expect(burnReceipt).toBeDefined() + expect(burnResult).toMatchInlineSnapshot(` + { + "amountUserToken": 337n, + "amountValidatorToken": 49998664n, + "liquidity": 24999500n, + "sender": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "userToken": "0x20c0000000000000000000000000000000000005", + "validatorToken": "0x20C0000000000000000000000000000000000001", + } + `) + }) +}) + +describe.skip('rebalanceSwapSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const client = await getConnectorClient(config) + const { tokenAddress } = await viem_setupPoolWithLiquidity(client) + + const account2 = accounts[1] + + // TODO(TEMPO-1183): Remove this janky fix to get some user token in the pool + await tokenActions.transferSync(config, { + to: account2.address, + amount: 600n, + token: tokenAddress, + feeToken: tokenAddress, + }) + + // Perform rebalance swap + const { receipt: swapReceipt, ...swapResult } = + await ammActions.rebalanceSwapSync(config, { + userToken: tokenAddress, + validatorToken: addresses.alphaUsd, + amountOut: 100n, + to: account2.address, + }) + expect(swapReceipt).toBeDefined() + expect(swapResult).toMatchInlineSnapshot(` + { + "amountIn": 100n, + "amountOut": 100n, + "swapper": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "userToken": "0x20C0000000000000000000000000000000000006", + "validatorToken": "0x20C0000000000000000000000000000000000001", + } + `) + }) +}) diff --git a/packages/core/src/tempo/actions/amm.ts b/packages/core/src/tempo/actions/amm.ts new file mode 100644 index 0000000000..a50bbbedf9 --- /dev/null +++ b/packages/core/src/tempo/actions/amm.ts @@ -0,0 +1,678 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' +import { filterQueryOptions } from './utils.js' + +/** + * Gets the reserves for a liquidity pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const pool = await Actions.amm.getPool(config, { + * userToken: '0x...', + * validatorToken: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The pool reserves. + */ +export function getPool( + config: config, + parameters: getPool.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.amm.getPool(client, rest) +} + +export namespace getPool { + export type Parameters = ChainIdParameter & + Actions.amm.getPool.Parameters + + export type ReturnValue = Actions.amm.getPool.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getPool', filterQueryOptions(parameters)] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.userToken && rest.validatorToken && (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getPool(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getPool.ReturnValue, + > = getPool.Parameters & + QueryParameter< + getPool.ReturnValue, + getPool.ErrorType, + selectData, + getPool.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getPool.ReturnValue, + > = QueryOptions< + getPool.ReturnValue, + getPool.ErrorType, + selectData, + getPool.QueryKey + > + } +} + +/** + * Gets the LP token balance for an account in a specific pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const poolId = await Actions.amm.getPoolId(config, { + * userToken: '0x...', + * validatorToken: '0x...', + * }) + * + * const balance = await Actions.amm.getLiquidityBalance(config, { + * poolId, + * address: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The LP token balance. + */ +export function getLiquidityBalance( + config: config, + parameters: getLiquidityBalance.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.amm.getLiquidityBalance(client, rest) +} + +export namespace getLiquidityBalance { + export type Parameters = ChainIdParameter & + Actions.amm.getLiquidityBalance.Parameters + + export type ReturnValue = Actions.amm.getLiquidityBalance.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getLiquidityBalance', filterQueryOptions(parameters)] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.address && + (rest.poolId || + (rest.userToken !== undefined && + rest.validatorToken !== undefined)) && + (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getLiquidityBalance(config, parameters as any) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getLiquidityBalance.ReturnValue, + > = getLiquidityBalance.Parameters & + QueryParameter< + getLiquidityBalance.ReturnValue, + getLiquidityBalance.ErrorType, + selectData, + getLiquidityBalance.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getLiquidityBalance.ReturnValue, + > = QueryOptions< + getLiquidityBalance.ReturnValue, + getLiquidityBalance.ErrorType, + selectData, + getLiquidityBalance.QueryKey + > + } +} + +/** + * Performs a rebalance swap from validator token to user token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.amm.rebalanceSwap(config, { + * userToken: '0x...', + * validatorToken: '0x...', + * amountOut: 100n, + * to: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function rebalanceSwap( + config: config, + parameters: rebalanceSwap.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.rebalanceSwap(client, parameters as never) +} + +export declare namespace rebalanceSwap { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.rebalanceSwap.Parameters, + 'chain' + > + + export type ReturnValue = Actions.amm.rebalanceSwap.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Performs a rebalance swap from validator token to user token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.amm.rebalanceSwapSync(config, { + * userToken: '0x...', + * validatorToken: '0x...', + * amountOut: 100n, + * to: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function rebalanceSwapSync( + config: config, + parameters: rebalanceSwapSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.rebalanceSwapSync(client, parameters as never) +} + +export declare namespace rebalanceSwapSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.rebalanceSwapSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.amm.rebalanceSwapSync.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Adds liquidity to a pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.amm.mint(config, { + * userTokenAddress: '0x20c0...beef', + * validatorTokenAddress: '0x20c0...babe', + * validatorTokenAmount: 100n, + * to: '0xfeed...fede', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function mint( + config: config, + parameters: mint.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.mint(client, parameters as never) +} + +export declare namespace mint { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.mint.Parameters, + 'chain' + > + + export type ReturnValue = Actions.amm.mint.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Adds liquidity to a pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.amm.mintSync(config, { + * userTokenAddress: '0x20c0...beef', + * validatorTokenAddress: '0x20c0...babe', + * validatorTokenAmount: 100n, + * to: '0xfeed...fede', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function mintSync( + config: config, + parameters: mintSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.mintSync(client, parameters as never) +} + +export declare namespace mintSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.mintSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.amm.mintSync.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Removes liquidity from a pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.amm.burn(config, { + * userToken: '0x20c0...beef', + * validatorToken: '0x20c0...babe', + * liquidity: 50n, + * to: '0xfeed...fede', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function burn( + config: config, + parameters: burn.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.burn(client, parameters as never) +} + +export declare namespace burn { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.burn.Parameters, + 'chain' + > + + export type ReturnValue = Actions.amm.burn.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Removes liquidity from a pool. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.amm.burnSync(config, { + * userToken: '0x20c0...beef', + * validatorToken: '0x20c0...babe', + * liquidity: 50n, + * to: '0xfeed...fede', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function burnSync( + config: config, + parameters: burnSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.amm.burnSync(client, parameters as never) +} + +export declare namespace burnSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.amm.burnSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.amm.burnSync.ReturnValue + + export type ErrorType = BaseErrorType +} + +/** + * Watches for rebalance swap events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.amm.watchRebalanceSwap(config, { + * onRebalanceSwap: (args, log) => { + * console.log('Rebalance swap:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchRebalanceSwap( + config: config, + parameters: watchRebalanceSwap.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.amm.watchRebalanceSwap(client, rest) +} + +export declare namespace watchRebalanceSwap { + export type Parameters = ChainIdParameter & + Actions.amm.watchRebalanceSwap.Parameters +} + +/** + * Watches for liquidity mint events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.amm.watchMint(config, { + * onMint: (args, log) => { + * console.log('Liquidity added:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchMint( + config: config, + parameters: watchMint.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.amm.watchMint(client, rest) +} + +export declare namespace watchMint { + export type Parameters = ChainIdParameter & + Actions.amm.watchMint.Parameters +} + +/** + * Watches for liquidity burn events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.amm.watchBurn(config, { + * onBurn: (args, log) => { + * console.log('Liquidity removed:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchBurn( + config: config, + parameters: watchBurn.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.amm.watchBurn(client, rest) +} + +export declare namespace watchBurn { + export type Parameters = ChainIdParameter & + Actions.amm.watchBurn.Parameters +} diff --git a/packages/core/src/tempo/actions/dex.test.ts b/packages/core/src/tempo/actions/dex.test.ts new file mode 100644 index 0000000000..2892e0c134 --- /dev/null +++ b/packages/core/src/tempo/actions/dex.test.ts @@ -0,0 +1,1577 @@ +import { connect } from '@wagmi/core' +import { + accounts, + addresses, + config, + setupOrders, + setupTokenPair, +} from '@wagmi/test/tempo' +import { isAddress, parseUnits } from 'viem' +import { Tick } from 'viem/tempo' +import { beforeAll, describe, expect, test } from 'vitest' +import * as dex from './dex.js' +import * as token from './token.js' + +const account = accounts[0] +const account2 = accounts[1] + +beforeAll(async () => { + await setupOrders() +}) + +describe('buy', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place ask order to create liquidity + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + // Get initial balances + const baseBalanceBefore = await token.getBalance(config, { + token: base, + account: account.address, + }) + + // Buy base tokens with quote tokens + const { receipt } = await dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('150', 6), + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + + // Verify balances changed + const baseBalanceAfter = await token.getBalance(config, { + token: base, + account: account.address, + }) + + // Should have received base tokens + expect(baseBalanceAfter).toBeGreaterThan(baseBalanceBefore) + }) + + test('behavior: respects maxAmountIn', async () => { + const { base, quote } = await setupTokenPair() + + // Place ask order at high price + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'sell', + tick: Tick.fromPrice('1.01'), // 1% above peg + }) + + // Try to buy with insufficient maxAmountIn - should fail + await expect( + dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('50', 6), // Way too low for 1% premium + }), + ).rejects.toThrow('The contract function "swapExactAmountOut" reverted') + }) + + test('behavior: fails with insufficient liquidity', async () => { + const { base, quote } = await setupTokenPair() + + // Don't place any orders - no liquidity + + // Try to buy - should fail due to no liquidity + await expect( + dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('150', 6), + }), + ).rejects.toThrow('The contract function "swapExactAmountOut" reverted') + }) +}) + +describe('cancel', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place a bid order + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Check initial DEX balance (should be 0) + const dexBalanceBefore = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(dexBalanceBefore).toBe(0n) + + // Cancel the order + const { receipt, ...result } = await dex.cancelSync(config, { + orderId, + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + expect(result.orderId).toBe(orderId) + + // Check DEX balance after cancel - tokens should be refunded to internal balance + const dexBalanceAfter = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(dexBalanceAfter).toBeGreaterThan(0n) + }) + + test('behavior: only maker can cancel', async () => { + const { base } = await setupTokenPair() + + // Account places order + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Transfer gas to account2 + await token.transferSync(config, { + to: account2.address, + amount: parseUnits('1', 6), + token: addresses.alphaUsd, + }) + + // Use a different account via the connector + await connect(config, { + connector: config.connectors[1]!, + }) + + // Account2 tries to cancel - should fail + await expect( + dex.cancelSync(config, { + orderId, + }), + ).rejects.toThrow('The contract function "cancel" reverted') + }) + + test('behavior: cannot cancel non-existent order', async () => { + await setupTokenPair() + + // Try to cancel an order that doesn't exist + await expect( + dex.cancelSync(config, { + orderId: 999n, + }), + ).rejects.toThrow('The contract function "cancel" reverted') + }) +}) + +describe('createPair', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const { token: baseToken } = await token.createSync(config, { + name: 'Test Base Token', + symbol: 'BASE', + currency: 'USD', + admin: account, + }) + + const { receipt, ...result } = await dex.createPairSync(config, { + base: baseToken, + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + + const { key, ...rest } = result + expect(key).toBeDefined() + expect(rest).toEqual( + expect.objectContaining({ + base: expect.toSatisfy(isAddress), + quote: expect.toSatisfy(isAddress), + }), + ) + }) +}) + +describe('getBalance', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Initial balance should be 0 + const initialBalance = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(initialBalance).toBe(0n) + + // Place and cancel order to create internal balance + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.0005'), + }) + + await dex.cancelSync(config, { + orderId, + }) + + // Now balance should be > 0 (refunded quote tokens) + const balance = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(balance).toBeGreaterThan(0n) + }) + + test('behavior: check different account', async () => { + const { quote } = await setupTokenPair() + + // Check account2's balance (should be 0) + const balance = await dex.getBalance(config, { + account: account2.address, + token: quote, + }) + expect(balance).toBe(0n) + }) + + test('behavior: balances are per-token', async () => { + const { base, quote } = await setupTokenPair() + + // Create balance in quote token + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + await dex.cancelSync(config, { orderId }) + + // Check quote balance (should have refunded tokens) + const quoteBalance = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(quoteBalance).toBeGreaterThan(0n) + + // Check base balance (should still be 0) + const baseBalance = await dex.getBalance(config, { + account: account.address, + token: base, + }) + expect(baseBalance).toBe(0n) + }) +}) + +describe('getBuyQuote', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place ask orders to create liquidity + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + // Get quote for buying base tokens + const amountIn = await dex.getBuyQuote(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + }) + + expect(amountIn).toBeGreaterThan(0n) + // Should be approximately 100 * 1.001 = 100.1 + expect(amountIn).toBeGreaterThan(parseUnits('100', 6)) + }) + + test('behavior: fails with no liquidity', async () => { + const { base, quote } = await setupTokenPair() + + // No orders placed - no liquidity + + // Quote should fail + await expect( + dex.getBuyQuote(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + }), + ).rejects.toThrow( + 'The contract function "quoteSwapExactAmountOut" reverted', + ) + }) +}) + +describe('getOrder', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + // Place an order to get an order ID + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Get the order details + const order = await dex.getOrder(config, { + orderId, + }) + + expect(order).toBeDefined() + expect(order.maker).toBe(account.address) + expect(order.isBid).toBe(true) + expect(order.tick).toBe(Tick.fromPrice('1.001')) + expect(order.amount).toBe(parseUnits('100', 6)) + expect(order.remaining).toBe(parseUnits('100', 6)) + expect(order.isFlip).toBe(false) + }) + + test('behavior: returns flip order details', async () => { + const { base } = await setupTokenPair() + + // Place a flip order + const { orderId } = await dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.002'), + }) + + // Get the order details + const order = await dex.getOrder(config, { + orderId, + }) + + expect(order).toBeDefined() + expect(order.maker).toBe(account.address) + expect(order.isBid).toBe(true) + expect(order.tick).toBe(Tick.fromPrice('1.001')) + expect(order.amount).toBe(parseUnits('100', 6)) + expect(order.isFlip).toBe(true) + expect(order.flipTick).toBe(Tick.fromPrice('1.002')) + }) + + test('behavior: fails for non-existent order', async () => { + await setupTokenPair() + + // Try to get an order that doesn't exist + await expect( + dex.getOrder(config, { + orderId: 999n, + }), + ).rejects.toThrow('The contract function "getOrder" reverted') + }) + + test('behavior: reflects order state after partial fill', async () => { + const { base, quote } = await setupTokenPair() + + // Place a large sell order + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + // Get initial order state + const orderBefore = await dex.getOrder(config, { + orderId, + }) + expect(orderBefore.amount).toBe(parseUnits('500', 6)) + expect(orderBefore.remaining).toBe(parseUnits('500', 6)) + + // Partially fill the order with a buy + await dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('150', 6), + }) + + // Get order state after partial fill + const orderAfter = await dex.getOrder(config, { + orderId, + }) + expect(orderAfter.amount).toBe(parseUnits('500', 6)) // amount unchanged + expect(orderAfter.remaining).toBeLessThan(parseUnits('500', 6)) // remaining decreased + }) + + test('behavior: linked list pointers for multiple orders at same tick', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place first order + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Place second order at same tick + const { orderId: orderId2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Get first order + const order1 = await dex.getOrder(config, { + orderId: orderId1, + }) + expect(order1.prev).toBe(0n) // should be 0 as it's first + expect(order1.next).toBe(orderId2) // should point to second order + + // Get second order + const order2 = await dex.getOrder(config, { + orderId: orderId2, + }) + expect(order2.prev).toBe(orderId1) // should point to first order + expect(order2.next).toBe(0n) // should be 0 as it's last + }) +}) + +describe('getOrderbook', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Get orderbook information + const book = await dex.getOrderbook(config, { + base, + quote, + }) + + expect(book).toBeDefined() + expect(book.base).toBe(base) + expect(book.quote).toBe(quote) + expect(book.bestBidTick).toBeDefined() + expect(book.bestAskTick).toBeDefined() + }) + + test('behavior: shows best bid and ask after orders placed', async () => { + const { base, quote } = await setupTokenPair() + + const bidTick = Tick.fromPrice('0.999') + const askTick = Tick.fromPrice('1.001') + + // Place a bid order + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: bidTick, + }) + + // Place an ask order + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: askTick, + }) + + // Get orderbook + const book = await dex.getOrderbook(config, { + base, + quote, + }) + + expect(book.bestBidTick).toBe(bidTick) + expect(book.bestAskTick).toBe(askTick) + }) + + test('behavior: best ticks update after better orders placed', async () => { + const { base, quote } = await setupTokenPair() + + // Place initial bid at 0.999 + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('0.999'), + }) + + // Get orderbook + const bookBefore = await dex.getOrderbook(config, { + base, + quote, + }) + expect(bookBefore.bestBidTick).toBe(Tick.fromPrice('0.999')) + + // Place better bid at 1.0 + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.0'), + }) + + // Get orderbook again + const bookAfter = await dex.getOrderbook(config, { + base, + quote, + }) + expect(bookAfter.bestBidTick).toBe(Tick.fromPrice('1.0')) + }) + + test.todo('behavior: best ticks update after order cancellation') + + test('behavior: multiple pairs have independent orderbooks', async () => { + const { base: base1, quote: quote1 } = await setupTokenPair() + const { base: base2, quote: quote2 } = await setupTokenPair() + + // Place order on first pair + await dex.placeSync(config, { + token: base1, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Place order on second pair at different tick + await dex.placeSync(config, { + token: base2, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('0.999'), + }) + + // Get orderbooks + const book1 = await dex.getOrderbook(config, { + base: base1, + quote: quote1, + }) + + const book2 = await dex.getOrderbook(config, { + base: base2, + quote: quote2, + }) + + // Each pair should have its own best tick + expect(book1.bestBidTick).toBe(Tick.fromPrice('1.001')) + expect(book2.bestBidTick).toBe(Tick.fromPrice('0.999')) + }) +}) + +describe('getTickLevel', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place an order to create liquidity at this tick + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Get the price level + const level = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + expect(level).toBeDefined() + expect(level.head).toBe(orderId) // head should be our order + expect(level.tail).toBe(orderId) // tail should also be our order (only one) + expect(level.totalLiquidity).toBeGreaterThan(0n) + }) + + test('behavior: empty price level', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Query a tick with no orders + const level = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + expect(level).toBeDefined() + expect(level.head).toBe(0n) + expect(level.tail).toBe(0n) + expect(level.totalLiquidity).toBe(0n) + }) + + test('behavior: multiple orders at same tick', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place first order + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Place second order at same tick + const { orderId: orderId2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Get the price level + const level = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + expect(level.head).toBe(orderId1) // head should be first order + expect(level.tail).toBe(orderId2) // tail should be last order + // Total liquidity should be sum of both orders (approximately) + expect(level.totalLiquidity).toBeGreaterThan(parseUnits('145', 6)) + }) + + test('behavior: bid vs ask sides', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place a buy order (bid) + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Place a sell order (ask) at same tick + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick, + }) + + // Get bid side + const bidLevel = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + // Get ask side + const askLevel = await dex.getTickLevel(config, { + base, + tick, + isBid: false, + }) + + // Both should have liquidity but different amounts + expect(bidLevel.totalLiquidity).toBeGreaterThan(0n) + expect(askLevel.totalLiquidity).toBeGreaterThan(0n) + expect(bidLevel.head).not.toBe(askLevel.head) + }) + + test('behavior: liquidity changes after order cancellation', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place orders + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Get level before cancellation + const levelBefore = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + // Cancel first order + await dex.cancelSync(config, { + orderId: orderId1, + }) + + // Get level after cancellation + const levelAfter = await dex.getTickLevel(config, { + base, + tick, + isBid: true, + }) + + // Total liquidity should decrease + expect(levelAfter.totalLiquidity).toBeLessThan(levelBefore.totalLiquidity) + }) + + test('behavior: liquidity changes after partial fill', async () => { + const { base, quote } = await setupTokenPair() + + const tick = Tick.fromPrice('1.001') + + // Place sell order + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'sell', + tick, + }) + + // Get level before fill + const levelBefore = await dex.getTickLevel(config, { + base, + tick, + isBid: false, + }) + + // Partially fill the order + await dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('150', 6), + }) + + // Get level after fill + const levelAfter = await dex.getTickLevel(config, { + base, + tick, + isBid: false, + }) + + // Total liquidity should decrease + expect(levelAfter.totalLiquidity).toBeLessThan(levelBefore.totalLiquidity) + }) + + test('behavior: tick at boundaries', async () => { + const { base } = await setupTokenPair() + + // Place order at min tick + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.minTick, + }) + + // Query min tick + const minLevel = await dex.getTickLevel(config, { + base, + tick: Tick.minTick, + isBid: false, + }) + expect(minLevel.totalLiquidity).toBeGreaterThan(0n) + + // Place order at max tick + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.maxTick, + }) + + // Query max tick + const maxLevel = await dex.getTickLevel(config, { + base, + tick: Tick.maxTick, + isBid: true, + }) + expect(maxLevel.totalLiquidity).toBeGreaterThan(0n) + }) +}) + +describe('getSellQuote', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place bid orders to create liquidity + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'buy', + tick: Tick.fromPrice('0.999'), + }) + + // Get quote for selling base tokens + const amountOut = await dex.getSellQuote(config, { + tokenIn: base, + tokenOut: quote, + amountIn: parseUnits('100', 6), + }) + + expect(amountOut).toBeGreaterThan(0n) + // Should be approximately 100 * 0.999 = 99.9 + expect(amountOut).toBeLessThan(parseUnits('100', 6)) + }) + + test('behavior: fails with no liquidity', async () => { + const { base, quote } = await setupTokenPair() + + // Quote should fail with no liquidity + await expect( + dex.getSellQuote(config, { + tokenIn: base, + tokenOut: quote, + amountIn: parseUnits('100', 6), + }), + ).rejects.toThrow('The contract function "quoteSwapExactAmountIn" reverted') + }) +}) + +describe('place', () => { + test('default', async () => { + // Setup token pair + const { base } = await setupTokenPair() + + // Place a sell order + const { receipt, orderId, token, ...result } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + expect(orderId).toBeGreaterThan(0n) + expect(token).toBe(base) + expect(result).toMatchInlineSnapshot(` + { + "amount": 100000000n, + "flipTick": 0, + "isBid": false, + "isFlipOrder": false, + "maker": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "tick": 100, + } + `) + + // Place a buy order + const { + receipt: receipt2, + orderId: orderId2, + token: token2, + ...result2 + } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + expect(receipt2.status).toBe('success') + expect(orderId2).toBeGreaterThan(0n) + expect(token2).toBe(base) + expect(result2).toMatchInlineSnapshot(` + { + "amount": 100000000n, + "flipTick": 0, + "isBid": true, + "isFlipOrder": false, + "maker": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "tick": 100, + } + `) + }) + + test('behavior: tick at boundaries', async () => { + const { base } = await setupTokenPair() + + // Test at min tick (-2000) + const { receipt: receipt1, ...result1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.minTick, + }) + expect(receipt1.status).toBe('success') + expect(result1.tick).toBe(-2000) + + // Test at max tick (2000) + const { receipt: receipt2, ...result2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.maxTick, + }) + expect(receipt2.status).toBe('success') + expect(result2.tick).toBe(2000) + }) + + test('behavior: tick validation fails outside bounds', async () => { + const { base } = await setupTokenPair() + + // Test tick above max tick should fail + await expect( + dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.maxTick + 1, + }), + ).rejects.toThrow('The contract function "place" reverted') + + // Test tick below min tick should fail + await expect( + dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.minTick - 1, + }), + ).rejects.toThrow('The contract function "place" reverted') + }) + + test('behavior: transfers from wallet', async () => { + const { base, quote } = await setupTokenPair() + + // Get balances before placing order + const baseBalanceBefore = await token.getBalance(config, { + token: base, + account: account.address, + }) + const quoteBalanceBefore = await token.getBalance(config, { + token: quote, + account: account.address, + }) + + // Place a buy order - should transfer quote tokens to escrow + const orderAmount = parseUnits('100', 6) + const tick = Tick.fromPrice('1.001') + await dex.placeSync(config, { + token: base, + amount: orderAmount, + type: 'buy', + tick, + }) + + // Get balances after placing order + const baseBalanceAfter = await token.getBalance(config, { + token: base, + account: account.address, + }) + const quoteBalanceAfter = await token.getBalance(config, { + token: quote, + account: account.address, + }) + + // Base token balance should be unchanged (we're buying base, not selling) + expect(baseBalanceAfter).toBe(baseBalanceBefore) + + // Quote token balance should decrease (escrowed for the bid) + // Amount = orderAmount * (1 + tick/1000) for bids + const expectedQuoteEscrowed = + (orderAmount * BigInt(100000 + tick)) / BigInt(100000) + expect(quoteBalanceBefore - quoteBalanceAfter).toBeGreaterThanOrEqual( + expectedQuoteEscrowed, + ) + }) + + test('behavior: multiple orders at same tick', async () => { + const { base } = await setupTokenPair() + + const tick = Tick.fromPrice('1.0005') + + // Place first order + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Place second order at same tick + const { orderId: orderId2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick, + }) + + // Order IDs should be different and sequential + expect(orderId2).toBeGreaterThan(orderId1) + }) +}) + +describe('placeFlip', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + // Place a flip bid order + const { receipt, orderId, token, ...result } = await dex.placeFlipSync( + config, + { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.002'), + }, + ) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + expect(orderId).toBeGreaterThan(0n) + expect(token).toBe(base) + expect(result.flipTick).toBe(Tick.fromPrice('1.002')) + expect(result).toMatchInlineSnapshot(` + { + "amount": 100000000n, + "flipTick": 200, + "isBid": true, + "isFlipOrder": true, + "maker": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "tick": 100, + } + `) + }) + + test('behavior: flip bid requires flipTick > tick', async () => { + const { base } = await setupTokenPair() + + // Valid: flipTick > tick for bid + const { receipt: receipt1 } = await dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.0005'), + flipTick: Tick.fromPrice('1.001'), + }) + expect(receipt1.status).toBe('success') + + // Invalid: flipTick <= tick for bid should fail + await expect( + dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.001'), // Equal + }), + ).rejects.toThrow('The contract function "placeFlip" reverted') + + await expect( + dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.0005'), // Less than + }), + ).rejects.toThrow('The contract function "placeFlip" reverted') + }) + + test('behavior: flip ask requires flipTick < tick', async () => { + const { base } = await setupTokenPair() + + // Valid: flipTick < tick for ask + const { receipt: receipt1 } = await dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.0005'), + }) + expect(receipt1.status).toBe('success') + + // Invalid: flipTick >= tick for ask should fail + await expect( + dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.0005'), + flipTick: Tick.fromPrice('1.0005'), // Equal + }), + ).rejects.toThrow('The contract function "placeFlip" reverted') + + await expect( + dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.0005'), + flipTick: Tick.fromPrice('1.001'), // Greater than + }), + ).rejects.toThrow('The contract function "placeFlip" reverted') + }) + + test('behavior: flip ticks at boundaries', async () => { + const { base } = await setupTokenPair() + + // Flip order with ticks at extreme boundaries + const { receipt } = await dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.minTick, + flipTick: Tick.maxTick, + }) + expect(receipt.status).toBe('success') + }) +}) + +describe('sell', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place bid order to create liquidity + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'buy', + tick: Tick.fromPrice('0.999'), + }) + + // Sell base tokens + const { receipt } = await dex.sellSync(config, { + tokenIn: base, + tokenOut: quote, + amountIn: parseUnits('100', 6), + minAmountOut: parseUnits('50', 6), + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + }) + + test('behavior: respects minAmountOut', async () => { + const { base, quote } = await setupTokenPair() + + // Place bid order at low price + await dex.placeSync(config, { + token: base, + amount: parseUnits('500', 6), + type: 'buy', + tick: Tick.fromPrice('0.99'), // 1% below peg + }) + + // Try to sell with too high minAmountOut - should fail + await expect( + dex.sellSync(config, { + tokenIn: base, + tokenOut: quote, + amountIn: parseUnits('100', 6), + minAmountOut: parseUnits('150', 6), // Way too high + }), + ).rejects.toThrow('The contract function "swapExactAmountIn" reverted') + }) + + test('behavior: fails with insufficient liquidity', async () => { + const { base, quote } = await setupTokenPair() + + // No orders - no liquidity + + // Try to sell - should fail + await expect( + dex.sellSync(config, { + tokenIn: base, + tokenOut: quote, + amountIn: parseUnits('100', 6), + minAmountOut: parseUnits('50', 6), + }), + ).rejects.toThrow('The contract function "swapExactAmountIn" reverted') + }) +}) + +describe('watchFlipOrderPlaced', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + const receivedOrders: Array<{ + args: dex.watchFlipOrderPlaced.Args + log: dex.watchFlipOrderPlaced.Log + }> = [] + + const unwatch = dex.watchFlipOrderPlaced(config, { + onFlipOrderPlaced: (args, log) => { + receivedOrders.push({ args, log }) + }, + }) + + try { + // Place flip order + await dex.placeFlipSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + flipTick: Tick.fromPrice('1.002'), + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + expect(receivedOrders).toHaveLength(1) + expect(receivedOrders[0]?.args.flipTick).toBe(Tick.fromPrice('1.002')) + expect(receivedOrders[0]?.args.tick).toBe(Tick.fromPrice('1.001')) + } finally { + unwatch() + } + }) +}) + +describe('watchOrderCancelled', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + const receivedCancellations: Array<{ + args: dex.watchOrderCancelled.Args + log: dex.watchOrderCancelled.Log + }> = [] + + const unwatch = dex.watchOrderCancelled(config, { + onOrderCancelled: (args, log) => { + receivedCancellations.push({ args, log }) + }, + }) + + try { + // Place order + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Cancel order + await dex.cancelSync(config, { + orderId, + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + expect(receivedCancellations).toHaveLength(1) + expect(receivedCancellations[0]?.args.orderId).toBe(orderId) + } finally { + unwatch() + } + }) + + test('behavior: filter by orderId', async () => { + const { base } = await setupTokenPair() + + // Place two orders + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + const { orderId: orderId2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + const receivedCancellations: Array<{ + args: dex.watchOrderCancelled.Args + log: dex.watchOrderCancelled.Log + }> = [] + + // Watch only for cancellation of orderId1 + const unwatch = dex.watchOrderCancelled(config, { + orderId: orderId1, + onOrderCancelled: (args, log) => { + receivedCancellations.push({ args, log }) + }, + }) + + try { + // Cancel orderId1 (should be captured) + await dex.cancelSync(config, { + orderId: orderId1, + }) + + // Cancel orderId2 (should NOT be captured) + await dex.cancelSync(config, { + orderId: orderId2, + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + // Should only receive 1 event + expect(receivedCancellations).toHaveLength(1) + expect(receivedCancellations[0]?.args.orderId).toBe(orderId1) + } finally { + unwatch() + } + }) +}) + +describe('watchOrderFilled', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Place a sell order to create liquidity + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + const receivedFills: Array<{ + args: dex.watchOrderFilled.Args + log: dex.watchOrderFilled.Log + }> = [] + + const unwatch = dex.watchOrderFilled(config, { + onOrderFilled: (args, log) => { + receivedFills.push({ args, log }) + }, + }) + + try { + // Buy from the order to trigger a fill + await dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('50', 6), + maxAmountIn: parseUnits('100', 6), + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + expect(receivedFills.length).toBeGreaterThanOrEqual(1) + expect(receivedFills[0]?.args.orderId).toBe(orderId) + expect(receivedFills[0]?.args.maker).toBe(account.address) + expect(receivedFills[0]?.args.taker).toBe(account.address) + expect(receivedFills[0]?.args.amountFilled).toBeGreaterThan(0n) + } finally { + unwatch() + } + }) + + test('behavior: filter by orderId', async () => { + const { base, quote } = await setupTokenPair() + + // Place two sell orders + const { orderId: orderId1 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.001'), + }) + + const { orderId: orderId2 } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('1.002'), + }) + + const receivedFills: Array<{ + args: dex.watchOrderFilled.Args + log: dex.watchOrderFilled.Log + }> = [] + + // Watch only for fills on orderId1 + const unwatch = dex.watchOrderFilled(config, { + orderId: orderId1, + onOrderFilled: (args, log) => { + receivedFills.push({ args, log }) + }, + }) + + try { + // Buy enough to fill orderId1 only (cheaper price first) + await dex.buySync(config, { + tokenIn: quote, + tokenOut: base, + amountOut: parseUnits('50', 6), + maxAmountIn: parseUnits('100', 6), + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + // Should only receive fill for orderId1 + expect(receivedFills.length).toBe(1) + expect(receivedFills[0]?.args.orderId).toBe(orderId1) + + // Suppress unused variable warning + void orderId2 + } finally { + unwatch() + } + }) +}) + +describe('watchOrderPlaced', () => { + test('default', async () => { + const { base } = await setupTokenPair() + + const receivedOrders: Array<{ + args: dex.watchOrderPlaced.Args + log: dex.watchOrderPlaced.Log + }> = [] + + const unwatch = dex.watchOrderPlaced(config, { + onOrderPlaced: (args, log) => { + receivedOrders.push({ args, log }) + }, + }) + + try { + // Place first order + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Place second order + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'sell', + tick: Tick.fromPrice('0.999'), + }) + + // Wait for events + await new Promise((resolve) => setTimeout(resolve, 200)) + + expect(receivedOrders).toHaveLength(2) + expect(receivedOrders[0]?.args.isBid).toBe(true) + expect(receivedOrders[0]?.args.amount).toBe(parseUnits('100', 6)) + expect(receivedOrders[1]?.args.isBid).toBe(false) + expect(receivedOrders[1]?.args.amount).toBe(parseUnits('100', 6)) + } finally { + unwatch() + } + }) + + test('behavior: filter by token', async () => { + const { base } = await setupTokenPair() + const { base: base2 } = await setupTokenPair() + + const receivedOrders: Array<{ + args: dex.watchOrderPlaced.Args + log: dex.watchOrderPlaced.Log + }> = [] + + // Watch only for orders on base + const unwatch = dex.watchOrderPlaced(config, { + token: base, + onOrderPlaced: (args, log) => { + receivedOrders.push({ args, log }) + }, + }) + + try { + // Place order on base (should be captured) + await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + // Place order on base2 (should NOT be captured) + await dex.placeSync(config, { + token: base2, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + await new Promise((resolve) => setTimeout(resolve, 200)) + + // Should only receive 1 event + expect(receivedOrders).toHaveLength(1) + expect(receivedOrders[0]?.args.token.toLowerCase()).toBe( + base.toLowerCase(), + ) + } finally { + unwatch() + } + }) +}) + +describe('withdraw', () => { + test('default', async () => { + const { base, quote } = await setupTokenPair() + + // Create internal balance + const { orderId } = await dex.placeSync(config, { + token: base, + amount: parseUnits('100', 6), + type: 'buy', + tick: Tick.fromPrice('1.001'), + }) + + await dex.cancelSync(config, { orderId }) + + // Get DEX balance + const dexBalance = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(dexBalance).toBeGreaterThan(0n) + + // Get wallet balance before withdraw + const walletBalanceBefore = await token.getBalance(config, { + token: quote, + account: account.address, + }) + + // Withdraw from DEX + const { receipt } = await dex.withdrawSync(config, { + token: quote, + amount: dexBalance, + }) + + expect(receipt).toBeDefined() + expect(receipt.status).toBe('success') + + // Check DEX balance is now 0 + const dexBalanceAfter = await dex.getBalance(config, { + account: account.address, + token: quote, + }) + expect(dexBalanceAfter).toBe(0n) + + // Check wallet balance increased + const walletBalanceAfter = await token.getBalance(config, { + token: quote, + account: account.address, + }) + expect(walletBalanceAfter).toBeGreaterThan(walletBalanceBefore) + }) +}) diff --git a/packages/core/src/tempo/actions/dex.ts b/packages/core/src/tempo/actions/dex.ts new file mode 100644 index 0000000000..cf3de7cc72 --- /dev/null +++ b/packages/core/src/tempo/actions/dex.ts @@ -0,0 +1,1685 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { PartialBy, UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' + +/** + * Buys a specific amount of tokens. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.buy(config, { + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * amountOut: parseUnits('100', 6), + * maxAmountIn: parseUnits('105', 6), + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function buy( + config: config, + parameters: buy.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.buy(client, parameters as never) +} + +export declare namespace buy { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.buy.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.buy.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.buy.ErrorType +} + +/** + * Buys a specific amount of tokens. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.buySync(config, { + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * amountOut: parseUnits('100', 6), + * maxAmountIn: parseUnits('105', 6), + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt. + */ +export async function buySync( + config: config, + parameters: buySync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.buySync(client, parameters as never) +} + +export declare namespace buySync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.buySync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.buySync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.buySync.ErrorType +} + +/** + * Cancels an order from the orderbook. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.cancel(config, { + * orderId: 123n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function cancel( + config: config, + parameters: cancel.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.cancel(client, parameters as never) +} + +export declare namespace cancel { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.cancel.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.cancel.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.cancel.ErrorType +} + +/** + * Cancels an order from the orderbook. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.cancelSync(config, { + * orderId: 123n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function cancelSync( + config: config, + parameters: cancelSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.cancelSync(client, parameters as never) +} + +export declare namespace cancelSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.cancelSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.cancelSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelSync.ErrorType +} + +/** + * Cancels a stale order from the orderbook. + * + * A stale order is one where the owner's balance or allowance has dropped + * below the order amount. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.cancelStale(config, { + * orderId: 123n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function cancelStale( + config: config, + parameters: cancelStale.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.cancelStale(client, parameters as never) +} + +export declare namespace cancelStale { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.cancelStale.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.cancelStale.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelStale.ErrorType +} + +/** + * Cancels a stale order from the orderbook and waits for confirmation. + * + * A stale order is one where the owner's balance or allowance has dropped + * below the order amount. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.cancelStaleSync(config, { + * orderId: 123n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function cancelStaleSync( + config: config, + parameters: cancelStaleSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.cancelStaleSync(client, parameters as never) +} + +export declare namespace cancelStaleSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.cancelStaleSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.cancelStaleSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.cancelStaleSync.ErrorType +} + +/** + * Creates a new trading pair on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.createPair(config, { + * base: '0x20c...11', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function createPair( + config: config, + parameters: createPair.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.createPair(client, parameters as never) +} + +export declare namespace createPair { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.createPair.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.createPair.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.createPair.ErrorType +} + +/** + * Creates a new trading pair on the DEX. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.createPairSync(config, { + * base: '0x20c...11', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function createPairSync( + config: config, + parameters: createPairSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.createPairSync(client, parameters as never) +} + +export declare namespace createPairSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.createPairSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.createPairSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.createPairSync.ErrorType +} + +/** + * Gets a user's token balance on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const balance = await Actions.dex.getBalance(config, { + * account: '0x...', + * token: '0x20c...11', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The user's token balance on the DEX. + */ +export function getBalance( + config: config, + parameters: getBalance.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getBalance(client, rest) +} + +export namespace getBalance { + export type Parameters = ChainIdParameter & + Actions.dex.getBalance.Parameters + + export type ReturnValue = Actions.dex.getBalance.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: PartialBy, 'account'>, + ) { + return ['getBalance', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.account && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, { account, ...parameters }] = queryKey + if (!account) throw new Error('account is required.') + return await getBalance(config, { account, ...parameters }) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getBalance.ReturnValue, + > = PartialBy, 'account'> & + QueryParameter< + getBalance.ReturnValue, + getBalance.ErrorType, + selectData, + getBalance.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getBalance.ReturnValue, + > = QueryOptions< + getBalance.ReturnValue, + getBalance.ErrorType, + selectData, + getBalance.QueryKey + > + } +} + +/** + * Gets the quote for buying a specific amount of tokens. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const amountIn = await Actions.dex.getBuyQuote(config, { + * amountOut: parseUnits('100', 6), + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The amount of tokenIn needed to buy the specified amountOut. + */ +export function getBuyQuote( + config: config, + parameters: getBuyQuote.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getBuyQuote(client, rest) +} + +export namespace getBuyQuote { + export type Parameters = ChainIdParameter & + Actions.dex.getBuyQuote.Parameters + + export type ReturnValue = Actions.dex.getBuyQuote.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getBuyQuote', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.tokenIn && + rest.tokenOut && + rest.amountOut && + (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getBuyQuote(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getBuyQuote.ReturnValue, + > = getBuyQuote.Parameters & + QueryParameter< + getBuyQuote.ReturnValue, + getBuyQuote.ErrorType, + selectData, + getBuyQuote.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getBuyQuote.ReturnValue, + > = QueryOptions< + getBuyQuote.ReturnValue, + getBuyQuote.ErrorType, + selectData, + getBuyQuote.QueryKey + > + } +} + +/** + * Gets an order's details from the orderbook. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const order = await Actions.dex.getOrder(config, { + * orderId: 123n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The order details. + */ +export function getOrder( + config: config, + parameters: getOrder.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getOrder(client, rest) +} + +export namespace getOrder { + export type Parameters = ChainIdParameter & + Actions.dex.getOrder.Parameters + + export type ReturnValue = Actions.dex.getOrder.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getOrder', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.orderId !== undefined && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getOrder(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getOrder.ReturnValue, + > = getOrder.Parameters & + QueryParameter< + getOrder.ReturnValue, + getOrder.ErrorType, + selectData, + getOrder.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getOrder.ReturnValue, + > = QueryOptions< + getOrder.ReturnValue, + getOrder.ErrorType, + selectData, + getOrder.QueryKey + > + } +} + +/** + * Gets orderbook information for a trading pair. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const book = await Actions.dex.getOrderbook(config, { + * base: '0x20c...11', + * quote: '0x20c...20', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The orderbook information. + */ +export function getOrderbook( + config: config, + parameters: getOrderbook.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getOrderbook(client, rest) +} + +export namespace getOrderbook { + export type Parameters = ChainIdParameter & + Actions.dex.getOrderbook.Parameters + + export type ReturnValue = Actions.dex.getOrderbook.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getOrderbook', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.base && rest.quote && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getOrderbook(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getOrderbook.ReturnValue, + > = getOrderbook.Parameters & + QueryParameter< + getOrderbook.ReturnValue, + getOrderbook.ErrorType, + selectData, + getOrderbook.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getOrderbook.ReturnValue, + > = QueryOptions< + getOrderbook.ReturnValue, + getOrderbook.ErrorType, + selectData, + getOrderbook.QueryKey + > + } +} + +/** + * Gets the price level information at a specific tick. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions, Tick } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const level = await Actions.dex.getTickLevel(config, { + * base: '0x20c...11', + * tick: Tick.fromPrice('1.001'), + * isBid: true, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The price level information. + */ +export function getTickLevel( + config: config, + parameters: getTickLevel.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getTickLevel(client, rest) +} + +export namespace getTickLevel { + export type Parameters = ChainIdParameter & + Actions.dex.getTickLevel.Parameters + + export type ReturnValue = Actions.dex.getTickLevel.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getTickLevel', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.base && + rest.tick !== undefined && + rest.isBid !== undefined && + (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getTickLevel(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getTickLevel.ReturnValue, + > = getTickLevel.Parameters & + QueryParameter< + getTickLevel.ReturnValue, + getTickLevel.ErrorType, + selectData, + getTickLevel.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getTickLevel.ReturnValue, + > = QueryOptions< + getTickLevel.ReturnValue, + getTickLevel.ErrorType, + selectData, + getTickLevel.QueryKey + > + } +} + +/** + * Gets the quote for selling a specific amount of tokens. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const amountOut = await Actions.dex.getSellQuote(config, { + * amountIn: parseUnits('100', 6), + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The amount of tokenOut received for selling the specified amountIn. + */ +export function getSellQuote( + config: config, + parameters: getSellQuote.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.getSellQuote(client, rest) +} + +export namespace getSellQuote { + export type Parameters = ChainIdParameter & + Actions.dex.getSellQuote.Parameters + + export type ReturnValue = Actions.dex.getSellQuote.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getSellQuote', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.tokenIn && + rest.tokenOut && + rest.amountIn && + (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getSellQuote(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getSellQuote.ReturnValue, + > = getSellQuote.Parameters & + QueryParameter< + getSellQuote.ReturnValue, + getSellQuote.ErrorType, + selectData, + getSellQuote.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getSellQuote.ReturnValue, + > = QueryOptions< + getSellQuote.ReturnValue, + getSellQuote.ErrorType, + selectData, + getSellQuote.QueryKey + > + } +} + +/** + * Places a limit order on the orderbook. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.place(config, { + * amount: parseUnits('100', 6), + * tick: Tick.fromPrice('0.99'), + * token: '0x20c...11', + * type: 'buy', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function place( + config: config, + parameters: place.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.place(client, parameters as never) +} + +export declare namespace place { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.place.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.place.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.place.ErrorType +} + +/** + * Places a flip order that automatically flips when filled. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.placeFlip(config, { + * amount: parseUnits('100', 6), + * flipTick: Tick.fromPrice('1.01'), + * tick: Tick.fromPrice('0.99'), + * token: '0x20c...11', + * type: 'buy', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function placeFlip( + config: config, + parameters: placeFlip.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.placeFlip(client, parameters as never) +} + +export declare namespace placeFlip { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.placeFlip.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.placeFlip.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.placeFlip.ErrorType +} + +/** + * Places a flip order that automatically flips when filled. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.placeFlipSync(config, { + * amount: parseUnits('100', 6), + * flipTick: Tick.fromPrice('1.01'), + * tick: Tick.fromPrice('0.99'), + * token: '0x20c...11', + * type: 'buy', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function placeFlipSync( + config: config, + parameters: placeFlipSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.placeFlipSync(client, parameters as never) +} + +export declare namespace placeFlipSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.placeFlipSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.placeFlipSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.placeFlipSync.ErrorType +} + +/** + * Places a limit order on the orderbook. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.placeSync(config, { + * amount: parseUnits('100', 6), + * tick: Tick.fromPrice('0.99'), + * token: '0x20c...11', + * type: 'buy', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function placeSync( + config: config, + parameters: placeSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.placeSync(client, parameters as never) +} + +export declare namespace placeSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.placeSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.placeSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.placeSync.ErrorType +} + +/** + * Sells a specific amount of tokens. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.sell(config, { + * amountIn: parseUnits('100', 6), + * minAmountOut: parseUnits('95', 6), + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function sell( + config: config, + parameters: sell.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.sell(client, parameters as never) +} + +export declare namespace sell { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.sell.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.sell.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.sell.ErrorType +} + +/** + * Sells a specific amount of tokens. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.sellSync(config, { + * amountIn: parseUnits('100', 6), + * minAmountOut: parseUnits('95', 6), + * tokenIn: '0x20c...11', + * tokenOut: '0x20c...20', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt. + */ +export async function sellSync( + config: config, + parameters: sellSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.sellSync(client, parameters as never) +} + +export declare namespace sellSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.sellSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.sellSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.sellSync.ErrorType +} + +/** + * Watches for flip order placement events on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.dex.watchFlipOrderPlaced(config, { + * onFlipOrderPlaced: (args, log) => { + * console.log('Flip order placed:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchFlipOrderPlaced( + config: config, + parameters: watchFlipOrderPlaced.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.watchFlipOrderPlaced(client, rest) +} + +export declare namespace watchFlipOrderPlaced { + export type Parameters = ChainIdParameter & + Actions.dex.watchFlipOrderPlaced.Parameters + + export type Args = Actions.dex.watchFlipOrderPlaced.Args + + export type Log = Actions.dex.watchFlipOrderPlaced.Log +} + +/** + * Watches for order cancellation events on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.dex.watchOrderCancelled(config, { + * onOrderCancelled: (args, log) => { + * console.log('Order cancelled:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchOrderCancelled( + config: config, + parameters: watchOrderCancelled.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.watchOrderCancelled(client, rest) +} + +export declare namespace watchOrderCancelled { + export type Parameters = ChainIdParameter & + Actions.dex.watchOrderCancelled.Parameters + + export type Args = Actions.dex.watchOrderCancelled.Args + + export type Log = Actions.dex.watchOrderCancelled.Log +} + +/** + * Watches for order filled events on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.dex.watchOrderFilled(config, { + * onOrderFilled: (args, log) => { + * console.log('Order filled:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchOrderFilled( + config: config, + parameters: watchOrderFilled.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.watchOrderFilled(client, rest) +} + +export declare namespace watchOrderFilled { + export type Parameters = ChainIdParameter & + Actions.dex.watchOrderFilled.Parameters + + export type Args = Actions.dex.watchOrderFilled.Args + + export type Log = Actions.dex.watchOrderFilled.Log +} + +/** + * Watches for order placement events on the DEX. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.dex.watchOrderPlaced(config, { + * onOrderPlaced: (args, log) => { + * console.log('Order placed:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchOrderPlaced( + config: config, + parameters: watchOrderPlaced.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.dex.watchOrderPlaced(client, rest) +} + +export declare namespace watchOrderPlaced { + export type Parameters = ChainIdParameter & + Actions.dex.watchOrderPlaced.Parameters + + export type Args = Actions.dex.watchOrderPlaced.Args + + export type Log = Actions.dex.watchOrderPlaced.Log +} + +/** + * Withdraws tokens from the DEX to the caller's wallet. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.dex.withdraw(config, { + * amount: 100n, + * token: '0x20c...11', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function withdraw( + config: config, + parameters: withdraw.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.withdraw(client, parameters as never) +} + +export declare namespace withdraw { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.withdraw.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.withdraw.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.withdraw.ErrorType +} + +/** + * Withdraws tokens from the DEX to the caller's wallet. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.dex.withdrawSync(config, { + * amount: 100n, + * token: '0x20c...11', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function withdrawSync( + config: config, + parameters: withdrawSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.dex.withdrawSync(client, parameters as never) +} + +export declare namespace withdrawSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.dex.withdrawSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.dex.withdrawSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.dex.withdrawSync.ErrorType +} diff --git a/packages/core/src/tempo/actions/faucet.ts b/packages/core/src/tempo/actions/faucet.ts new file mode 100644 index 0000000000..60a84fdc0a --- /dev/null +++ b/packages/core/src/tempo/actions/faucet.ts @@ -0,0 +1,95 @@ +import type { BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import type { Config } from '../../createConfig.js' +import type { ChainIdParameter } from '../../types/properties.js' +import type { UnionCompute } from '../../types/utils.js' + +/** + * Funds an account with an initial amount of set token(s) + * on Tempo's testnet. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hashes = await Actions.faucet.fund(config, { + * account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hashes. + */ +export async function fund( + config: config, + parameters: fund.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.faucet.fund(client, rest) +} + +export declare namespace fund { + export type Parameters = UnionCompute< + ChainIdParameter & Actions.faucet.fund.Parameters + > + + export type ReturnValue = Actions.faucet.fund.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.faucet.fund.ErrorType +} + +/** + * Funds an account with an initial amount of set token(s) + * on Tempo's testnet. Returns with the transaction receipts. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const receipts = await Actions.faucet.fundSync(config, { + * account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hashes. + */ +export async function fundSync( + config: config, + parameters: fundSync.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.faucet.fundSync(client, rest) +} + +export declare namespace fundSync { + export type Parameters = UnionCompute< + ChainIdParameter & Actions.faucet.fundSync.Parameters + > + + export type ReturnValue = Actions.faucet.fundSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.faucet.fundSync.ErrorType +} diff --git a/packages/core/src/tempo/actions/fee.test.ts b/packages/core/src/tempo/actions/fee.test.ts new file mode 100644 index 0000000000..a6a9924edd --- /dev/null +++ b/packages/core/src/tempo/actions/fee.test.ts @@ -0,0 +1,62 @@ +import { connect } from '@wagmi/core' +import { accounts, config, queryClient } from '@wagmi/test/tempo' +import { describe, expect, test } from 'vitest' +import { getUserToken, setUserToken, setUserTokenSync } from './fee.js' + +const account = accounts[0] + +describe('getUserToken', () => { + test('default', async () => { + const result = await getUserToken(config, { + account, + }) + expect(result).toMatchInlineSnapshot(` + { + "address": "0x20C0000000000000000000000000000000000001", + "id": 1n, + } + `) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = getUserToken.queryOptions(config, { + account, + }) + expect(await queryClient.fetchQuery(options)).toMatchInlineSnapshot( + ` + { + "address": "0x20C0000000000000000000000000000000000001", + "id": 1n, + } + `, + ) + }) + }) +}) + +describe('setUserToken', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const hash = await setUserToken(config, { + account, + token: '0x20C0000000000000000000000000000000000001', + }) + expect(hash).toBeDefined() + }) +}) + +describe('setUserTokenSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const result = await setUserTokenSync(config, { + account, + token: '0x20C0000000000000000000000000000000000001', + }) + expect(result).toBeDefined() + }) +}) diff --git a/packages/core/src/tempo/actions/fee.ts b/packages/core/src/tempo/actions/fee.ts new file mode 100644 index 0000000000..4e809ef38c --- /dev/null +++ b/packages/core/src/tempo/actions/fee.ts @@ -0,0 +1,259 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { PartialBy, UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' +import { filterQueryOptions } from './utils.js' + +/** + * Gets the user's default fee token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.fee.getUserToken(config, { + * account: '0x20c...0055', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export function getUserToken( + config: config, + parameters: getUserToken.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.fee.getUserToken(client, rest) +} + +export namespace getUserToken { + export type Parameters = ChainIdParameter & + Actions.fee.getUserToken.Parameters + + export type ReturnValue = Actions.fee.getUserToken.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: PartialBy, 'account'>, + ) { + return ['getUserToken', filterQueryOptions(parameters)] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.account && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn(context) { + const [, { account, ...parameters }] = context.queryKey + if (!account) throw new Error('account is required.') + return await getUserToken(config, { account, ...parameters }) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getUserToken.ReturnValue, + > = PartialBy, 'account'> & + QueryParameter< + getUserToken.ReturnValue, + getUserToken.ErrorType, + selectData, + getUserToken.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getUserToken.ReturnValue, + > = QueryOptions< + getUserToken.ReturnValue, + getUserToken.ErrorType, + selectData, + getUserToken.QueryKey + > + } +} + +/** + * Sets the user's default fee token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.fee.setUserToken(config, { + * token: '0x20c...0055', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setUserToken( + config: config, + parameters: setUserToken.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.fee.setUserToken(client, parameters as never) +} + +export declare namespace setUserToken { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.fee.setUserToken.Parameters, + 'chain' + > + + export type ReturnValue = Actions.fee.setUserToken.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.fee.setUserToken.ErrorType +} + +/** + * Sets the user's default fee token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.fee.setUserTokenSync(config, { + * token: '0x20c...0055', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setUserTokenSync( + config: config, + parameters: setUserTokenSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.fee.setUserTokenSync(client, parameters as never) +} + +export declare namespace setUserTokenSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.fee.setUserTokenSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.fee.setUserTokenSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.fee.setUserTokenSync.ErrorType +} + +/** + * Watches for user token set events on the Fee Manager. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.fee.watchSetUserToken(config, { + * onUserTokenSet: (args, log) => { + * console.log('User token set:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchSetUserToken( + config: config, + parameters: watchSetUserToken.Parameters, +): () => void { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.fee.watchSetUserToken(client, rest) +} + +export declare namespace watchSetUserToken { + export type Parameters = ChainIdParameter & + Actions.fee.watchSetUserToken.Parameters +} diff --git a/packages/core/src/tempo/actions/index.ts b/packages/core/src/tempo/actions/index.ts new file mode 100644 index 0000000000..76376e7076 --- /dev/null +++ b/packages/core/src/tempo/actions/index.ts @@ -0,0 +1,10 @@ +/** biome-ignore-all lint/performance/noReExportAll: entrypoint */ +// biome-ignore lint/performance/noBarrelFile: stable +export * as amm from './amm.js' +export * as dex from './dex.js' +export * as faucet from './faucet.js' +export * as fee from './fee.js' +export * as nonce from './nonce.js' +export * as policy from './policy.js' +export * as reward from './reward.js' +export * as token from './token.js' diff --git a/packages/core/src/tempo/actions/nonce.test.ts b/packages/core/src/tempo/actions/nonce.test.ts new file mode 100644 index 0000000000..403a997239 --- /dev/null +++ b/packages/core/src/tempo/actions/nonce.test.ts @@ -0,0 +1,69 @@ +import { accounts, config, queryClient, restart } from '@wagmi/test/tempo' +import { beforeEach, describe, expect, test } from 'vitest' +import * as nonce from './nonce.js' +import * as token from './token.js' + +const account = accounts[0] +const account2 = accounts[1] + +beforeEach(async () => { + await restart() +}) + +describe('getNonce', () => { + test('default', async () => { + const result = await nonce.getNonce(config, { + account: account.address, + nonceKey: 1n, + }) + expect(result).toBe(0n) + }) + + test('queryOptions', async () => { + const options = nonce.getNonce.queryOptions(config, { + account: account.address, + nonceKey: 1n, + }) + const result = await queryClient.fetchQuery(options) + expect(result).toBe(0n) + }) +}) + +test('watchNonceIncremented', async () => { + const events: any[] = [] + const unwatch = nonce.watchNonceIncremented(config, { + onNonceIncremented: (args) => { + events.push(args) + }, + args: { + account: account.address, + nonceKey: 5n, + }, + }) + + // Have to manually set nonce because eth_FillTransaction does not support nonce keys + await token.transferSync(config, { + to: account2.address, + amount: 1n, + token: 1n, + nonceKey: 5n, + nonce: 0, + }) + + await token.transferSync(config, { + to: account2.address, + amount: 1n, + token: 1n, + nonceKey: 5n, + nonce: 1, + }) + + await new Promise((resolve) => setTimeout(resolve, 1000)) + + expect(events).toHaveLength(2) + expect(events[0]?.account).toBe(account.address) + expect(events[0]?.nonceKey).toBe(5n) + expect(events[0]?.newNonce).toBe(1n) + expect(events[1]?.newNonce).toBe(2n) + unwatch() +}) diff --git a/packages/core/src/tempo/actions/nonce.ts b/packages/core/src/tempo/actions/nonce.ts new file mode 100644 index 0000000000..ffac87a721 --- /dev/null +++ b/packages/core/src/tempo/actions/nonce.ts @@ -0,0 +1,147 @@ +import type { BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import type { Config } from '../../createConfig.js' +import type { ChainIdParameter } from '../../types/properties.js' +import type { PartialBy } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' +import { filterQueryOptions } from './utils.js' + +/** + * Gets the nonce for an account and nonce key. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const nonce = await Actions.nonce.getNonce(config, { + * account: '0x...', + * nonceKey: 1n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The nonce value. + */ +export function getNonce( + config: config, + parameters: getNonce.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.nonce.getNonce(client, rest) +} + +export namespace getNonce { + export type Parameters = ChainIdParameter & + Actions.nonce.getNonce.Parameters + + export type ReturnValue = Actions.nonce.getNonce.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: PartialBy, 'account' | 'nonceKey'>, + ) { + return ['getNonce', filterQueryOptions(parameters)] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.account && rest.nonceKey !== undefined && (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn(context) { + const [, { account, nonceKey, ...parameters }] = context.queryKey + if (!account) throw new Error('account is required.') + if (nonceKey === undefined) throw new Error('nonceKey is required.') + return await getNonce(config, { account, nonceKey, ...parameters }) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getNonce.ReturnValue, + > = PartialBy, 'account' | 'nonceKey'> & + QueryParameter< + getNonce.ReturnValue, + getNonce.ErrorType, + selectData, + getNonce.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getNonce.ReturnValue, + > = QueryOptions< + getNonce.ReturnValue, + getNonce.ErrorType, + selectData, + getNonce.QueryKey + > + } +} + +/** + * Watches for nonce incremented events. + * + * @deprecated This function has been deprecated post-AllegroModerato. It will be removed in a future version. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.nonce.watchNonceIncremented(config, { + * onNonceIncremented: (args, log) => { + * console.log('Nonce incremented:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchNonceIncremented( + config: config, + parameters: watchNonceIncremented.Parameters, +): () => void { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.nonce.watchNonceIncremented(client, rest) +} + +export declare namespace watchNonceIncremented { + export type Parameters = ChainIdParameter & + Actions.nonce.watchNonceIncremented.Parameters +} diff --git a/packages/core/src/tempo/actions/policy.test.ts b/packages/core/src/tempo/actions/policy.test.ts new file mode 100644 index 0000000000..c0acd1a626 --- /dev/null +++ b/packages/core/src/tempo/actions/policy.test.ts @@ -0,0 +1,461 @@ +import { connect } from '@wagmi/core' +import { accounts, config, queryClient } from '@wagmi/test/tempo' +import { describe, expect, test } from 'vitest' +import * as policy from './policy.js' + +const account = accounts[0] +const account2 = accounts[1] + +describe('create', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const result = await policy.createSync(config, { + type: 'whitelist', + }) + + expect(result.receipt).toBeDefined() + expect(result.policyId).toBeDefined() + expect(result.policyType).toBe(0) + expect(result.updater).toBe(account.address) + + // verify policy was created + const data = await policy.getData(config, { + policyId: result.policyId, + }) + expect(data.admin).toBe(account.address) + expect(data.type).toBe('whitelist') + }) + + test('behavior: blacklist', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const result = await policy.createSync(config, { + type: 'blacklist', + }) + + expect(result.receipt).toBeDefined() + expect(result.policyId).toBeDefined() + expect(result.policyType).toBe(1) + expect(result.updater).toBe(account.address) + + // verify policy was created + const data = await policy.getData(config, { + policyId: result.policyId, + }) + expect(data.admin).toBe(account.address) + expect(data.type).toBe('blacklist') + }) +}) + +describe('setAdmin', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + // set new admin + const { receipt: setAdminReceipt, ...setAdminResult } = + await policy.setAdminSync(config, { + policyId, + admin: account2.address, + }) + expect(setAdminReceipt).toBeDefined() + expect(setAdminResult.policyId).toBe(policyId) + expect(setAdminResult.admin).toBe(account2.address) + expect(setAdminResult.updater).toBe(account.address) + + { + // verify new admin + const data = await policy.getData(config, { + policyId, + }) + expect(data.admin).toBe(account2.address) + } + }) +}) + +describe('modifyWhitelist', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create whitelist policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + // verify account2 is not authorized + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(false) + } + + // add account2 to whitelist + const addResult = await policy.modifyWhitelistSync(config, { + policyId, + address: account2.address, + allowed: true, + }) + + expect(addResult.receipt).toBeDefined() + expect(addResult.policyId).toBe(policyId) + expect(addResult.account).toBe(account2.address) + expect(addResult.allowed).toBe(true) + expect(addResult.updater).toBe(account.address) + + // verify account2 is authorized + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(true) + } + + // remove account2 from whitelist + const removeResult = await policy.modifyWhitelistSync(config, { + policyId, + address: account2.address, + allowed: false, + }) + + expect(removeResult.receipt).toBeDefined() + expect(removeResult.policyId).toBe(policyId) + expect(removeResult.account).toBe(account2.address) + expect(removeResult.allowed).toBe(false) + expect(removeResult.updater).toBe(account.address) + + // verify account2 is no longer authorized + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(false) + } + }) +}) + +describe('modifyBlacklist', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create blacklist policy + const { policyId } = await policy.createSync(config, { + type: 'blacklist', + }) + + // verify account2 is authorized (not blacklisted) + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(true) + } + + // add account2 to blacklist + const addResult = await policy.modifyBlacklistSync(config, { + policyId, + address: account2.address, + restricted: true, + }) + + expect(addResult.receipt).toBeDefined() + expect(addResult.policyId).toBe(policyId) + expect(addResult.account).toBe(account2.address) + expect(addResult.restricted).toBe(true) + expect(addResult.updater).toBe(account.address) + + // verify account2 is not authorized (blacklisted) + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(false) + } + + // remove account2 from blacklist + const removeResult = await policy.modifyBlacklistSync(config, { + policyId, + address: account2.address, + restricted: false, + }) + + expect(removeResult.receipt).toBeDefined() + expect(removeResult.policyId).toBe(policyId) + expect(removeResult.account).toBe(account2.address) + expect(removeResult.restricted).toBe(false) + expect(removeResult.updater).toBe(account.address) + + // verify account2 is authorized again + { + const isAuthorized = await policy.isAuthorized(config, { + policyId, + user: account2.address, + }) + expect(isAuthorized).toBe(true) + } + }) +}) + +describe('getData', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + { + // get policy data + const data = await policy.getData(config, { + policyId, + }) + expect(data.admin).toBe(account.address) + expect(data.type).toBe('whitelist') + } + }) + + test('behavior: blacklist', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create blacklist policy + const { policyId } = await policy.createSync(config, { + type: 'blacklist', + }) + + { + // get policy data + const data = await policy.getData(config, { + policyId, + }) + expect(data.admin).toBe(account.address) + expect(data.type).toBe('blacklist') + } + }) + + describe('queryOptions', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + const options = policy.getData.queryOptions(config, { + policyId, + }) + const data = await queryClient.fetchQuery(options) + + expect(data.admin).toBe(account.address) + expect(data.type).toBe('whitelist') + }) + }) +}) + +describe('isAuthorized', () => { + test('special policy: always-reject (policyId 0)', async () => { + const isAuthorized = await policy.isAuthorized(config, { + policyId: 0n, + user: account.address, + }) + expect(isAuthorized).toBe(false) + }) + + test('special policy: always-allow (policyId 1)', async () => { + const isAuthorized = await policy.isAuthorized(config, { + policyId: 1n, + user: account.address, + }) + expect(isAuthorized).toBe(true) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = policy.isAuthorized.queryOptions(config, { + policyId: 1n, + user: account.address, + }) + const isAuthorized = await queryClient.fetchQuery(options) + + expect(isAuthorized).toBe(true) + }) + }) +}) + +describe('watchCreate', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const events: any[] = [] + const unwatch = policy.watchCreate(config, { + onPolicyCreated: (args, log) => { + events.push({ args, log }) + }, + }) + + // create policy + await policy.createSync(config, { + type: 'whitelist', + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + unwatch() + + expect(events.length).toBe(1) + expect(events[0].args.policyId).toBeDefined() + expect(events[0].args.updater).toBe(account.address) + expect(events[0].args.type).toBe('whitelist') + }) +}) + +describe('watchAdminUpdated', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + const events: any[] = [] + const unwatch = policy.watchAdminUpdated(config, { + onAdminUpdated: (args, log) => { + events.push({ args, log }) + }, + }) + + // set new admin + await policy.setAdminSync(config, { + policyId, + admin: account2.address, + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + unwatch() + + // Policy creation emits an admin event for the creator, so find the specific event + const event = events.find((e) => e.args.admin === account2.address) + expect(event).toBeDefined() + expect(event.args.policyId).toBe(policyId) + expect(event.args.updater).toBe(account.address) + }) +}) + +describe('watchWhitelistUpdated', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create whitelist policy + const { policyId } = await policy.createSync(config, { + type: 'whitelist', + }) + + const events: any[] = [] + const unwatch = policy.watchWhitelistUpdated(config, { + onWhitelistUpdated: (args, log) => { + events.push({ args, log }) + }, + }) + + // add address to whitelist + await policy.modifyWhitelistSync(config, { + policyId, + address: account2.address, + allowed: true, + }) + + // remove address from whitelist + await policy.modifyWhitelistSync(config, { + policyId, + address: account2.address, + allowed: false, + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + unwatch() + + expect(events.length).toBe(2) + expect(events[0].args.policyId).toBe(policyId) + expect(events[0].args.updater).toBe(account.address) + expect(events[0].args.account).toBe(account2.address) + expect(events[0].args.allowed).toBe(true) + expect(events[1].args.allowed).toBe(false) + }) +}) + +describe('watchBlacklistUpdated', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // create blacklist policy + const { policyId } = await policy.createSync(config, { + type: 'blacklist', + }) + + const events: any[] = [] + const unwatch = policy.watchBlacklistUpdated(config, { + onBlacklistUpdated: (args, log) => { + events.push({ args, log }) + }, + }) + + // add address to blacklist + await policy.modifyBlacklistSync(config, { + policyId, + address: account2.address, + restricted: true, + }) + + // remove address from blacklist + await policy.modifyBlacklistSync(config, { + policyId, + address: account2.address, + restricted: false, + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + unwatch() + + expect(events.length).toBe(2) + expect(events[0].args.policyId).toBe(policyId) + expect(events[0].args.updater).toBe(account.address) + expect(events[0].args.account).toBe(account2.address) + expect(events[0].args.restricted).toBe(true) + expect(events[1].args.restricted).toBe(false) + }) +}) diff --git a/packages/core/src/tempo/actions/policy.ts b/packages/core/src/tempo/actions/policy.ts new file mode 100644 index 0000000000..ad75d51618 --- /dev/null +++ b/packages/core/src/tempo/actions/policy.ts @@ -0,0 +1,827 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' + +/** + * Creates a new policy. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.policy.create(config, { + * type: 'whitelist', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function create( + config: config, + parameters: create.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.create(client, parameters as never) +} + +export declare namespace create { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.create.Parameters, + 'chain' | 'admin' + > + + export type ReturnValue = Actions.policy.create.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.create.ErrorType +} + +/** + * Creates a new policy. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.policy.createSync(config, { + * type: 'whitelist', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function createSync( + config: config, + parameters: createSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.createSync(client, parameters as never) +} + +export declare namespace createSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.createSync.Parameters, + 'chain' | 'admin' + > + + export type ReturnValue = Actions.policy.createSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.createSync.ErrorType +} + +/** + * Sets the admin for a policy. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.policy.setAdmin(config, { + * policyId: 2n, + * admin: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function setAdmin( + config: config, + parameters: setAdmin.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.setAdmin(client, parameters as never) +} + +export declare namespace setAdmin { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.setAdmin.Parameters, + 'chain' + > + + export type ReturnValue = Actions.policy.setAdmin.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.setAdmin.ErrorType +} + +/** + * Sets the admin for a policy. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.policy.setAdminSync(config, { + * policyId: 2n, + * admin: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setAdminSync( + config: config, + parameters: setAdminSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.setAdminSync(client, parameters as never) +} + +export declare namespace setAdminSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.setAdminSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.policy.setAdminSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.setAdminSync.ErrorType +} + +/** + * Modifies a policy whitelist. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.policy.modifyWhitelist(config, { + * policyId: 2n, + * address: '0x...', + * allowed: true, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function modifyWhitelist( + config: config, + parameters: modifyWhitelist.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.modifyWhitelist(client, parameters as never) +} + +export declare namespace modifyWhitelist { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.modifyWhitelist.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.policy.modifyWhitelist.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyWhitelist.ErrorType +} + +/** + * Modifies a policy whitelist. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.policy.modifyWhitelistSync(config, { + * policyId: 2n, + * address: '0x...', + * allowed: true, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function modifyWhitelistSync( + config: config, + parameters: modifyWhitelistSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.modifyWhitelistSync(client, parameters as never) +} + +export declare namespace modifyWhitelistSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.modifyWhitelistSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.policy.modifyWhitelistSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyWhitelistSync.ErrorType +} + +/** + * Modifies a policy blacklist. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.policy.modifyBlacklist(config, { + * policyId: 2n, + * address: '0x...', + * restricted: true, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function modifyBlacklist( + config: config, + parameters: modifyBlacklist.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.modifyBlacklist(client, parameters as never) +} + +export declare namespace modifyBlacklist { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.modifyBlacklist.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.policy.modifyBlacklist.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyBlacklist.ErrorType +} + +/** + * Modifies a policy blacklist. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.policy.modifyBlacklistSync(config, { + * policyId: 2n, + * address: '0x...', + * restricted: true, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function modifyBlacklistSync( + config: config, + parameters: modifyBlacklistSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.policy.modifyBlacklistSync(client, parameters as never) +} + +export declare namespace modifyBlacklistSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.policy.modifyBlacklistSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.policy.modifyBlacklistSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.policy.modifyBlacklistSync.ErrorType +} + +/** + * Gets policy data. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const data = await Actions.policy.getData(config, { + * policyId: 2n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The policy data. + */ +export function getData( + config: config, + parameters: getData.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.getData(client, rest) +} + +export namespace getData { + export type Parameters = ChainIdParameter & + Actions.policy.getData.Parameters + + export type ReturnValue = Actions.policy.getData.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getData', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.policyId !== undefined && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getData(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getData.ReturnValue, + > = getData.Parameters & + QueryParameter< + getData.ReturnValue, + getData.ErrorType, + selectData, + getData.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getData.ReturnValue, + > = QueryOptions< + getData.ReturnValue, + getData.ErrorType, + selectData, + getData.QueryKey + > + } +} + +/** + * Checks if a user is authorized by a policy. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const authorized = await Actions.policy.isAuthorized(config, { + * policyId: 2n, + * user: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Whether the user is authorized. + */ +export function isAuthorized( + config: config, + parameters: isAuthorized.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.isAuthorized(client, rest) +} + +export namespace isAuthorized { + export type Parameters = ChainIdParameter & + Actions.policy.isAuthorized.Parameters + + export type ReturnValue = Actions.policy.isAuthorized.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['isAuthorized', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.policyId !== undefined && rest.user && (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await isAuthorized(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = isAuthorized.ReturnValue, + > = isAuthorized.Parameters & + QueryParameter< + isAuthorized.ReturnValue, + isAuthorized.ErrorType, + selectData, + isAuthorized.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = isAuthorized.ReturnValue, + > = QueryOptions< + isAuthorized.ReturnValue, + isAuthorized.ErrorType, + selectData, + isAuthorized.QueryKey + > + } +} + +/** + * Watches for policy creation events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.policy.watchCreate(config, { + * onPolicyCreated: (args, log) => { + * console.log('Policy created:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchCreate( + config: config, + parameters: watchCreate.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.watchCreate(client, rest) +} + +export declare namespace watchCreate { + export type Parameters = ChainIdParameter & + Actions.policy.watchCreate.Parameters +} + +/** + * Watches for policy admin update events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.policy.watchAdminUpdated(config, { + * onAdminUpdated: (args, log) => { + * console.log('Policy admin updated:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchAdminUpdated( + config: config, + parameters: watchAdminUpdated.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.watchAdminUpdated(client, rest) +} + +export declare namespace watchAdminUpdated { + export type Parameters = ChainIdParameter & + Actions.policy.watchAdminUpdated.Parameters +} + +/** + * Watches for whitelist update events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.policy.watchWhitelistUpdated(config, { + * onWhitelistUpdated: (args, log) => { + * console.log('Whitelist updated:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchWhitelistUpdated( + config: config, + parameters: watchWhitelistUpdated.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.watchWhitelistUpdated(client, rest) +} + +export declare namespace watchWhitelistUpdated { + export type Parameters = ChainIdParameter & + Actions.policy.watchWhitelistUpdated.Parameters +} + +/** + * Watches for blacklist update events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.policy.watchBlacklistUpdated(config, { + * onBlacklistUpdated: (args, log) => { + * console.log('Blacklist updated:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchBlacklistUpdated( + config: config, + parameters: watchBlacklistUpdated.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.policy.watchBlacklistUpdated(client, rest) +} + +export declare namespace watchBlacklistUpdated { + export type Parameters = ChainIdParameter & + Actions.policy.watchBlacklistUpdated.Parameters +} diff --git a/packages/core/src/tempo/actions/reward.test.ts b/packages/core/src/tempo/actions/reward.test.ts new file mode 100644 index 0000000000..00fabaae5c --- /dev/null +++ b/packages/core/src/tempo/actions/reward.test.ts @@ -0,0 +1,215 @@ +import { getConnection } from '@wagmi/core' +import { config, queryClient, setupToken } from '@wagmi/test/tempo' +import { parseUnits } from 'viem' +import { describe, expect, test } from 'vitest' +import * as actions from './reward.js' +import * as tokenActions from './token.js' + +describe('claimSync', () => { + test('default', async () => { + const { token } = await setupToken() + + const connection = getConnection(config) + + const balanceBefore = await tokenActions.getBalance(config, { + account: connection.address!, + token, + }) + + // Opt in to rewards + await actions.setRecipientSync(config, { + recipient: connection.address!, + token, + }) + + // Mint reward tokens + const rewardAmount = parseUnits('100', 6) + await tokenActions.mintSync(config, { + amount: rewardAmount, + to: connection.address!, + token, + }) + + // Start immediate reward + await actions.distributeSync(config, { + amount: rewardAmount, + token, + }) + + // Trigger reward accrual by transferring + await tokenActions.transferSync(config, { + amount: 1n, + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + token, + }) + + // Claim rewards + const { receipt } = await actions.claimSync(config, { + token, + }) + + expect(receipt).toBeDefined() + + const balanceAfter = await tokenActions.getBalance(config, { + account: connection.address!, + token, + }) + + // Balance should have increased due to claimed rewards + expect(balanceAfter).toBeGreaterThan( + balanceBefore + rewardAmount - parseUnits('1', 6), + ) + }) +}) + +describe('getGlobalRewardPerToken', () => { + test('default', async () => { + const { token } = await setupToken() + + const rate = await actions.getGlobalRewardPerToken(config, { + token, + }) + + expect(rate).toBe(0n) + }) + + describe('queryOptions', () => { + test('default', async () => { + const { token } = await setupToken() + + const options = actions.getGlobalRewardPerToken.queryOptions(config, { + token, + }) + + const rate = await queryClient.fetchQuery(options) + + expect(rate).toBe(0n) + }) + }) +}) + +describe('getUserRewardInfo', () => { + test('default', async () => { + const { token } = await setupToken() + + const connection = getConnection(config) + + const info = await actions.getUserRewardInfo(config, { + token, + account: connection.address!, + }) + + expect(info.rewardRecipient).toBeDefined() + expect(info.rewardPerToken).toBeDefined() + expect(info.rewardBalance).toBeDefined() + }) + + describe('queryOptions', () => { + test('default', async () => { + const { token } = await setupToken() + + const connection = getConnection(config) + + const options = actions.getUserRewardInfo.queryOptions(config, { + token, + account: connection.address!, + }) + + const info = await queryClient.fetchQuery(options) + + expect(info.rewardRecipient).toBeDefined() + expect(info.rewardPerToken).toBeDefined() + expect(info.rewardBalance).toBeDefined() + }) + }) +}) + +describe('setRecipientSync', () => { + test('default', async () => { + const { token } = await setupToken() + + const connection = getConnection(config) + + // Set reward recipient + const { holder, receipt, recipient } = await actions.setRecipientSync( + config, + { + recipient: connection.address!, + token, + }, + ) + + expect(receipt).toBeDefined() + expect(holder).toBe(connection.address) + expect(recipient).toBe(connection.address) + }) +}) + +describe('watchRewardDistributed', () => { + test('default', async () => { + const { token } = await setupToken() + + const connection = getConnection(config) + + // Setup rewards + await actions.setRecipientSync(config, { + recipient: connection.address!, + token, + }) + + const rewardAmount = parseUnits('100', 6) + await tokenActions.mintSync(config, { + amount: rewardAmount, + to: connection.address!, + token, + }) + + const events: any[] = [] + const unwatch = actions.watchRewardDistributed(config, { + token, + onRewardDistributed: (args) => { + events.push(args) + }, + }) + + await actions.distributeSync(config, { + amount: rewardAmount, + token, + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.amount).toBe(rewardAmount) + expect(events[0]?.funder).toBe(connection.address) + unwatch() + }) +}) + +describe('watchRewardRecipientSet', () => { + test('default', async () => { + const { token } = await setupToken() + + const account = getConnection(config) + + const events: any[] = [] + const unwatch = actions.watchRewardRecipientSet(config, { + token, + onRewardRecipientSet: (args) => { + events.push(args) + }, + }) + + await actions.setRecipientSync(config, { + recipient: account.address!, + token, + }) + + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.holder).toBe(account.address) + expect(events[0]?.recipient).toBe(account.address) + unwatch() + }) +}) diff --git a/packages/core/src/tempo/actions/reward.ts b/packages/core/src/tempo/actions/reward.ts new file mode 100644 index 0000000000..b87f2e75e3 --- /dev/null +++ b/packages/core/src/tempo/actions/reward.ts @@ -0,0 +1,624 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' + +/** + * Claims accumulated rewards for a recipient. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.reward.claim(config, { + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function claim( + config: config, + parameters: claim.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.claim(client, parameters as never) +} + +export declare namespace claim { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.claim.Parameters, + 'chain' + > + + export type ReturnValue = Actions.reward.claim.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.claim.ErrorType +} + +/** + * Claims accumulated rewards for a recipient and waits for confirmation. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.reward.claimSync(config, { + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt. + */ +export async function claimSync( + config: config, + parameters: claimSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.claimSync(client, parameters as never) +} + +export declare namespace claimSync { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.claimSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.reward.claimSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.claimSync.ErrorType +} + +/** + * Gets the global reward per token value for a token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoModerato], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const value = await Actions.reward.getGlobalRewardPerToken(config, { + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The global reward per token value (scaled by 1e18). + */ +export function getGlobalRewardPerToken( + config: config, + parameters: getGlobalRewardPerToken.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.reward.getGlobalRewardPerToken(client, rest) +} + +export namespace getGlobalRewardPerToken { + export type Parameters = ChainIdParameter & + Actions.reward.getGlobalRewardPerToken.Parameters + + export type ReturnValue = Actions.reward.getGlobalRewardPerToken.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getGlobalRewardPerToken', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.token && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getGlobalRewardPerToken(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getGlobalRewardPerToken.ReturnValue, + > = getGlobalRewardPerToken.Parameters & + QueryParameter< + getGlobalRewardPerToken.ReturnValue, + getGlobalRewardPerToken.ErrorType, + selectData, + getGlobalRewardPerToken.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getGlobalRewardPerToken.ReturnValue, + > = QueryOptions< + getGlobalRewardPerToken.ReturnValue, + getGlobalRewardPerToken.ErrorType, + selectData, + getGlobalRewardPerToken.QueryKey + > + } +} + +/** + * Gets the reward information for a specific account. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const info = await Actions.reward.getUserRewardInfo(config, { + * token: '0x20c0000000000000000000000000000000000001', + * account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The user's reward information (recipient, rewardPerToken, rewardBalance). + */ +export function getUserRewardInfo( + config: config, + parameters: getUserRewardInfo.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.reward.getUserRewardInfo(client, rest) +} + +export namespace getUserRewardInfo { + export type Parameters = ChainIdParameter & + Actions.reward.getUserRewardInfo.Parameters + + export type ReturnValue = Actions.reward.getUserRewardInfo.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getUserRewardInfo', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.token && rest.account && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn({ queryKey }) { + const [, parameters] = queryKey + return await getUserRewardInfo(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getUserRewardInfo.ReturnValue, + > = getUserRewardInfo.Parameters & + QueryParameter< + getUserRewardInfo.ReturnValue, + getUserRewardInfo.ErrorType, + selectData, + getUserRewardInfo.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getUserRewardInfo.ReturnValue, + > = QueryOptions< + getUserRewardInfo.ReturnValue, + getUserRewardInfo.ErrorType, + selectData, + getUserRewardInfo.QueryKey + > + } +} + +/** + * Sets or changes the reward recipient for a token holder. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.reward.setRecipient(config, { + * recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function setRecipient( + config: config, + parameters: setRecipient.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.setRecipient(client, parameters as never) +} + +export declare namespace setRecipient { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.setRecipient.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.reward.setRecipient.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.setRecipient.ErrorType +} + +/** + * Sets or changes the reward recipient for a token holder and waits for confirmation. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.reward.setRecipientSync(config, { + * recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setRecipientSync( + config: config, + parameters: setRecipientSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.setRecipientSync(client, parameters as never) +} + +export declare namespace setRecipientSync { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.setRecipientSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.reward.setRecipientSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.setRecipientSync.ErrorType +} + +/** + * Distributes tokens to opted-in holders. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.reward.distribute(config, { + * amount: 100000000000000000000n, + * seconds: 86400, + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction hash. + */ +export async function distribute( + config: config, + parameters: distribute.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.distribute(client, parameters as never) +} + +export declare namespace distribute { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.distribute.Parameters, + 'chain' + > + + export type ReturnValue = Actions.reward.distribute.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.distribute.ErrorType +} + +/** + * Distributes tokens to opted-in holders and waits for confirmation. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.reward.distributeSync(config, { + * amount: 100000000000000000000n, + * seconds: 86400, + * token: '0x20c0000000000000000000000000000000000001', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function distributeSync( + config: config, + parameters: distributeSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + + return Actions.reward.distributeSync(client, parameters as never) +} + +export declare namespace distributeSync { + export type Parameters = + ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.reward.distributeSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.reward.distributeSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.reward.distributeSync.ErrorType +} + +/** + * Watches for reward distributed events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.reward.watchRewardDistributed(config, { + * token: '0x20c0000000000000000000000000000000000001', + * onRewardDistributed: (args, log) => { + * console.log('Reward distributed:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchRewardDistributed( + config: config, + parameters: watchRewardDistributed.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.reward.watchRewardDistributed(client, rest) +} + +export declare namespace watchRewardDistributed { + export type Parameters = ChainIdParameter & + Actions.reward.watchRewardDistributed.Parameters +} + +/** + * Watches for reward recipient set events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempoTestnet], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.reward.watchRewardRecipientSet(config, { + * token: '0x20c0000000000000000000000000000000000001', + * onRewardRecipientSet: (args, log) => { + * console.log('Reward recipient set:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchRewardRecipientSet( + config: config, + parameters: watchRewardRecipientSet.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.reward.watchRewardRecipientSet(client, rest) +} + +export declare namespace watchRewardRecipientSet { + export type Parameters = ChainIdParameter & + Actions.reward.watchRewardRecipientSet.Parameters +} diff --git a/packages/core/src/tempo/actions/token.test.ts b/packages/core/src/tempo/actions/token.test.ts new file mode 100644 index 0000000000..261a665569 --- /dev/null +++ b/packages/core/src/tempo/actions/token.test.ts @@ -0,0 +1,1307 @@ +import { connect } from '@wagmi/core' +import { accounts, addresses, config, queryClient } from '@wagmi/test/tempo' +import { parseUnits } from 'viem' +import { describe, expect, test } from 'vitest' +import * as token from './token.js' + +const account = accounts[0] +const account2 = accounts[1] + +describe('getAllowance', () => { + test('default', async () => { + const allowance = await token.getAllowance(config, { + account: account.address, + spender: account2.address, + token: addresses.alphaUsd, + }) + expect(allowance).toBeDefined() + expect(typeof allowance).toBe('bigint') + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = token.getAllowance.queryOptions(config, { + account: account.address, + spender: account2.address, + token: addresses.alphaUsd, + }) + const allowance = await queryClient.fetchQuery(options) + expect(allowance).toBeDefined() + expect(typeof allowance).toBe('bigint') + }) + }) +}) + +describe('getBalance', () => { + test('default', async () => { + const balance = await token.getBalance(config, { + account: account.address, + token: addresses.alphaUsd, + }) + expect(balance).toBeDefined() + expect(typeof balance).toBe('bigint') + expect(balance).toBeGreaterThan(0n) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = token.getBalance.queryOptions(config, { + account: account.address, + token: addresses.alphaUsd, + }) + const balance = await queryClient.fetchQuery(options) + expect(balance).toBeDefined() + expect(typeof balance).toBe('bigint') + expect(balance).toBeGreaterThan(0n) + }) + }) +}) + +describe('getMetadata', () => { + test('default', async () => { + const metadata = await token.getMetadata(config, { + token: addresses.alphaUsd, + }) + expect(metadata).toBeDefined() + expect(metadata).toMatchInlineSnapshot(` + { + "currency": "USD", + "decimals": 6, + "name": "AlphaUSD", + "paused": false, + "quoteToken": "0x20C0000000000000000000000000000000000000", + "supplyCap": 340282366920938463463374607431768211455n, + "symbol": "AlphaUSD", + "totalSupply": 202914184810805067765n, + "transferPolicyId": 1n, + } + `) + }) + + describe('queryOptions', () => { + test('default', async () => { + const options = token.getMetadata.queryOptions(config, { + token: addresses.alphaUsd, + }) + const metadata = await queryClient.fetchQuery(options) + expect(metadata).toBeDefined() + expect(metadata).toMatchInlineSnapshot(` + { + "currency": "USD", + "decimals": 6, + "name": "AlphaUSD", + "paused": false, + "quoteToken": "0x20C0000000000000000000000000000000000000", + "supplyCap": 340282366920938463463374607431768211455n, + "symbol": "AlphaUSD", + "totalSupply": 202914184810805067765n, + "transferPolicyId": 1n, + } + `) + }) + }) +}) + +describe('getRoleAdmin', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'GetRoleAdmin Test', + symbol: 'GRATEST', + }) + + const adminRole = await token.getRoleAdmin(config, { + token: tokenAddr, + role: 'issuer', + }) + expect(adminRole).toBeDefined() + expect(typeof adminRole).toBe('string') + expect(adminRole).toBe( + '0x0000000000000000000000000000000000000000000000000000000000000000', + ) + }) + + describe('queryOptions', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'GetRoleAdmin Query Test', + symbol: 'GRAQTEST', + }) + + const options = token.getRoleAdmin.queryOptions(config, { + token: tokenAddr, + role: 'issuer', + }) + const adminRole = await queryClient.fetchQuery(options) + expect(adminRole).toBeDefined() + expect(typeof adminRole).toBe('string') + expect(adminRole).toBe( + '0x0000000000000000000000000000000000000000000000000000000000000000', + ) + }) + }) +}) + +describe('hasRole', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'HasRole Test', + symbol: 'HRTEST', + }) + + const result = await token.hasRole(config, { + token: tokenAddr, + account: account.address, + role: 'defaultAdmin', + }) + expect(result).toBeDefined() + expect(typeof result).toBe('boolean') + expect(result).toBe(true) + }) + + describe('queryOptions', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'HasRole Query Test', + symbol: 'HRQTEST', + }) + + const options = token.hasRole.queryOptions(config, { + token: tokenAddr, + account: account.address, + role: 'defaultAdmin', + }) + const result = await queryClient.fetchQuery(options) + expect(result).toBeDefined() + expect(typeof result).toBe('boolean') + expect(result).toBe(true) + }) + }) +}) + +describe('approve', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const hash = await token.approve(config, { + amount: parseUnits('100', 6), + spender: account2.address, + token: addresses.alphaUsd, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('approveSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const { receipt, ...result } = await token.approveSync(config, { + amount: parseUnits('100', 6), + spender: account2.address, + token: addresses.alphaUsd, + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "amount": 100000000n, + "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "spender": "0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650", + } + `) + }) +}) + +describe('transfer', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const hash = await token.transfer(config, { + amount: parseUnits('1', 6), + to: account2.address, + token: addresses.alphaUsd, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('transferSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const { receipt, ...result } = await token.transferSync(config, { + amount: parseUnits('1', 6), + to: account2.address, + token: addresses.alphaUsd, + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "amount": 1000000n, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "to": "0x8C8d35429F74ec245F8Ef2f4Fd1e551cFF97d650", + } + `) + }) +}) + +describe('mint', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Mintable Token', + symbol: 'MINT', + }) + + // Grant issuer role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + const hash = await token.mint(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('100', 6), + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('mintSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Mintable Token Sync', + symbol: 'MINTSYNC', + }) + + // Grant issuer role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + const { receipt, ...result } = await token.mintSync(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('100', 6), + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "amount": 100000000n, + "to": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + } + `) + }) +}) + +describe('burn', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Burnable Token', + symbol: 'BURN', + }) + + // Grant issuer role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + // Mint some tokens first + await token.mintSync(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('1000', 6), + }) + + const hash = await token.burn(config, { + token: tokenAddr, + amount: parseUnits('1', 6), + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('burnSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token where we're the admin + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Burnable Token Sync', + symbol: 'BURNSYNC', + }) + + // Grant issuer role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + // Mint some tokens first + await token.mintSync(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('1000', 6), + }) + + const { receipt, ...result } = await token.burnSync(config, { + token: tokenAddr, + amount: parseUnits('1', 6), + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "amount": 1000000n, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + } + `) + }) +}) + +describe('create', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const hash = await token.create(config, { + name: 'Test Token', + symbol: 'TEST', + currency: 'USD', + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('createSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + const { receipt, ...result } = await token.createSync(config, { + name: 'Test Token', + symbol: 'TEST', + currency: 'USD', + }) + expect(receipt).toBeDefined() + expect(result.token).toBeDefined() + expect(result.tokenId).toBeDefined() + expect(result.name).toBe('Test Token') + expect(result.symbol).toBe('TEST') + expect(result.currency).toBe('USD') + expect(result.admin).toBe(account.address) + }) +}) + +describe.todo('burnBlocked') + +describe.todo('burnBlockedSync') + +describe('changeTransferPolicy', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Policy Token', + symbol: 'POLICY', + }) + + const hash = await token.changeTransferPolicy(config, { + token: tokenAddr, + policyId: 0n, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('changeTransferPolicySync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Policy Token Sync', + symbol: 'POLICYSYNC', + }) + + const { receipt, ...result } = await token.changeTransferPolicySync( + config, + { + token: tokenAddr, + policyId: 0n, + }, + ) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "newPolicyId": 0n, + "updater": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + } + `) + }) +}) + +describe('grantRoles', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Grant Roles Token', + symbol: 'GRANT', + }) + + const hash = await token.grantRoles(config, { + token: tokenAddr, + roles: ['issuer'], + to: account2.address, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('grantRolesSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Grant Roles Token Sync', + symbol: 'GRANTSYNC', + }) + + const { receipt, value } = await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account2.address, + }) + expect(receipt).toBeDefined() + expect(value).toBeDefined() + expect(value.length).toBe(1) + expect(value[0]?.account).toBe(account2.address) + expect(value[0]?.hasRole).toBe(true) + }) +}) + +describe('pause', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Pausable Token', + symbol: 'PAUSE', + }) + + // Grant pause role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['pause'], + to: account.address, + }) + + const hash = await token.pause(config, { + token: tokenAddr, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('pauseSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Pausable Token Sync', + symbol: 'PAUSESYNC', + }) + + // Grant pause role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['pause'], + to: account.address, + }) + + const { receipt, ...result } = await token.pauseSync(config, { + token: tokenAddr, + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "isPaused": true, + "updater": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + } + `) + }) +}) + +describe('unpause', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Unpausable Token', + symbol: 'UNPAUSE', + }) + + // Grant pause and unpause roles + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['pause', 'unpause'], + to: account.address, + }) + + // First pause it + await token.pauseSync(config, { + token: tokenAddr, + }) + + const hash = await token.unpause(config, { + token: tokenAddr, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('unpauseSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Unpausable Token Sync', + symbol: 'UNPAUSESYNC', + }) + + // Grant pause and unpause roles + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['pause', 'unpause'], + to: account.address, + }) + + // First pause it + await token.pauseSync(config, { + token: tokenAddr, + }) + + const { receipt, ...result } = await token.unpauseSync(config, { + token: tokenAddr, + }) + expect(receipt).toBeDefined() + expect(result).toMatchInlineSnapshot(` + { + "isPaused": false, + "updater": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + } + `) + }) +}) + +describe('revokeRoles', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Revoke Roles Token', + symbol: 'REVOKE', + }) + + // Grant issuer role to account2 + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account2.address, + }) + + const hash = await token.revokeRoles(config, { + token: tokenAddr, + roles: ['issuer'], + from: account2.address, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('revokeRolesSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Revoke Roles Token Sync', + symbol: 'REVOKESYNC', + }) + + // Grant issuer role to account2 + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account2.address, + }) + + const { receipt, value } = await token.revokeRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + from: account2.address, + }) + expect(receipt).toBeDefined() + expect(value).toBeDefined() + expect(value.length).toBe(1) + expect(value[0]?.account).toBe(account2.address) + expect(value[0]?.hasRole).toBe(false) + }) +}) + +describe('renounceRoles', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Renounce Roles Token', + symbol: 'RENOUNCE', + }) + + // Grant issuer role to ourselves + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + const hash = await token.renounceRoles(config, { + token: tokenAddr, + roles: ['issuer'], + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('renounceRolesSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Renounce Roles Token Sync', + symbol: 'RENOUNCESYNC', + }) + + // Grant issuer role to ourselves + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + const { receipt, value } = await token.renounceRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + }) + expect(receipt).toBeDefined() + expect(value).toBeDefined() + expect(value.length).toBe(1) + expect(value[0]?.account).toBe(account.address) + expect(value[0]?.hasRole).toBe(false) + }) +}) + +describe('setRoleAdmin', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Role Admin Token', + symbol: 'ROLEADMIN', + }) + + const hash = await token.setRoleAdmin(config, { + token: tokenAddr, + role: 'issuer', + adminRole: 'pause', + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('setRoleAdminSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Role Admin Token Sync', + symbol: 'ROLEADMINSYNC', + }) + + const { receipt, ...result } = await token.setRoleAdminSync(config, { + token: tokenAddr, + role: 'issuer', + adminRole: 'pause', + }) + expect(receipt).toBeDefined() + expect(result.role).toBeDefined() + expect(result.newAdminRole).toBeDefined() + expect(result.sender).toBe(account.address) + }) +}) + +describe('setSupplyCap', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Supply Cap Token', + symbol: 'SUPPLYCAP', + }) + + const hash = await token.setSupplyCap(config, { + token: tokenAddr, + supplyCap: parseUnits('1000000', 6), + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('setSupplyCapSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Supply Cap Token Sync', + symbol: 'SUPPLYCAPSYNC', + }) + + const { receipt, ...result } = await token.setSupplyCapSync(config, { + token: tokenAddr, + supplyCap: parseUnits('1000000', 6), + }) + expect(receipt).toBeDefined() + expect(result.newSupplyCap).toBe(parseUnits('1000000', 6)) + expect(result.updater).toBe(account.address) + }) +}) + +describe('prepareUpdateQuoteToken', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create quote token + const { token: quoteToken } = await token.createSync(config, { + currency: 'USD', + name: 'Quote Token', + symbol: 'QUOTE', + }) + + // Create main token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Main Token', + symbol: 'MAIN', + }) + + const hash = await token.prepareUpdateQuoteToken(config, { + token: tokenAddr, + quoteToken, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('prepareUpdateQuoteTokenSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create quote token + const { token: quoteToken } = await token.createSync(config, { + currency: 'USD', + name: 'Quote Token Sync', + symbol: 'QUOTESYNC', + }) + + // Create main token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Main Token Sync', + symbol: 'MAINSYNC', + }) + + const { receipt, ...result } = await token.prepareUpdateQuoteTokenSync( + config, + { + token: tokenAddr, + quoteToken, + }, + ) + expect(receipt).toBeDefined() + expect(result.nextQuoteToken).toBe(quoteToken) + expect(result.updater).toBe(account.address) + }) +}) + +describe('updateQuoteToken', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create quote token + const { token: quoteToken } = await token.createSync(config, { + currency: 'USD', + name: 'Quote Token Finalize', + symbol: 'QUOTEFINAL', + }) + + // Create main token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Main Token Finalize', + symbol: 'MAINFINAL', + }) + + // Prepare quote token update first + await token.prepareUpdateQuoteTokenSync(config, { + token: tokenAddr, + quoteToken, + }) + + const hash = await token.updateQuoteToken(config, { + token: tokenAddr, + }) + expect(hash).toBeDefined() + expect(typeof hash).toBe('string') + }) +}) + +describe('updateQuoteTokenSync', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create quote token + const { token: quoteToken } = await token.createSync(config, { + currency: 'USD', + name: 'Quote Token Finalize Sync', + symbol: 'QUOTEFINALSYNC', + }) + + // Create main token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Main Token Finalize Sync', + symbol: 'MAINFINALSYNC', + }) + + // Prepare quote token update first + await token.prepareUpdateQuoteTokenSync(config, { + token: tokenAddr, + quoteToken, + }) + + const { receipt, ...result } = await token.updateQuoteTokenSync(config, { + token: tokenAddr, + }) + expect(receipt).toBeDefined() + expect(result.newQuoteToken).toBe(quoteToken) + expect(result.updater).toBe(account.address) + }) +}) + +describe.todo('permit') + +describe.todo('permitSync') + +describe('watchAdminRole', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Watch Admin Role Token', + symbol: 'WATCHADMIN', + }) + + const events: any[] = [] + const unwatch = token.watchAdminRole(config, { + token: tokenAddr, + onRoleAdminUpdated: (args) => { + events.push(args) + }, + }) + + // Trigger event by setting a role admin + await token.setRoleAdminSync(config, { + token: tokenAddr, + role: 'issuer', + adminRole: 'pause', + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]).toBeDefined() + unwatch() + }) +}) + +describe('watchApprove', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const events: any[] = [] + const unwatch = token.watchApprove(config, { + onApproval: (args) => { + events.push(args) + }, + token: addresses.alphaUsd, + }) + + // Trigger approval event + await token.approveSync(config, { + amount: parseUnits('50', 6), + spender: account2.address, + token: addresses.alphaUsd, + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.owner).toBe(account.address) + expect(events[0]?.spender).toBe(account2.address) + expect(events[0]?.amount).toBe(parseUnits('50', 6)) + unwatch() + }) +}) + +describe('watchBurn', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Watch Burn Token', + symbol: 'WATCHBURN', + }) + + // Grant issuer role and mint tokens + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + await token.mintSync(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('1000', 6), + }) + + const events: any[] = [] + const unwatch = token.watchBurn(config, { + token: tokenAddr, + onBurn: (args) => { + events.push(args) + }, + }) + + // Trigger burn event + await token.burnSync(config, { + token: tokenAddr, + amount: parseUnits('10', 6), + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.from).toBe(account.address) + expect(events[0]?.amount).toBe(parseUnits('10', 6)) + unwatch() + }) +}) + +describe('watchCreate', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const events: any[] = [] + const unwatch = token.watchCreate(config, { + onTokenCreated: (args) => { + events.push(args) + }, + }) + + // Trigger token creation event + await token.createSync(config, { + name: 'Watch Create Token', + symbol: 'WATCHCREATE', + currency: 'USD', + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.name).toBe('Watch Create Token') + expect(events[0]?.symbol).toBe('WATCHCREATE') + expect(events[0]?.currency).toBe('USD') + expect(events[0]?.admin).toBe(account.address) + unwatch() + }) +}) + +describe('watchMint', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Watch Mint Token', + symbol: 'WATCHMINT', + }) + + // Grant issuer role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account.address, + }) + + const events: any[] = [] + const unwatch = token.watchMint(config, { + token: tokenAddr, + onMint: (args) => { + events.push(args) + }, + }) + + // Trigger mint event + await token.mintSync(config, { + token: tokenAddr, + to: account.address, + amount: parseUnits('100', 6), + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.to).toBe(account.address) + expect(events[0]?.amount).toBe(parseUnits('100', 6)) + unwatch() + }) +}) + +describe('watchRole', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + // Create a new token + const { token: tokenAddr } = await token.createSync(config, { + currency: 'USD', + name: 'Watch Role Token', + symbol: 'WATCHROLE', + }) + + const events: any[] = [] + const unwatch = token.watchRole(config, { + token: tokenAddr, + onRoleUpdated: (args) => { + events.push(args) + }, + }) + + // Trigger role update event by granting a role + await token.grantRolesSync(config, { + token: tokenAddr, + roles: ['issuer'], + to: account2.address, + }) + + // Wait for the specific event to be processed (creator gets roles during creation) + await new Promise((resolve) => setTimeout(resolve, 500)) + + const event = events.find((e) => e.account === account2.address) + expect(event).toBeDefined() + expect(event?.hasRole).toBe(true) + expect(event?.type).toBe('granted') + unwatch() + }) +}) + +describe('watchTransfer', () => { + test('default', async () => { + await connect(config, { + connector: config.connectors[0]!, + }) + + const events: any[] = [] + const unwatch = token.watchTransfer(config, { + token: addresses.alphaUsd, + onTransfer: (args) => { + events.push(args) + }, + }) + + // Trigger transfer event + await token.transferSync(config, { + amount: parseUnits('5', 6), + to: account2.address, + token: addresses.alphaUsd, + }) + + // Wait a bit for the event to be processed + await new Promise((resolve) => setTimeout(resolve, 500)) + + expect(events.length).toBeGreaterThan(0) + expect(events[0]?.from).toBe(account.address) + expect(events[0]?.to).toBe(account2.address) + expect(events[0]?.amount).toBe(parseUnits('5', 6)) + unwatch() + }) +}) diff --git a/packages/core/src/tempo/actions/token.ts b/packages/core/src/tempo/actions/token.ts new file mode 100644 index 0000000000..ac09631898 --- /dev/null +++ b/packages/core/src/tempo/actions/token.ts @@ -0,0 +1,2598 @@ +import type { Account, BaseErrorType } from 'viem' +import { Actions } from 'viem/tempo' +import { getConnectorClient } from '../../actions/getConnectorClient.js' +import type { Config } from '../../createConfig.js' +import type { + ChainIdParameter, + ConnectorParameter, +} from '../../types/properties.js' +import type { UnionLooseOmit } from '../../types/utils.js' +import type { QueryOptions, QueryParameter } from './utils.js' + +/** + * Approves a spender to transfer TIP20 tokens on behalf of the caller. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { Actions } from '@wagmi/core/tempo' + * import { tempo } from '@wagmi/core/chains' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.approve(config, { + * spender: '0x...', + * amount: 100n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function approve( + config: config, + parameters: approve.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.approve(client, parameters as never) +} + +export declare namespace approve { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.approve.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.approve.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.approve.ErrorType +} + +/** + * Approves a spender to transfer TIP20 tokens on behalf of the caller. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.approveSync(config, { + * spender: '0x...', + * amount: 100n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function approveSync( + config: config, + parameters: approveSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.approveSync(client, parameters as never) +} + +export declare namespace approveSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.approveSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.approveSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.approveSync.ErrorType +} + +/** + * Burns TIP20 tokens from the caller's balance. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.burn(config, { + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function burn( + config: config, + parameters: burn.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.burn(client, parameters as never) +} + +export declare namespace burn { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.burn.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.burn.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.burn.ErrorType +} + +/** + * Burns TIP20 tokens from a blocked address. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.burnBlocked(config, { + * from: '0x...', + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function burnBlocked( + config: config, + parameters: burnBlocked.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return await Actions.token.burnBlocked(client, parameters as never) +} + +export declare namespace burnBlocked { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.burnBlocked.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.burnBlocked.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.burnBlocked.ErrorType +} + +/** + * Burns TIP20 tokens from a blocked address. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.burnBlockedSync(config, { + * from: '0x...', + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function burnBlockedSync( + config: config, + parameters: burnBlockedSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.burnBlockedSync(client, parameters as never) +} + +export declare namespace burnBlockedSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.burnBlockedSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.burnBlockedSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.burnBlockedSync.ErrorType +} + +/** + * Burns TIP20 tokens from the caller's balance. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.burnSync(config, { + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function burnSync( + config: config, + parameters: burnSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.burnSync(client, parameters as never) +} + +export declare namespace burnSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.burnSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.burnSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.burnSync.ErrorType +} + +/** + * Changes the transfer policy ID for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.changeTransferPolicy(config, { + * token: '0x...', + * policyId: 1n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function changeTransferPolicy( + config: config, + parameters: changeTransferPolicy.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.changeTransferPolicy(client, parameters as never) +} + +export declare namespace changeTransferPolicy { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.changeTransferPolicy.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.changeTransferPolicy.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.changeTransferPolicy.ErrorType +} + +/** + * Changes the transfer policy ID for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.changeTransferPolicySync(config, { + * token: '0x...', + * policyId: 1n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function changeTransferPolicySync( + config: config, + parameters: changeTransferPolicySync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.changeTransferPolicySync(client, parameters as never) +} + +export declare namespace changeTransferPolicySync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.changeTransferPolicySync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.changeTransferPolicySync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.changeTransferPolicySync.ErrorType +} + +/** + * Creates a new TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.create(config, { + * name: 'My Token', + * symbol: 'MTK', + * currency: 'USD', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function create( + config: config, + parameters: create.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.create(client, parameters as never) +} + +export declare namespace create { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.create.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.create.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.create.ErrorType +} + +/** + * Creates a new TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.createSync(config, { + * name: 'My Token', + * symbol: 'MTK', + * currency: 'USD', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function createSync( + config: config, + parameters: createSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.createSync(client, parameters as never) +} + +export declare namespace createSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.createSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.createSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.createSync.ErrorType +} + +/** + * Updates the quote token for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.updateQuoteToken(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function updateQuoteToken( + config: config, + parameters: updateQuoteToken.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.updateQuoteToken(client, parameters as never) +} + +export declare namespace updateQuoteToken { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.updateQuoteToken.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.updateQuoteToken.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.updateQuoteToken.ErrorType +} + +/** + * Updates the quote token for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.updateQuoteTokenSync(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function updateQuoteTokenSync( + config: config, + parameters: updateQuoteTokenSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.updateQuoteTokenSync(client, parameters as never) +} + +export declare namespace updateQuoteTokenSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.updateQuoteTokenSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.updateQuoteTokenSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.updateQuoteTokenSync.ErrorType +} + +/** + * Gets TIP20 token allowance. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const allowance = await Actions.token.getAllowance(config, { + * account: '0x...', + * spender: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The token allowance. + */ +export function getAllowance( + config: config, + parameters: getAllowance.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.getAllowance(client, rest) +} + +export namespace getAllowance { + export type Parameters = ChainIdParameter & + Actions.token.getAllowance.Parameters + + export type ReturnValue = Actions.token.getAllowance.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getAllowance', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.account && rest.spender && rest.token && (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return await getAllowance(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getAllowance.ReturnValue, + > = getAllowance.Parameters & + QueryParameter< + getAllowance.ReturnValue, + getAllowance.ErrorType, + selectData, + getAllowance.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getAllowance.ReturnValue, + > = QueryOptions< + getAllowance.ReturnValue, + getAllowance.ErrorType, + selectData, + getAllowance.QueryKey + > + } +} + +/** + * Gets TIP20 token balance for an address. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const balance = await Actions.token.getBalance(config, { + * account: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The token balance. + */ +export function getBalance( + config: config, + parameters: getBalance.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.getBalance(client, rest as never) +} + +export namespace getBalance { + export type Parameters = ChainIdParameter & + Actions.token.getBalance.Parameters + + export type ReturnValue = Actions.token.getBalance.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getBalance', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.account && rest.token && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return (await getBalance(config, parameters)) ?? null + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getBalance.ReturnValue, + > = getBalance.Parameters & + QueryParameter< + getBalance.ReturnValue, + getBalance.ErrorType, + selectData, + getBalance.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getBalance.ReturnValue, + > = QueryOptions< + getBalance.ReturnValue, + getBalance.ErrorType, + selectData, + getBalance.QueryKey + > + } +} + +/** + * Gets TIP20 token metadata. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const metadata = await Actions.token.getMetadata(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The token metadata. + */ +export function getMetadata( + config: config, + parameters: getMetadata.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.getMetadata(client, rest) +} + +export namespace getMetadata { + export type Parameters = ChainIdParameter & + Actions.token.getMetadata.Parameters + + export type ReturnValue = Actions.token.getMetadata.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getMetadata', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.token && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return await getMetadata(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getMetadata.ReturnValue, + > = getMetadata.Parameters & + QueryParameter< + getMetadata.ReturnValue, + getMetadata.ErrorType, + selectData, + getMetadata.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getMetadata.ReturnValue, + > = QueryOptions< + getMetadata.ReturnValue, + getMetadata.ErrorType, + selectData, + getMetadata.QueryKey + > + } +} + +/** + * Gets the admin role for a specific role in a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const adminRole = await Actions.token.getRoleAdmin(config, { + * role: 'issuer', + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The admin role hash. + */ +export function getRoleAdmin( + config: config, + parameters: getRoleAdmin.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.getRoleAdmin(client, rest) +} + +export namespace getRoleAdmin { + export type Parameters = ChainIdParameter & + Actions.token.getRoleAdmin.Parameters + + export type ReturnValue = Actions.token.getRoleAdmin.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['getRoleAdmin', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean(rest.token && rest.role && (query?.enabled ?? true)), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return await getRoleAdmin(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = getRoleAdmin.ReturnValue, + > = getRoleAdmin.Parameters & + QueryParameter< + getRoleAdmin.ReturnValue, + getRoleAdmin.ErrorType, + selectData, + getRoleAdmin.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = getRoleAdmin.ReturnValue, + > = QueryOptions< + getRoleAdmin.ReturnValue, + getRoleAdmin.ErrorType, + selectData, + getRoleAdmin.QueryKey + > + } +} + +/** + * Grants a role for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.grantRoles(config, { + * token: '0x...', + * to: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function grantRoles( + config: config, + parameters: grantRoles.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.grantRoles(client, parameters as never) +} + +export declare namespace grantRoles { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.grantRoles.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.grantRoles.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.grantRoles.ErrorType +} + +/** + * Grants a role for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.grantRolesSync(config, { + * token: '0x...', + * to: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function grantRolesSync( + config: config, + parameters: grantRolesSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.grantRolesSync(client, parameters as never) +} + +export declare namespace grantRolesSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.grantRolesSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.grantRolesSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.grantRolesSync.ErrorType +} + +/** + * Checks if an account has a specific role for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hasRole = await Actions.token.hasRole(config, { + * account: '0x...', + * role: 'issuer', + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Whether the account has the role. + */ +export function hasRole( + config: config, + parameters: hasRole.Parameters, +): Promise { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.hasRole(client, rest) +} + +export namespace hasRole { + export type Parameters = ChainIdParameter & + Actions.token.hasRole.Parameters + + export type ReturnValue = Actions.token.hasRole.ReturnValue + + export type ErrorType = BaseErrorType + + export function queryKey( + parameters: Parameters, + ) { + return ['hasRole', parameters] as const + } + + export type QueryKey = ReturnType< + typeof queryKey + > + + export function queryOptions( + config: Config, + parameters: queryOptions.Parameters, + ): queryOptions.ReturnValue { + const { query, ...rest } = parameters + return { + ...query, + enabled: Boolean( + rest.token && rest.role && rest.account && (query?.enabled ?? true), + ), + queryKey: queryKey(rest), + async queryFn(context) { + const [, parameters] = context.queryKey + return await hasRole(config, parameters) + }, + } + } + + export declare namespace queryOptions { + export type Parameters< + config extends Config, + selectData = hasRole.ReturnValue, + > = hasRole.Parameters & + QueryParameter< + hasRole.ReturnValue, + hasRole.ErrorType, + selectData, + hasRole.QueryKey + > + + export type ReturnValue< + config extends Config, + selectData = hasRole.ReturnValue, + > = QueryOptions< + hasRole.ReturnValue, + hasRole.ErrorType, + selectData, + hasRole.QueryKey + > + } +} + +/** + * Mints TIP20 tokens to an address. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.mint(config, { + * to: '0x...', + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function mint( + config: config, + parameters: mint.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.mint(client, parameters as never) +} + +export declare namespace mint { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.mint.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.mint.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.mint.ErrorType +} + +/** + * Mints TIP20 tokens to an address. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.mintSync(config, { + * to: '0x...', + * amount: 100n, + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function mintSync( + config: config, + parameters: mintSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.mintSync(client, parameters as never) +} + +export declare namespace mintSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.mintSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.mintSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.mintSync.ErrorType +} + +/** + * Pauses a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.pause(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function pause( + config: config, + parameters: pause.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.pause(client, parameters as never) +} + +export declare namespace pause { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.pause.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.pause.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.pause.ErrorType +} + +/** + * Pauses a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.pauseSync(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function pauseSync( + config: config, + parameters: pauseSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.pauseSync(client, parameters as never) +} + +export declare namespace pauseSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.pauseSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.pauseSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.pauseSync.ErrorType +} + +/** + * Renounces a role for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.renounceRoles(config, { + * token: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function renounceRoles( + config: config, + parameters: renounceRoles.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.renounceRoles(client, parameters as never) +} + +export declare namespace renounceRoles { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.renounceRoles.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.renounceRoles.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.renounceRoles.ErrorType +} + +/** + * Renounces a role for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.renounceRolesSync(config, { + * token: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function renounceRolesSync( + config: config, + parameters: renounceRolesSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.renounceRolesSync(client, parameters as never) +} + +export declare namespace renounceRolesSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.renounceRolesSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.renounceRolesSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.renounceRolesSync.ErrorType +} + +/** + * Revokes a role for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.revokeRoles(config, { + * token: '0x...', + * from: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function revokeRoles( + config: config, + parameters: revokeRoles.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.revokeRoles(client, parameters as never) +} + +export declare namespace revokeRoles { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.revokeRoles.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.revokeRoles.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.revokeRoles.ErrorType +} + +/** + * Revokes a role for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.revokeRolesSync(config, { + * token: '0x...', + * from: '0x...', + * roles: ['issuer'], + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function revokeRolesSync( + config: config, + parameters: revokeRolesSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.revokeRolesSync(client, parameters as never) +} + +export declare namespace revokeRolesSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.revokeRolesSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.revokeRolesSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.revokeRolesSync.ErrorType +} + +/** + * Sets the admin role for a specific role in a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.setRoleAdmin(config, { + * token: '0x...', + * role: 'issuer', + * adminRole: 'pause', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function setRoleAdmin( + config: config, + parameters: setRoleAdmin.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.setRoleAdmin(client, parameters as never) +} + +export declare namespace setRoleAdmin { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.setRoleAdmin.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.setRoleAdmin.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.setRoleAdmin.ErrorType +} + +/** + * Sets the admin role for a specific role in a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.setRoleAdminSync(config, { + * token: '0x...', + * role: 'issuer', + * adminRole: 'pause', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setRoleAdminSync( + config: config, + parameters: setRoleAdminSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.setRoleAdminSync(client, parameters as never) +} + +export declare namespace setRoleAdminSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.setRoleAdminSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.setRoleAdminSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.setRoleAdminSync.ErrorType +} + +/** + * Sets the supply cap for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.setSupplyCap(config, { + * token: '0x...', + * supplyCap: 1000000n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function setSupplyCap( + config: config, + parameters: setSupplyCap.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.setSupplyCap(client, parameters as never) +} + +export declare namespace setSupplyCap { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.setSupplyCap.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.setSupplyCap.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.setSupplyCap.ErrorType +} + +/** + * Sets the supply cap for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.setSupplyCapSync(config, { + * token: '0x...', + * supplyCap: 1000000n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function setSupplyCapSync( + config: config, + parameters: setSupplyCapSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.setSupplyCapSync(client, parameters as never) +} + +export declare namespace setSupplyCapSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.setSupplyCapSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.setSupplyCapSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.setSupplyCapSync.ErrorType +} + +/** + * Transfers TIP20 tokens to another address. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.transfer(config, { + * to: '0x...', + * amount: 100n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function transfer( + config: config, + parameters: transfer.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.transfer(client, parameters as never) +} + +export declare namespace transfer { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.transfer.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.transfer.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.transfer.ErrorType +} + +/** + * Transfers TIP20 tokens to another address. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.transferSync(config, { + * to: '0x...', + * amount: 100n, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function transferSync( + config: config, + parameters: transferSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.transferSync(client, parameters as never) +} + +export declare namespace transferSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.transferSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.transferSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.transferSync.ErrorType +} + +/** + * Unpauses a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.unpause(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function unpause( + config: config, + parameters: unpause.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.unpause(client, parameters as never) +} + +export declare namespace unpause { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.unpause.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.unpause.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.unpause.ErrorType +} + +/** + * Unpauses a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.unpauseSync(config, { + * token: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function unpauseSync( + config: config, + parameters: unpauseSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.unpauseSync(client, parameters as never) +} + +export declare namespace unpauseSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.unpauseSync.Parameters, + 'chain' + > + + export type ReturnValue = Actions.token.unpauseSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.unpauseSync.ErrorType +} + +/** + * Prepares the quote token update for a TIP20 token. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const hash = await Actions.token.prepareUpdateQuoteToken(config, { + * token: '0x...', + * quoteToken: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns Transaction hash. + */ +export async function prepareUpdateQuoteToken( + config: config, + parameters: prepareUpdateQuoteToken.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.prepareUpdateQuoteToken(client, parameters as never) +} + +export declare namespace prepareUpdateQuoteToken { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.prepareUpdateQuoteToken.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = Actions.token.prepareUpdateQuoteToken.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.prepareUpdateQuoteToken.ErrorType +} + +/** + * Prepares the quote token update for a TIP20 token. + * + * Note: This is a synchronous action that waits for the transaction to + * be included on a block before returning a response. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const result = await Actions.token.prepareUpdateQuoteTokenSync(config, { + * token: '0x...', + * quoteToken: '0x...', + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns The transaction receipt and event data. + */ +export async function prepareUpdateQuoteTokenSync( + config: config, + parameters: prepareUpdateQuoteTokenSync.Parameters, +): Promise { + const { account, chainId, connector } = parameters + const client = await getConnectorClient(config, { + account, + assertChainId: false, + chainId, + connector, + }) + return Actions.token.prepareUpdateQuoteTokenSync(client, parameters as never) +} + +export declare namespace prepareUpdateQuoteTokenSync { + export type Parameters = ChainIdParameter & + ConnectorParameter & + UnionLooseOmit< + Actions.token.prepareUpdateQuoteTokenSync.Parameters< + config['chains'][number], + Account + >, + 'chain' + > + + export type ReturnValue = + Actions.token.prepareUpdateQuoteTokenSync.ReturnValue + + export type ErrorType = BaseErrorType // TODO: Actions.token.prepareUpdateQuoteTokenSync.ErrorType +} + +/** + * Watches for TIP20 token role admin updates. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchAdminRole(config, { + * onRoleAdminUpdated: (args, log) => { + * console.log('Role admin updated:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchAdminRole( + config: config, + parameters: watchAdminRole.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchAdminRole(client, rest) +} + +export declare namespace watchAdminRole { + export type Parameters = ChainIdParameter & + Actions.token.watchAdminRole.Parameters +} + +/** + * Watches for TIP20 token approval events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchApprove(config, { + * onApproval: (args, log) => { + * console.log('Approval:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchApprove( + config: config, + parameters: watchApprove.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchApprove(client, rest) +} + +export declare namespace watchApprove { + export type Parameters = ChainIdParameter & + Actions.token.watchApprove.Parameters +} + +/** + * Watches for TIP20 token burn events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchBurn(config, { + * onBurn: (args, log) => { + * console.log('Burn:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchBurn( + config: config, + parameters: watchBurn.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchBurn(client, rest) +} + +export declare namespace watchBurn { + export type Parameters = ChainIdParameter & + Actions.token.watchBurn.Parameters +} + +/** + * Watches for new TIP20 tokens created. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchCreate(config, { + * onTokenCreated: (args, log) => { + * console.log('Token created:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchCreate( + config: config, + parameters: watchCreate.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchCreate(client, rest) +} + +export declare namespace watchCreate { + export type Parameters = ChainIdParameter & + Actions.token.watchCreate.Parameters +} + +/** + * Watches for TIP20 token mint events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchMint(config, { + * onMint: (args, log) => { + * console.log('Mint:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchMint( + config: config, + parameters: watchMint.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchMint(client, rest) +} + +export declare namespace watchMint { + export type Parameters = ChainIdParameter & + Actions.token.watchMint.Parameters + + export type ReturnValue = Actions.token.watchMint.ReturnValue +} + +/** + * Watches for TIP20 token role membership updates. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchRole(config, { + * onRoleUpdated: (args, log) => { + * console.log('Role updated:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchRole( + config: config, + parameters: watchRole.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchRole(client, rest) +} + +export declare namespace watchRole { + export type Parameters = ChainIdParameter & + Actions.token.watchRole.Parameters +} + +/** + * Watches for TIP20 token transfer events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchTransfer(config, { + * onTransfer: (args, log) => { + * console.log('Transfer:', args) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchTransfer( + config: config, + parameters: watchTransfer.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchTransfer(client, rest) +} + +export declare namespace watchTransfer { + export type Parameters = ChainIdParameter & + Actions.token.watchTransfer.Parameters +} + +/** + * Watches for TIP20 token quote token update events. + * + * @example + * ```ts + * import { createConfig, http } from '@wagmi/core' + * import { tempo } from '@wagmi/core/chains' + * import { Actions } from '@wagmi/core/tempo' + * + * const config = createConfig({ + * chains: [tempo], + * transports: { + * [tempo.id]: http(), + * }, + * }) + * + * const unwatch = Actions.token.watchUpdateQuoteToken(config, { + * onUpdateQuoteToken: (args, log) => { + * if (args.completed) + * console.log('quote token update completed:', args.newQuoteToken) + * else + * console.log('quote token update proposed:', args.newQuoteToken) + * }, + * }) + * ``` + * + * @param config - Config. + * @param parameters - Parameters. + * @returns A function to unsubscribe from the event. + */ +export function watchUpdateQuoteToken( + config: config, + parameters: watchUpdateQuoteToken.Parameters, +) { + const { chainId, ...rest } = parameters + const client = config.getClient({ chainId }) + return Actions.token.watchUpdateQuoteToken(client, rest) +} + +export declare namespace watchUpdateQuoteToken { + export type Parameters = ChainIdParameter & + Actions.token.watchUpdateQuoteToken.Parameters +} diff --git a/packages/core/src/tempo/actions/utils.ts b/packages/core/src/tempo/actions/utils.ts new file mode 100644 index 0000000000..813274785e --- /dev/null +++ b/packages/core/src/tempo/actions/utils.ts @@ -0,0 +1,52 @@ +import type * as Query from '@tanstack/query-core' +import type { RequiredBy, UnionLooseOmit } from '../../types/utils.js' + +export type QueryParameter< + queryFnData = unknown, + error = Query.DefaultError, + data = queryFnData, + queryKey extends Query.QueryKey = Query.QueryKey, +> = { + query?: + | UnionLooseOmit< + QueryOptions, + 'queryKey' | 'queryFn' + > + | undefined +} + +export type QueryOptions< + queryFnData = unknown, + error = Query.DefaultError, + data = queryFnData, + queryKey extends Query.QueryKey = Query.QueryKey, +> = RequiredBy< + Query.QueryOptions, + 'queryKey' | 'queryFn' +> & { enabled: boolean } + +export function filterQueryOptions>( + options: type, +): type { + // biome-ignore format: no formatting + const { + // import('@tanstack/query-core').QueryOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing + _defaulted, behavior, gcTime, initialData, initialDataUpdatedAt, maxPages, meta, networkMode, queryFn, queryHash, queryKey, queryKeyHashFn, retry, retryDelay, structuralSharing, + + // import('@tanstack/query-core').InfiniteQueryObserverOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing + getPreviousPageParam, getNextPageParam, initialPageParam, + + // import('@tanstack/react-query').UseQueryOptions + // biome-ignore lint/correctness/noUnusedVariables: tossing + _optimisticResults, enabled, notifyOnChangeProps, placeholderData, refetchInterval, refetchIntervalInBackground, refetchOnMount, refetchOnReconnect, refetchOnWindowFocus, retryOnMount, select, staleTime, suspense, throwOnError, + + // wagmi + // biome-ignore lint/correctness/noUnusedVariables: tossing + config, connector, query, + ...rest + } = options + + return rest as type +} diff --git a/packages/core/src/transports/connector.test.ts b/packages/core/src/transports/connector.test.ts index 2af97a420b..74a3fbe580 100644 --- a/packages/core/src/transports/connector.test.ts +++ b/packages/core/src/transports/connector.test.ts @@ -28,19 +28,19 @@ test('setup', () => { `) }) -test('behavior: connector type not found', () => { +test('behavior: connector type not found', async () => { const transport = unstable_connector({ type: 'foo' })({}) - expect(() => + await expect(() => transport.request({ method: 'eth_chainId' }), ).rejects.toThrowErrorMatchingInlineSnapshot(` [ProviderDisconnectedError: The Provider is disconnected from all chains. Details: Could not find connector of type "foo" in \`connectors\` passed to \`createConfig\`. - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) -test('behavior: provider is disconnected', () => { +test('behavior: provider is disconnected', async () => { const transport = unstable_connector(mock)({ connectors: createStore(() => [ { @@ -52,17 +52,17 @@ test('behavior: provider is disconnected', () => { ]), }) - expect(() => + await expect(() => transport.request({ method: 'eth_chainId' }), ).rejects.toThrowErrorMatchingInlineSnapshot(` [ProviderDisconnectedError: The Provider is disconnected from all chains. Details: Provider is disconnected. - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) -test('behavior: chainId mismatch', () => { +test('behavior: chainId mismatch', async () => { const transport = unstable_connector(mock)({ chain: optimism, connectors: createStore(() => [ @@ -76,22 +76,22 @@ test('behavior: chainId mismatch', () => { ]), }) - expect(() => + await expect(() => transport.request({ method: 'eth_chainId' }), ).rejects.toThrowErrorMatchingInlineSnapshot(` [ChainDisconnectedError: The Provider is not connected to the requested chain. Details: The current chain of the connector (id: 1) does not match the target chain for the request (id: 10 – OP Mainnet). - Version: viem@2.23.12] + Version: viem@2.44.0] `) }) -test('behavior: request', () => { +test('behavior: request', async () => { const transport = unstable_connector(mock)({ connectors: createStore(() => [connector]), }) - expect( + await expect( transport.request({ method: 'eth_chainId' }), ).resolves.toThrowErrorMatchingInlineSnapshot(`"0x1"`) }) diff --git a/packages/core/src/transports/connector.ts b/packages/core/src/transports/connector.ts index 0f03d43188..d56f63ae3b 100644 --- a/packages/core/src/transports/connector.ts +++ b/packages/core/src/transports/connector.ts @@ -1,13 +1,13 @@ import { ChainDisconnectedError, + createTransport, type EIP1193Parameters, type EIP1193Provider, type EIP1193RequestFn, + hexToNumber, ProviderDisconnectedError, type TransportConfig, type WalletRpcSchema, - createTransport, - hexToNumber, withRetry, withTimeout, } from 'viem' diff --git a/packages/core/src/types/query.ts b/packages/core/src/types/query.ts new file mode 100644 index 0000000000..3b5a2fbd76 --- /dev/null +++ b/packages/core/src/types/query.ts @@ -0,0 +1,40 @@ +import type * as Query from '@tanstack/query-core' +import type { RequiredBy, UnionLooseOmit } from './utils.js' + +export type QueryParameter< + queryFnData = unknown, + error = Query.DefaultError, + data = queryFnData, + queryKey extends Query.QueryKey = Query.QueryKey, +> = { + query?: + | UnionLooseOmit< + QueryOptions, + 'queryKey' | 'queryFn' + > + | undefined +} + +export type QueryOptions< + queryFnData = unknown, + error = Query.DefaultError, + data = queryFnData, + queryKey extends Query.QueryKey = Query.QueryKey, +> = Omit< + RequiredBy< + Query.QueryObserverOptions, + 'queryKey' + >, + 'queryFn' | 'queryHash' | 'queryKeyHashFn' | 'throwOnError' +> & { + queryFn: Exclude< + Query.QueryObserverOptions< + queryFnData, + error, + data, + queryFnData, + queryKey + >['queryFn'], + typeof Query.skipToken | undefined + > +} diff --git a/packages/core/src/types/register.ts b/packages/core/src/types/register.ts index db420adfdc..70e473d320 100644 --- a/packages/core/src/types/register.ts +++ b/packages/core/src/types/register.ts @@ -1,6 +1,6 @@ import type { Config } from '../createConfig.js' -// biome-ignore lint/suspicious/noEmptyInterface: +// biome-ignore lint/suspicious/noEmptyInterface: using export interface Register {} export type ResolvedRegister = { config: Register extends { config: infer config extends Config } diff --git a/packages/core/src/types/unit.ts b/packages/core/src/types/unit.ts deleted file mode 100644 index a64f794a87..0000000000 --- a/packages/core/src/types/unit.ts +++ /dev/null @@ -1 +0,0 @@ -export type Unit = 'ether' | 'gwei' | 'wei' | number diff --git a/packages/core/src/types/utils.ts b/packages/core/src/types/utils.ts index aecd58a142..158e4f044f 100644 --- a/packages/core/src/types/utils.ts +++ b/packages/core/src/types/utils.ts @@ -11,6 +11,23 @@ export type ExactPartial = { [key in keyof type]?: type[key] | undefined } +/** + * Creates a fixed array of `count` elements of type `type`. + * + * @example + * ```ts + * type Result = FixedArray + * // ^? type Result = readonly [string, string, string] + * ``` + */ +export type FixedArray< + type, + count extends number, + result extends readonly type[] = [], +> = result['length'] extends count + ? result + : FixedArray + /** Checks if {@link type} can be narrowed further than {@link type2} */ export type IsNarrowable = IsUnknown extends true ? false @@ -74,6 +91,25 @@ export type RemoveUndefined = { [key in keyof type]: NonNullable } +/** + * Creates a type that is {@link type} with the required keys {@link key}. + * + * @example + * ```ts + * RequiredBy<{ a?: string, b: number }, 'a'> + * // { a: string, b: number } + * ``` + * + * @internal + */ +export type RequiredBy = Omit & + ExactRequired> + +/** @internal */ +export type ExactRequired = { + [key in keyof type]-?: Exclude +} + /////////////////////////////////////////////////////////////////////////// // Loose types diff --git a/packages/core/src/utils/cookie.ts b/packages/core/src/utils/cookie.ts index ccd07bc7b7..e8c46bc0b5 100644 --- a/packages/core/src/utils/cookie.ts +++ b/packages/core/src/utils/cookie.ts @@ -10,10 +10,12 @@ export const cookieStorage = { }, setItem(key, value) { if (typeof window === 'undefined') return + // biome-ignore lint/suspicious/noDocumentCookie: using document.cookie = `${key}=${value};path=/;samesite=Lax` }, removeItem(key) { if (typeof window === 'undefined') return + // biome-ignore lint/suspicious/noDocumentCookie: using document.cookie = `${key}=;max-age=-1;path=/` }, } satisfies BaseStorage diff --git a/packages/core/src/utils/deepEqual.ts b/packages/core/src/utils/deepEqual.ts index 89b47a6bdd..253fe1bdf1 100644 --- a/packages/core/src/utils/deepEqual.ts +++ b/packages/core/src/utils/deepEqual.ts @@ -16,17 +16,22 @@ export function deepEqual(a: any, b: any) { return true } - if (a.valueOf !== Object.prototype.valueOf) + if ( + typeof a.valueOf === 'function' && + a.valueOf !== Object.prototype.valueOf + ) return a.valueOf() === b.valueOf() - if (a.toString !== Object.prototype.toString) + if ( + typeof a.toString === 'function' && + a.toString !== Object.prototype.toString + ) return a.toString() === b.toString() const keys = Object.keys(a) length = keys.length if (length !== Object.keys(b).length) return false - for (i = length; i-- !== 0; ) - if (!Object.prototype.hasOwnProperty.call(b, keys[i]!)) return false + for (i = length; i-- !== 0; ) if (!Object.hasOwn(b, keys[i]!)) return false for (i = length; i-- !== 0; ) { const key = keys[i] @@ -38,6 +43,6 @@ export function deepEqual(a: any, b: any) { } // true if both NaN, false otherwise - // biome-ignore lint/suspicious/noSelfCompare: + // biome-ignore lint/suspicious/noSelfCompare: using return a !== a && b !== b } diff --git a/packages/core/src/utils/getUnit.test.ts b/packages/core/src/utils/getUnit.test.ts deleted file mode 100644 index 1054303def..0000000000 --- a/packages/core/src/utils/getUnit.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { expect, test } from 'vitest' - -import { getUnit } from './getUnit.js' - -test('default', () => { - expect(getUnit(1)).toMatchInlineSnapshot('1') - expect(getUnit('wei')).toMatchInlineSnapshot('0') - expect(getUnit('ether')).toMatchInlineSnapshot('18') -}) diff --git a/packages/core/src/utils/getUnit.ts b/packages/core/src/utils/getUnit.ts deleted file mode 100644 index 084f45b622..0000000000 --- a/packages/core/src/utils/getUnit.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { weiUnits } from 'viem' - -import type { Unit } from '../types/unit.js' - -export function getUnit(unit: Unit) { - if (typeof unit === 'number') return unit - if (unit === 'wei') return 0 - return Math.abs(weiUnits[unit]) -} diff --git a/packages/core/src/utils/normalizeChainId.test.ts b/packages/core/src/utils/normalizeChainId.test.ts deleted file mode 100644 index de9d1882e3..0000000000 --- a/packages/core/src/utils/normalizeChainId.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { expect, test } from 'vitest' - -import { normalizeChainId } from './normalizeChainId.js' - -test.each([ - { chainId: 1, expected: 1 }, - { chainId: '1', expected: 1 }, - { chainId: '0x1', expected: 1 }, - { chainId: '0x4', expected: 4 }, - { chainId: 42, expected: 42 }, - { chainId: '42', expected: 42 }, - { chainId: '0x2a', expected: 42 }, - { chainId: ' 0x2a', expected: 42 }, - { chainId: BigInt(1), expected: 1 }, - { chainId: BigInt(10), expected: 10 }, -])('normalizeChainId($chainId)', ({ chainId, expected }) => { - expect(normalizeChainId(chainId)).toEqual(expected) -}) - -test('unknown type', () => { - expect(() => normalizeChainId({})).toThrow( - 'Cannot normalize chainId "[object Object]" of type "object"', - ) -}) diff --git a/packages/core/src/utils/normalizeChainId.ts b/packages/core/src/utils/normalizeChainId.ts deleted file mode 100644 index a1017c0953..0000000000 --- a/packages/core/src/utils/normalizeChainId.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** @deprecated use `Number` instead */ -export function normalizeChainId(chainId: bigint | number | string | unknown) { - if (typeof chainId === 'string') - return Number.parseInt( - chainId, - chainId.trim().substring(0, 2) === '0x' ? 16 : 10, - ) - if (typeof chainId === 'bigint') return Number(chainId) - if (typeof chainId === 'number') return chainId - throw new Error( - `Cannot normalize chainId "${chainId}" of type "${typeof chainId}"`, - ) -} diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index 17faaa2ac7..33bf861fa9 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -1 +1 @@ -export const version = '2.16.7' +export const version = '3.2.2' diff --git a/packages/core/tsconfig.build.json b/packages/core/tsconfig.build.json index fbed2b1036..b77c50413c 100644 --- a/packages/core/tsconfig.build.json +++ b/packages/core/tsconfig.build.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.base.json", "include": ["src/**/*.ts"], - "exclude": ["src/**/*.test.ts", "src/**/*.test-d.ts"], + "exclude": ["src/**/*.bench-d.ts", "src/**/*.test.ts", "src/**/*.test-d.ts"], "compilerOptions": { "sourceMap": true } diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index bacbc9228c..d302866367 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "./tsconfig.build.json", "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": [] + "exclude": [], + "compilerOptions": { + "resolveJsonModule": true + } } diff --git a/packages/create-wagmi/CHANGELOG.md b/packages/create-wagmi/CHANGELOG.md index 7ab58fe7e1..1c271ba928 100644 --- a/packages/create-wagmi/CHANGELOG.md +++ b/packages/create-wagmi/CHANGELOG.md @@ -1,5 +1,35 @@ # create-wagmi +## 2.0.19 + +### Patch Changes + +- Fixed Vite React template build by removing global Buffer patch ([#4900](https://github.com/wevm/wagmi/pull/4900)) + +## 2.0.18 + +### Patch Changes + +- Bumped next.js template dependencies ([`d717d86`](https://github.com/wevm/wagmi/commit/d717d86962a6335d9c23e7fe530f17bae16f4e10)) + +## 2.0.17 + +### Patch Changes + +- Bumped next.js template dependencies ([`99c7e2f`](https://github.com/wevm/wagmi/commit/99c7e2f096ef3fc277b3f517c0ddd983bd920880)) + +## 2.0.16 + +### Patch Changes + +- Bumped Wagmi version ([`0112d33`](https://github.com/wevm/wagmi/commit/0112d33a20340f37b3b19538f55e1f32cb24c5f1)) + +## 2.0.15 + +### Patch Changes + +- [#4673](https://github.com/wevm/wagmi/pull/4673) [`c49866724e182920e369193201d1308259c3968e`](https://github.com/wevm/wagmi/commit/c49866724e182920e369193201d1308259c3968e) Thanks [@imaksp](https://github.com/imaksp)! - Fixed Next.js template type error + ## 2.0.14 ### Patch Changes diff --git a/packages/create-wagmi/package.json b/packages/create-wagmi/package.json index b594422ae9..55e9048c2d 100644 --- a/packages/create-wagmi/package.json +++ b/packages/create-wagmi/package.json @@ -1,7 +1,7 @@ { "name": "create-wagmi", "description": "Create Wagmi apps with one command", - "version": "2.0.14", + "version": "2.0.19", "license": "MIT", "repository": { "type": "git", @@ -9,7 +9,7 @@ "directory": "packages/create-wagmi" }, "scripts": { - "build": "pnpm run clean && pnpm run build:esm+types", + "build": "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", @@ -40,10 +40,21 @@ }, "devDependencies": { "@types/cross-spawn": "^6.0.6", - "@types/node": "^20.12.10", + "@types/node": "^24.5.1", "@types/prompts": "^2.4.9" }, - "contributors": ["awkweb.eth ", "jxom.eth "], + "contributors": [ + "awkweb.eth ", + "jxom.eth " + ], "funding": "https://github.com/sponsors/wevm", - "keywords": ["wagmi", "eth", "ethereum", "dapps", "wallet", "web3", "cli"] + "keywords": [ + "wagmi", + "eth", + "ethereum", + "dapps", + "wallet", + "web3", + "cli" + ] } diff --git a/packages/create-wagmi/src/cli.ts b/packages/create-wagmi/src/cli.ts index ecb6a25a4c..47cbd4fdbf 100644 --- a/packages/create-wagmi/src/cli.ts +++ b/packages/create-wagmi/src/cli.ts @@ -98,7 +98,7 @@ async function init() { { type(_, { overwrite }: { overwrite?: boolean }) { if (overwrite === false) - throw new Error(`${pc.red('✖')} Operation cancelled`) + throw new Error(`${pc.red('×')} Operation cancelled`) return null }, name: 'overwriteChecker', @@ -154,12 +154,11 @@ async function init() { ], { onCancel() { - throw new Error(`${pc.red('✖')} Operation cancelled`) + throw new Error(`${pc.red('×')} Operation cancelled`) }, }, ) } catch (error) { - // biome-ignore lint/suspicious/noConsoleLog: console.log((error as Error).message) return } @@ -222,7 +221,6 @@ async function init() { process.exit(status ?? 0) } - // biome-ignore lint/suspicious/noConsoleLog: console.log(`\nScaffolding project in ${root}...`) const templateDir = path.resolve( @@ -251,10 +249,8 @@ async function init() { write('package.json', `${JSON.stringify(pkg, null, 2)}\n`) const cdProjectName = path.relative(cwd, root) - // biome-ignore lint/suspicious/noConsoleLog: console.log('\nDone. Now run:\n') if (root !== cwd) - // biome-ignore lint/suspicious/noConsoleLog: console.log( ` cd ${ cdProjectName.includes(' ') ? `"${cdProjectName}"` : cdProjectName @@ -263,22 +259,18 @@ async function init() { switch (pkgManager) { case 'yarn': - // biome-ignore lint/suspicious/noConsoleLog: console.log(' yarn') - // biome-ignore lint/suspicious/noConsoleLog: console.log(' yarn dev') break default: - // biome-ignore lint/suspicious/noConsoleLog: console.log(` ${pkgManager} install`) - // biome-ignore lint/suspicious/noConsoleLog: console.log(` ${pkgManager} run dev`) break } - // biome-ignore lint/suspicious/noConsoleLog: console.log() } init().catch((e) => { + // biome-ignore lint/suspicious/noConsole: logging error console.error(e) }) diff --git a/packages/create-wagmi/src/version.ts b/packages/create-wagmi/src/version.ts index 5556800c0d..af7c307380 100644 --- a/packages/create-wagmi/src/version.ts +++ b/packages/create-wagmi/src/version.ts @@ -1 +1 @@ -export const version = '2.0.14' +export const version = '2.0.19' diff --git a/packages/create-wagmi/templates/next/_env.local b/packages/create-wagmi/templates/next/_env.local index 9a11dba16a..05c008e2cd 100644 --- a/packages/create-wagmi/templates/next/_env.local +++ b/packages/create-wagmi/templates/next/_env.local @@ -1,2 +1 @@ -NEXT_PUBLIC_WC_PROJECT_ID= -NEXT_TELEMETRY_DISABLED=1 \ No newline at end of file +NEXT_TELEMETRY_DISABLED=1 diff --git a/packages/create-wagmi/templates/next/next.config.js b/packages/create-wagmi/templates/next/next.config.js deleted file mode 100644 index 767719fc4f..0000000000 --- a/packages/create-wagmi/templates/next/next.config.js +++ /dev/null @@ -1,4 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = {} - -module.exports = nextConfig diff --git a/packages/create-wagmi/templates/next/next.config.ts b/packages/create-wagmi/templates/next/next.config.ts new file mode 100644 index 0000000000..e4f5738a31 --- /dev/null +++ b/packages/create-wagmi/templates/next/next.config.ts @@ -0,0 +1,5 @@ +import type { NextConfig } from 'next' + +const nextConfig: NextConfig = {} + +export default nextConfig diff --git a/packages/create-wagmi/templates/next/package.json b/packages/create-wagmi/templates/next/package.json index 141027a8de..a65a88a3e2 100644 --- a/packages/create-wagmi/templates/next/package.json +++ b/packages/create-wagmi/templates/next/package.json @@ -1,7 +1,7 @@ { "name": "wagmi-next-starter", "private": true, - "version": "0.0.0", + "type": "module", "scripts": { "dev": "next dev", "build": "next build", @@ -9,24 +9,18 @@ "lint": "next lint" }, "dependencies": { - "@tanstack/react-query": "5.45.1", - "next": "14.2.4", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "@tanstack/react-query": "latest", + "next": "latest", + "react": "latest", + "react-dom": "latest", "viem": "latest", "wagmi": "latest" }, "devDependencies": { - "@types/node": "^20.12.10", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", + "@types/node": "^24.10.1", + "@types/react": "latest", + "@types/react-dom": "latest", "@wagmi/cli": "latest", - "bufferutil": "^4.0.8", - "encoding": "^0.1.13", - "lokijs": "^1.5.12", - "pino-pretty": "^10.3.1", - "supports-color": "^9.4.0", - "typescript": "^5.4.5", - "utf-8-validate": "^5.0.2" + "typescript": "latest" } } diff --git a/packages/create-wagmi/templates/next/src/app/page.tsx b/packages/create-wagmi/templates/next/src/app/page.tsx index f5dcbdf812..47cf783673 100644 --- a/packages/create-wagmi/templates/next/src/app/page.tsx +++ b/packages/create-wagmi/templates/next/src/app/page.tsx @@ -1,26 +1,27 @@ 'use client' -import { useAccount, useConnect, useDisconnect } from 'wagmi' +import { useConnect, useConnection, useConnectors, useDisconnect } from 'wagmi' function App() { - const account = useAccount() - const { connectors, connect, status, error } = useConnect() + const connection = useConnection() + const { connect, status, error } = useConnect() + const connectors = useConnectors() const { disconnect } = useDisconnect() return ( <>
-

Account

+

Connection

- status: {account.status} + status: {connection.status}
- addresses: {JSON.stringify(account.addresses)} + addresses: {JSON.stringify(connection.addresses)}
- chainId: {account.chainId} + chainId: {connection.chainId}
- {account.status === 'connected' && ( + {connection.status === 'connected' && ( diff --git a/packages/create-wagmi/templates/next/src/wagmi.ts b/packages/create-wagmi/templates/next/src/wagmi.ts index b34f4c0079..d8689e161b 100644 --- a/packages/create-wagmi/templates/next/src/wagmi.ts +++ b/packages/create-wagmi/templates/next/src/wagmi.ts @@ -1,15 +1,9 @@ -import { http, cookieStorage, createConfig, createStorage } from 'wagmi' +import { cookieStorage, createConfig, createStorage, http } from 'wagmi' import { mainnet, sepolia } from 'wagmi/chains' -import { coinbaseWallet, injected, walletConnect } from 'wagmi/connectors' export function getConfig() { return createConfig({ chains: [mainnet, sepolia], - connectors: [ - injected(), - coinbaseWallet(), - walletConnect({ projectId: process.env.NEXT_PUBLIC_WC_PROJECT_ID }), - ], storage: createStorage({ storage: cookieStorage, }), diff --git a/packages/create-wagmi/templates/next/tsconfig.json b/packages/create-wagmi/templates/next/tsconfig.json index e59724b283..19ad37b31c 100644 --- a/packages/create-wagmi/templates/next/tsconfig.json +++ b/packages/create-wagmi/templates/next/tsconfig.json @@ -11,7 +11,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -22,6 +22,12 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/dev/types/**/*.ts", + ".next/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/packages/create-wagmi/templates/nuxt/_env.local b/packages/create-wagmi/templates/nuxt/_env.local index 437e9e3e7b..3e22d2a1db 100644 --- a/packages/create-wagmi/templates/nuxt/_env.local +++ b/packages/create-wagmi/templates/nuxt/_env.local @@ -1,3 +1,2 @@ -NUXT_PUBLIC_WC_PROJECT_ID= NUXT_TELEMETRY_DISABLED=1 diff --git a/packages/create-wagmi/templates/nuxt/app.vue b/packages/create-wagmi/templates/nuxt/app.vue index 98b46bf528..4996e293d9 100644 --- a/packages/create-wagmi/templates/nuxt/app.vue +++ b/packages/create-wagmi/templates/nuxt/app.vue @@ -1,6 +1,6 @@ diff --git a/site/core/api/actions.md b/site/core/api/actions.md index 664cd9a86a..a57b06d3ef 100644 --- a/site/core/api/actions.md +++ b/site/core/api/actions.md @@ -13,7 +13,7 @@ Actions for accounts, wallets, contracts, transactions, signing, ENS, and more. ## Import ```ts -import { getAccount } from '@wagmi/core' +import { getConnection } from '@wagmi/core' ``` ## Available Actions diff --git a/site/core/api/actions/call.md b/site/core/api/actions/call.md index 52f202a570..01e1e5b523 100644 --- a/site/core/api/actions/call.md +++ b/site/core/api/actions/call.md @@ -33,6 +33,7 @@ await call(config, { ## Parameters ```ts twoslash +// @twoslash-cache: {"v":1,"hash":"f9d98dd791931821ca041f2ffa5df1409ff16b6299b7878935aa5d977af43747","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWABWalmAWxg1ScADwBjCGABm7AOa86NMFDjC1mnQF5jG7QD5eFka3GSZcskYBkw/M3ZgAklASUrLyKiY2ADpg7NJYEKRowqJBLvIIVHBokgyIAIwALFSsMGBaaPhIBVRZpFpyeA5Owa4KlCAcYLiIAAxUyt5SyvKV+QC+ALp90F0gMXEJvMD82DBJjikhbryjvOqkENK8AOQAAgDuzFrS7AD0qqQwR20hzEigeiVw7Gp4aAijoyAA"} import { type CallParameters } from '@wagmi/core' ``` @@ -147,7 +148,7 @@ await call(config, { `bigint | undefined` -The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -169,7 +170,7 @@ await call(config, { `bigint | undefined` -Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -191,7 +192,7 @@ await call(config, { `bigint | undefined` -Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -320,6 +321,7 @@ await call(config, { ## Return Type ```ts twoslash +// @twoslash-cache: {"v":1,"hash":"21d9f77d5084c8206ac7e44980e375eda94c1b843ad4d776e3c3ed3a076f7de7","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWAJRhoArqTAAVbDF4BeXsAA6YXtt5RmaZol4AJOrwA+vKWFgAzdmBhQA3JoC+m9gFssEUmmFRCWlZBRxKEDgDfyQARgAWKlYYMABzNHw4xOpmUlTJPBFWcUkZeUUIjkckAAYqAGN8XOZ6mnJEBLcAXQboXEQQb19/NX5FQOLgsrClN15bUggvXgByAAEAd2ZUr3YAenq/GBWIr0lmJFA6GjA4dggwPDQENzcgA==="} import { type CallReturnType } from '@wagmi/core' ``` @@ -330,6 +332,7 @@ The call data. ## Error ```ts twoslash +// @twoslash-cache: {"v":1,"hash":"b8acbdeab78439603d8a045b8f32426b8530ecc55b9057e0cccd65e1da03193a","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAMJtWAUVKkIpACrYYvALy8A8gFt2aADwjW42jADGAVzTsIYCVNnyKvADohDzY3BiOAfLwBkvYPbBeIN5nVxhEXgAFZlI3AEFDQwhjMDQraTlBAB9eAEkwIjZ2KDioKFJ4OHSbbN4EpJS0AGU0ZhohCwAzDkM0yQz5Xhz8mgBzMhVTFU6AJWYwcerMhRym9gAvGDFaQxgYKDhosvYFtc2lwZyL2pa2mDi4OHZRsDUYVI6wbvZe65W8gpFKAAIQwNDgABl3qM0Pg/kNeAA6ZG8ABsAEZeGppApkYiEQBxGBoABy0C2/VIM2JxlIYGWAG4AgBfALsNRYaRoYSiP6UEBwVqkBiIdEAFiorGhsKQ6IAzFQheMRSBdOJKct+RwwLhEAAGKiGfAxZi9MiysXMgC6hvJeHZnOFfn4gzV8OZvE6UjUvAA5AABADuzFGGgA9EkKr7+W9WkhQHQaGAnhY8GgEMzmUA=="} import { type CallErrorType } from '@wagmi/core' ``` @@ -337,4 +340,4 @@ import { type CallErrorType } from '@wagmi/core' ## Viem -- [`call`](https://viem.sh/docs/actions/public/call.html) +- [`call`](https://viem.sh/docs/actions/public/call) diff --git a/site/core/api/actions/connect.md b/site/core/api/actions/connect.md index 30d04a85e3..c73c2a5bfc 100644 --- a/site/core/api/actions/connect.md +++ b/site/core/api/actions/connect.md @@ -75,12 +75,51 @@ const result = await connect(config, { <<< @/snippets/core/config.ts[config.ts] ::: +### withCapabilities + +`boolean | undefined` + +- Exposes [capabilities](https://eips.ethereum.org/EIPS/eip-7846#capabilities) on return type. +- Defaults to `false`. + +::: code-group +```ts [index.ts] +import { connect } from '@wagmi/core' +import { mainnet } from '@wagmi/core/chains' +import { injected } from '@wagmi/connectors' +import { config } from './config' + +const result = await connect(config, { + connector: injected(), + withCapabilities: true, // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + ## Return Type ```ts import { type ConnectReturnType } from '@wagmi/core' ``` +::: tip +When [`withCapabilities: false | undefined`](#withcapabilities): +```ts +type ConnectReturnType = { + accounts: readonly Address[] + // ... +} +``` +When [`withCapabilities: true`](#withcapabilities): +```ts +type ConnectReturnType = { + accounts: readonly { address: Address; capabilities: Record }[] + // ... +} +``` +::: + ### accounts `readonly [Address, ...Address[]]` diff --git a/site/core/api/actions/deployContract.md b/site/core/api/actions/deployContract.md index 3cdbfd130f..9998233054 100644 --- a/site/core/api/actions/deployContract.md +++ b/site/core/api/actions/deployContract.md @@ -215,11 +215,11 @@ export const wagmiAbi = [ ::: code-group ```ts [index.ts] -import { getAccount, deployContract } from '@wagmi/core' +import { getConnection, deployContract } from '@wagmi/core' import { wagmiAbi } from './abi' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await deployContract(config, { abi: wagmiAbi, args: [69420], @@ -247,7 +247,7 @@ export const wagmiAbi = [ import { type DeployContractReturnType } from '@wagmi/core' ``` -[`Hash`](https://viem.sh/docs/glossary/types.html#hash) +[`Hash`](https://viem.sh/docs/glossary/types#hash) Transaction hash. diff --git a/site/core/api/actions/disconnect.md b/site/core/api/actions/disconnect.md index 6c77fb5c74..c98e969cae 100644 --- a/site/core/api/actions/disconnect.md +++ b/site/core/api/actions/disconnect.md @@ -40,10 +40,10 @@ import { type DisconnectParameters } from '@wagmi/core' ::: code-group ```ts [index.ts] -import { disconnect, getAccount } from '@wagmi/core' +import { disconnect, getConnection } from '@wagmi/core' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await disconnect(config, { connector, // [!code focus] }) diff --git a/site/core/api/actions/estimateFeesPerGas.md b/site/core/api/actions/estimateFeesPerGas.md index ce804efeb9..dfbd119635 100644 --- a/site/core/api/actions/estimateFeesPerGas.md +++ b/site/core/api/actions/estimateFeesPerGas.md @@ -51,25 +51,6 @@ const result = await estimateFeesPerGas(config, { <<< @/snippets/core/config.ts[config.ts] ::: -### formatUnits - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { estimateFeesPerGas } from '@wagmi/core' -import { config } from './config' - -const feesPerGas = estimateFeesPerGas(config, { - formatUnits: 'ether', // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - ### type `'legacy' | 'eip1559'` @@ -95,16 +76,10 @@ const result = estimateFeesPerGas(config, { import { type EstimateFeesPerGasReturnType } from '@wagmi/core' ``` -[`FeeValues`](https://viem.sh/docs/glossary/types.html#feevalues) +[`FeeValues`](https://viem.sh/docs/glossary/types#feevalues) An estimate (in wei) for the fees per gas. -### formatted - -`{ gasPrice: string | undefined; maxFeePerGas: string | undefined; maxPriorityFeePerGas: string | undefined; }` - -Object of formatted values using [`formatUnits`](#formatunits). - ### gasPrice `bigint | undefined` @@ -136,4 +111,4 @@ import { type EstimateFeesPerGasErrorType } from '@wagmi/core' ## Viem -- [`estimateFeesPerGas`](https://viem.sh/docs/actions/public/estimateFeesPerGas.html) +- [`estimateFeesPerGas`](https://viem.sh/docs/actions/public/estimateFeesPerGas) diff --git a/site/core/api/actions/estimateGas.md b/site/core/api/actions/estimateGas.md index cbeb1ba40d..2a1f243fee 100644 --- a/site/core/api/actions/estimateGas.md +++ b/site/core/api/actions/estimateGas.md @@ -173,7 +173,7 @@ const result = await estimateGas(config, { `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -194,7 +194,7 @@ const result = await estimateGas(config, { `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -215,7 +215,7 @@ const result = await estimateGas(config, { `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -337,4 +337,4 @@ import { type EstimateGasErrorType } from '@wagmi/core' ## Viem -- [`estimateGas`](https://viem.sh/docs/actions/public/estimateGas.html) +- [`estimateGas`](https://viem.sh/docs/actions/public/estimateGas) diff --git a/site/core/api/actions/estimateMaxPriorityFeePerGas.md b/site/core/api/actions/estimateMaxPriorityFeePerGas.md index 906e98b931..468504bcb5 100644 --- a/site/core/api/actions/estimateMaxPriorityFeePerGas.md +++ b/site/core/api/actions/estimateMaxPriorityFeePerGas.md @@ -71,4 +71,4 @@ import { type EstimateFeesPerGasErrorType } from '@wagmi/core' ## Viem -- [`estimateMaxPriorityFeePerGas`](https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas.html) +- [`estimateMaxPriorityFeePerGas`](https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas) diff --git a/site/core/api/actions/getAccount.md b/site/core/api/actions/getAccount.md deleted file mode 100644 index a8dde7602e..0000000000 --- a/site/core/api/actions/getAccount.md +++ /dev/null @@ -1,29 +0,0 @@ -# getAccount - -Action for getting current account. - -## Import - -```ts -import { getAccount } from '@wagmi/core' -``` - -## Usage - -::: code-group -```ts [index.ts] -import { getAccount } from '@wagmi/core' -import { config } from './config' - -const account = getAccount(config) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -## Return Type - -```ts -import { type GetAccountReturnType } from '@wagmi/core' -``` - - diff --git a/site/core/api/actions/getBalance.md b/site/core/api/actions/getBalance.md index 192d5a69ce..6b8ce03194 100644 --- a/site/core/api/actions/getBalance.md +++ b/site/core/api/actions/getBalance.md @@ -6,7 +6,7 @@ const typeName = 'GetBalance' # getBalance -Action for fetching native currency or token balance. +Action for fetching native currency balance. ## Import @@ -114,45 +114,6 @@ const balance = await getBalance(config, { <<< @/snippets/core/config.ts[config.ts] ::: -### token - -`Address | undefined` - -ERC-20 token address to get balance for. - -::: code-group -```ts [index.ts] -import { getBalance } from '@wagmi/core' -import { config } from './config' - -const balance = getBalance(config, { - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - token: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -### unit - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { getBalance } from '@wagmi/core' -import { config } from './config' - -const balance = getBalance(config, { - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - unit: 'ether', // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - ## Return Type ```ts @@ -165,17 +126,11 @@ import { type GetBalanceReturnType } from '@wagmi/core' Number of decimals for balance [`value`](#value). -### formatted - -`string` - -Formatted value of balance using [`unit`](#unit). - ### symbol `string` -Symbol of native currency or token. +Symbol of native currency. ### value @@ -193,5 +148,5 @@ import { type GetBalanceErrorType } from '@wagmi/core' ## Viem -- [`getBalance`](https://viem.sh/docs/actions/public/getBalance.html) for native currency balances -- [`multicall`](https://viem.sh/docs/actions/public/multicall.html) for token balances +- [`getBalance`](https://viem.sh/docs/actions/public/getBalance) for native currency balances +- [`multicall`](https://viem.sh/docs/contract/multicall) for token balances diff --git a/site/core/api/actions/getBlock.md b/site/core/api/actions/getBlock.md index 980b026247..a6ec92ade9 100644 --- a/site/core/api/actions/getBlock.md +++ b/site/core/api/actions/getBlock.md @@ -129,7 +129,7 @@ const blockNumber = await getBlock(config, { import { type GetBlockReturnType } from '@wagmi/core' ``` -[`Block`](https://viem.sh/docs/glossary/types.html#block) +[`Block`](https://viem.sh/docs/glossary/types#block) Information about the block. @@ -143,4 +143,4 @@ import { type GetBlockErrorType } from '@wagmi/core' ## Viem -- [`getBlock`](https://viem.sh/docs/actions/public/getBlock.html) +- [`getBlock`](https://viem.sh/docs/actions/public/getBlock) diff --git a/site/core/api/actions/getBlockNumber.md b/site/core/api/actions/getBlockNumber.md index ce13cbb14e..2ac9e3622c 100644 --- a/site/core/api/actions/getBlockNumber.md +++ b/site/core/api/actions/getBlockNumber.md @@ -89,5 +89,5 @@ import { type GetBlockNumberErrorType } from '@wagmi/core' ## Viem -- [`getBlockNumber`](https://viem.sh/docs/actions/public/getBlockNumber.html) -- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber.html) +- [`getBlockNumber`](https://viem.sh/docs/actions/public/getBlockNumber) +- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber) diff --git a/site/core/api/actions/getBlockTransactionCount.md b/site/core/api/actions/getBlockTransactionCount.md index c351272209..d3fa5fee5f 100644 --- a/site/core/api/actions/getBlockTransactionCount.md +++ b/site/core/api/actions/getBlockTransactionCount.md @@ -89,4 +89,4 @@ import { type GetBlockTransactionCountErrorType } from '@wagmi/core' ## Viem -- [`getBlockTransactionCount`](https://viem.sh/docs/actions/public/getBlockTransactionCount.html) +- [`getBlockTransactionCount`](https://viem.sh/docs/actions/public/getBlockTransactionCount) diff --git a/site/core/api/actions/getCallsStatus.md b/site/core/api/actions/getCallsStatus.md index 70ff75f74b..f6a4cc95cd 100644 --- a/site/core/api/actions/getCallsStatus.md +++ b/site/core/api/actions/getCallsStatus.md @@ -1,5 +1,5 @@ @@ -10,21 +10,17 @@ Action to fetch the status and receipts of a call batch that was sent via [`send [Read more.](https://github.com/ethereum/EIPs/blob/1663ea2e7a683285f977eda51c32cec86553f585/EIPS/eip-5792.md#wallet_getcallsstatus) -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: - ## Import ```ts -import { getCallsStatus } from '@wagmi/core/experimental' +import { getCallsStatus } from '@wagmi/core' ``` ## Usage ::: code-group ```ts [index.ts] -import { getCallsStatus } from '@wagmi/core/experimental' +import { getCallsStatus } from '@wagmi/core' import { config } from './config' const status = await getCallsStatus(config, { @@ -37,7 +33,7 @@ const status = await getCallsStatus(config, { ## Parameters ```ts -import { type GetCallsStatusParameters } from '@wagmi/core/experimental' +import { type GetCallsStatusParameters } from '@wagmi/core' ``` ### connector @@ -48,7 +44,7 @@ Connector to get call statuses with. ::: code-group ```ts [index.ts] -import { getConnections, getCallsStatus } from '@wagmi/core/experimental' +import { getConnections, getCallsStatus } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) @@ -68,7 +64,7 @@ Identifier of the call batch. ::: code-group ```ts [index.ts] -import { getCallsStatus } from '@wagmi/core/experimental' +import { getCallsStatus } from '@wagmi/core' import { config } from './config' const status = await getCallsStatus(config, { @@ -81,7 +77,7 @@ const status = await getCallsStatus(config, { ## Return Type ```ts -import { type GetCallsStatusReturnType } from '@wagmi/core/experimental' +import { type GetCallsStatusReturnType } from '@wagmi/core' ``` `{ status: 'PENDING' | 'CONFIRMED', receipts: TransactionReceipt[] }` @@ -91,11 +87,11 @@ The status and receipts of the call batch. ## Error ```ts -import { type GetCallsStatusErrorType } from '@wagmi/core/experimental' +import { type GetCallsStatusErrorType } from '@wagmi/core' ``` ## Viem -- [`getCallsStatus`](https://viem.sh/experimental/eip5792/getCallsStatus) +- [`getCallsStatus`](https://viem.sh/docs/actions/wallet/getCallsStatus) diff --git a/site/core/api/actions/getCapabilities.md b/site/core/api/actions/getCapabilities.md index 6fe8cd99e9..17914cd23b 100644 --- a/site/core/api/actions/getCapabilities.md +++ b/site/core/api/actions/getCapabilities.md @@ -1,5 +1,5 @@ @@ -10,21 +10,19 @@ Action to extract capabilities (grouped by chain ID) that a connected wallet sup [Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_getcapabilities) -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: + ## Import ```ts -import { getCapabilities } from '@wagmi/core/experimental' +import { getCapabilities } from '@wagmi/core' ``` ## Usage ::: code-group ```ts [index.ts] -import { getCapabilities } from '@wagmi/core/experimental' +import { getCapabilities } from '@wagmi/core' import { config } from './config' const capabilities = await getCapabilities(config) @@ -35,7 +33,7 @@ const capabilities = await getCapabilities(config) ## Parameters ```ts -import { type GetCapabilitiesParameters } from '@wagmi/core/experimental' +import { type GetCapabilitiesParameters } from '@wagmi/core' ``` ### account @@ -46,7 +44,7 @@ Fetch capabilities for the provided account. ::: code-group ```ts [index.ts] -import { getCapabilities } from '@wagmi/core/experimental' +import { getCapabilities } from '@wagmi/core' import { config } from './config' const capabilities = await getCapabilities(config, { @@ -64,7 +62,7 @@ Connector to get capabilities from. ::: code-group ```ts [index.ts] -import { getConnections, getCapabilities } from '@wagmi/core/experimental' +import { getConnections, getCapabilities } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) @@ -78,7 +76,7 @@ const capabilities = await getCapabilities(config, { ## Return Type ```ts -import { type GetCapabilitiesReturnType } from '@wagmi/core/experimental' +import { type GetCapabilitiesReturnType } from '@wagmi/core' ``` `bigint` @@ -88,11 +86,11 @@ Most recent block number seen. ## Error ```ts -import { type GetCapabilitiesErrorType } from '@wagmi/core/experimental' +import { type GetCapabilitiesErrorType } from '@wagmi/core' ``` ## Viem -- [`getCapabilities`](https://viem.sh/experimental/eip5792/getCapabilities) +- [`getCapabilities`](https://viem.sh/docs/actions/wallet/getCapabilities) diff --git a/site/core/api/actions/getClient.md b/site/core/api/actions/getClient.md index 9f29f73236..72d7739f42 100644 --- a/site/core/api/actions/getClient.md +++ b/site/core/api/actions/getClient.md @@ -1,6 +1,6 @@ # getClient -Action for getting Viem [`Client`](https://viem.sh/docs/clients/custom.html) instance. +Action for getting Viem [`Client`](https://viem.sh/docs/clients/custom) instance. ## Import @@ -53,4 +53,4 @@ import { type GetClientReturnType } from '@wagmi/core' `Client` -Viem [`Client`](https://viem.sh/docs/clients/custom.html) instance. +Viem [`Client`](https://viem.sh/docs/clients/custom) instance. diff --git a/site/core/api/actions/getConnection.md b/site/core/api/actions/getConnection.md new file mode 100644 index 0000000000..8f162d755d --- /dev/null +++ b/site/core/api/actions/getConnection.md @@ -0,0 +1,29 @@ +# getConnection + +Action for getting current connection. + +## Import + +```ts +import { getConnection } from '@wagmi/core' +``` + +## Usage + +::: code-group +```ts [index.ts] +import { getConnection } from '@wagmi/core' +import { config } from './config' + +const connection = getConnection(config) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Return Type + +```ts +import { type GetConnectionReturnType } from '@wagmi/core' +``` + + diff --git a/site/core/api/actions/getConnectorClient.md b/site/core/api/actions/getConnectorClient.md index 46d2795c7a..028094406e 100644 --- a/site/core/api/actions/getConnectorClient.md +++ b/site/core/api/actions/getConnectorClient.md @@ -6,7 +6,7 @@ const typeName = 'GetConnectorClient' # getConnectorClient -Action for getting a Viem [`Client`](https://viem.sh/docs/clients/custom.html) object for the current or provided connector. +Action for getting a Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector. ## Import @@ -97,7 +97,7 @@ import { type GetChainIdReturnType } from '@wagmi/core' `Client` -Viem [`Client`](https://viem.sh/docs/clients/custom.html) object for the current or provided connector. +Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector. ## Error diff --git a/site/core/api/actions/getEnsAddress.md b/site/core/api/actions/getEnsAddress.md index dc44dbb732..cc3bf07e3f 100644 --- a/site/core/api/actions/getEnsAddress.md +++ b/site/core/api/actions/getEnsAddress.md @@ -184,4 +184,4 @@ import { type GetEnsAddressErrorType } from '@wagmi/core' ## Viem -- [`getEnsAddress`](https://viem.sh/docs/ens/actions/getEnsAddress.html) +- [`getEnsAddress`](https://viem.sh/docs/ens/actions/getEnsAddress) diff --git a/site/core/api/actions/getEnsAvatar.md b/site/core/api/actions/getEnsAvatar.md index b7da4aa0f0..287452ce66 100644 --- a/site/core/api/actions/getEnsAvatar.md +++ b/site/core/api/actions/getEnsAvatar.md @@ -207,4 +207,4 @@ import { type getEnsAvatarError } from '@wagmi/core' ## Viem -- [`getEnsAvatar`](https://viem.sh/docs/ens/actions/getEnsAvatar.html) +- [`getEnsAvatar`](https://viem.sh/docs/ens/actions/getEnsAvatar) diff --git a/site/core/api/actions/getEnsName.md b/site/core/api/actions/getEnsName.md index f663923f94..ee234f9553 100644 --- a/site/core/api/actions/getEnsName.md +++ b/site/core/api/actions/getEnsName.md @@ -154,4 +154,4 @@ import { type GetEnsNameErrorType } from '@wagmi/core' ## Viem -- [`getEnsName`](https://viem.sh/docs/ens/actions/getEnsName.html) +- [`getEnsName`](https://viem.sh/docs/ens/actions/getEnsName) diff --git a/site/core/api/actions/getEnsResolver.md b/site/core/api/actions/getEnsResolver.md index c73301e071..4a95b4b779 100644 --- a/site/core/api/actions/getEnsResolver.md +++ b/site/core/api/actions/getEnsResolver.md @@ -164,4 +164,4 @@ import { type getEnsResolverError } from '@wagmi/core' ## Viem -- [`getEnsResolver`](https://viem.sh/docs/ens/actions/getEnsResolver.html) +- [`getEnsResolver`](https://viem.sh/docs/ens/actions/getEnsResolver) diff --git a/site/core/api/actions/getEnsText.md b/site/core/api/actions/getEnsText.md index a5ffb8ed5a..ec4d119382 100644 --- a/site/core/api/actions/getEnsText.md +++ b/site/core/api/actions/getEnsText.md @@ -192,4 +192,4 @@ import { type getEnsTextError } from '@wagmi/core' ## Viem -- [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText.html) +- [`getEnsText`](https://viem.sh/docs/ens/actions/getEnsText) diff --git a/site/core/api/actions/getFeeHistory.md b/site/core/api/actions/getFeeHistory.md index 3787d8f66b..22001da3d6 100644 --- a/site/core/api/actions/getFeeHistory.md +++ b/site/core/api/actions/getFeeHistory.md @@ -140,7 +140,7 @@ const feeHistory = await getFeeHistory(config, { import { type GetFeeHistoryReturnType } from '@wagmi/core' ``` -[`FeeHistory`](https://viem.sh/docs/glossary/types.html#feehistory) +[`FeeHistory`](https://viem.sh/docs/glossary/types#feehistory) The fee history. @@ -154,4 +154,4 @@ import { type GetFeeHistoryErrorType } from '@wagmi/core' ## Viem -- [`getFeeHistory`](https://viem.sh/docs/actions/public/getFeeHistory.html) +- [`getFeeHistory`](https://viem.sh/docs/actions/public/getFeeHistory) diff --git a/site/core/api/actions/getGasPrice.md b/site/core/api/actions/getGasPrice.md index 106829fcfd..632203d159 100644 --- a/site/core/api/actions/getGasPrice.md +++ b/site/core/api/actions/getGasPrice.md @@ -71,4 +71,4 @@ import { type GetGasPriceErrorType } from '@wagmi/core' ## Viem -- [`getGasPrice`](https://viem.sh/docs/actions/public/getGasPrice.html) +- [`getGasPrice`](https://viem.sh/docs/actions/public/getGasPrice) diff --git a/site/core/api/actions/getProof.md b/site/core/api/actions/getProof.md index 60cd493260..2a6b3ba39c 100644 --- a/site/core/api/actions/getProof.md +++ b/site/core/api/actions/getProof.md @@ -166,4 +166,4 @@ import { type GetProofErrorType } from '@wagmi/core' ## Viem -- [`getProof`](https://viem.sh/docs/actions/public/getProof.html) +- [`getProof`](https://viem.sh/docs/actions/public/getProof) diff --git a/site/core/api/actions/getPublicClient.md b/site/core/api/actions/getPublicClient.md index 437104aa78..2c30add85a 100644 --- a/site/core/api/actions/getPublicClient.md +++ b/site/core/api/actions/getPublicClient.md @@ -1,6 +1,6 @@ # getPublicClient -Action for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public.html) instance. +Action for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance. ## Import @@ -21,7 +21,7 @@ const client = getPublicClient(config) ::: ::: warning -If you want to optimize bundle size, you should use [`getClient`](/core/api/actions/getClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom.html#tree-shaking) instead. Since Public Client has all public actions attached directly to it. +If you want to optimize bundle size, you should use [`getClient`](/core/api/actions/getClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom#tree-shaking) instead. Since Public Client has all public actions attached directly to it. ::: ## Parameters @@ -57,4 +57,4 @@ import { type GetPublicClientReturnType } from '@wagmi/core' `PublicClient | undefined` -Viem [`PublicClient`](https://viem.sh/docs/clients/public.html) instance. +Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance. diff --git a/site/core/api/actions/getToken.md b/site/core/api/actions/getToken.md deleted file mode 100644 index b37805cff0..0000000000 --- a/site/core/api/actions/getToken.md +++ /dev/null @@ -1,141 +0,0 @@ - - -# getToken - -Action for fetching token info. - -## Import - -```ts -import { getToken } from '@wagmi/core' -``` - -## Usage - -::: code-group -```ts [index.ts] -import { getToken } from '@wagmi/core' -import { config } from './config' - -const token = getToken(config, { - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -## Parameters - -```ts -import { type GetTokenParameters } from '@wagmi/core' -``` - -### address - -`Address` - -Address to get token for. - -::: code-group -```ts [index.ts] -import { getToken } from '@wagmi/core' -import { config } from './config' - -const token = getToken(config, { - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -### chainId - -`config['chains'][number]['id'] | undefined` - -ID of chain to use when fetching data. - -::: code-group -```ts [index.ts] -import { getToken } from '@wagmi/core' -import { mainnet } from '@wagmi/core/chains' -import { config } from './config' - -const token = await getToken(config, { - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - chainId: mainnet.id, // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -### formatUnits - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { getToken } from '@wagmi/core' -import { config } from './config' - -const token = getToken(config, { - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - formatUnits: 'ether', // [!code focus] -}) -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -## Return Type - -```ts -import { type GetTokenReturnType } from '@wagmi/core' -``` - -### address - -`Address` - -Address of token. - -### decimals - -`number` - -Number of decimals for token. - -### name - -`string | undefined` - -Name of token. - -### symbol - -`string | undefined` - -Symbol of token. - -### totalSupply - -`{ formatted: string; value: bigint; }` - -Total supply of token. `formatted` is formatted using [`formatUnits`](#formatunits). - -## Error - -```ts -import { type GetTokenErrorType } from '@wagmi/core' -``` - - - -## Viem - -- [`multicall`](https://viem.sh/docs/contract/multicall) diff --git a/site/core/api/actions/getTransaction.md b/site/core/api/actions/getTransaction.md index 8ebe770990..43b11f8eb2 100644 --- a/site/core/api/actions/getTransaction.md +++ b/site/core/api/actions/getTransaction.md @@ -158,7 +158,7 @@ const transaction = getTransaction(config, { import { type GetTransactionReturnType } from '@wagmi/core' ``` -[`Transaction`](https://viem.sh/docs/glossary/types.html#transaction) +[`Transaction`](https://viem.sh/docs/glossary/types#transaction) ## Error @@ -170,4 +170,4 @@ import { type GetTransactionErrorType } from '@wagmi/core' ## Viem -- [`getTransaction`](https://viem.sh/docs/actions/public/getTransaction.html) +- [`getTransaction`](https://viem.sh/docs/actions/public/getTransaction) diff --git a/site/core/api/actions/getTransactionConfirmations.md b/site/core/api/actions/getTransactionConfirmations.md index eb42df19ac..8263e32380 100644 --- a/site/core/api/actions/getTransactionConfirmations.md +++ b/site/core/api/actions/getTransactionConfirmations.md @@ -114,4 +114,4 @@ import { type GetTransactionConfirmationsErrorType } from '@wagmi/core' ## Viem -- [`getTransactionConfirmations`](https://viem.sh/docs/actions/public/getTransactionConfirmations.html) +- [`getTransactionConfirmations`](https://viem.sh/docs/actions/public/getTransactionConfirmations) diff --git a/site/core/api/actions/getTransactionCount.md b/site/core/api/actions/getTransactionCount.md index d08987c84d..6313abd07e 100644 --- a/site/core/api/actions/getTransactionCount.md +++ b/site/core/api/actions/getTransactionCount.md @@ -136,4 +136,4 @@ import { type GetTransactionCountErrorType } from '@wagmi/core' ## Viem -- [`getTransactionCount`](https://viem.sh/docs/actions/public/getTransactionCount.html) +- [`getTransactionCount`](https://viem.sh/docs/actions/public/getTransactionCount) diff --git a/site/core/api/actions/getTransactionReceipt.md b/site/core/api/actions/getTransactionReceipt.md index d0687ac63e..e349555c3e 100644 --- a/site/core/api/actions/getTransactionReceipt.md +++ b/site/core/api/actions/getTransactionReceipt.md @@ -6,7 +6,7 @@ const typeName = 'getTransactionReceipt' # getTransactionReceipt -Action for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. +Action for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. ## Import @@ -78,7 +78,7 @@ await getTransactionReceipt(config, { import { type GetTransactionReceiptReturnType } from '@wagmi/core' ``` -[`TransactionReceipt`](https://viem.sh/docs/glossary/types.html#transactionreceipt) +[`TransactionReceipt`](https://viem.sh/docs/glossary/types#transactionreceipt) The transaction receipt. @@ -92,4 +92,4 @@ import { type GetTransactionReceiptErrorType } from '@wagmi/core' ## Viem -- [`getTransactionReceipt`](https://viem.sh/docs/actions/public/getTransactionReceipt.html) +- [`getTransactionReceipt`](https://viem.sh/docs/actions/public/getTransactionReceipt) diff --git a/site/core/api/actions/getWalletClient.md b/site/core/api/actions/getWalletClient.md index a321b3637c..9eecc8a0e2 100644 --- a/site/core/api/actions/getWalletClient.md +++ b/site/core/api/actions/getWalletClient.md @@ -6,7 +6,7 @@ const typeName = 'GetWalletClient' # getWalletClient -Action for getting a Viem [`WalletClient`](https://viem.sh/docs/clients/wallet.html) object for the current or provided connector. +Action for getting a Viem [`WalletClient`](https://viem.sh/docs/clients/wallet) object for the current or provided connector. ## Import @@ -27,7 +27,7 @@ const client = getWalletClient(config) ::: ::: warning -If you want to optimize bundle size, you should use [`getConnectorClient`](/core/api/actions/getConnectorClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom.html#tree-shaking) instead. Since Wallet Client has all wallet actions attached directly to it. +If you want to optimize bundle size, you should use [`getConnectorClient`](/core/api/actions/getConnectorClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom#tree-shaking) instead. Since Wallet Client has all wallet actions attached directly to it. ::: ## Parameters @@ -101,7 +101,7 @@ import { type GetChainIdReturnType } from '@wagmi/core' `WalletClient` -Viem [`WalletClient`](https://viem.sh/docs/clients/wallet.html) object for the current or provided connector. +Viem [`WalletClient`](https://viem.sh/docs/clients/wallet) object for the current or provided connector. ## Error diff --git a/site/core/api/actions/multicall.md b/site/core/api/actions/multicall.md index ec46368d17..6d8a6baa08 100644 --- a/site/core/api/actions/multicall.md +++ b/site/core/api/actions/multicall.md @@ -352,4 +352,4 @@ import { type MulticallErrorType } from '@wagmi/core' ## Viem -- [`multicall`](https://viem.sh/docs/actions/public/multicall.html) +- [`multicall`](https://viem.sh/docs/contract/multicall) diff --git a/site/core/api/actions/prepareTransactionRequest.md b/site/core/api/actions/prepareTransactionRequest.md index 1a1f1fc207..c2fb8c5cf9 100644 --- a/site/core/api/actions/prepareTransactionRequest.md +++ b/site/core/api/actions/prepareTransactionRequest.md @@ -154,7 +154,7 @@ await prepareTransactionRequest(config, { `bigint | undefined` -The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -176,7 +176,7 @@ await prepareTransactionRequest(config, { `bigint | undefined` -Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -198,7 +198,7 @@ await prepareTransactionRequest(config, { `bigint | undefined` -Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -290,7 +290,7 @@ await prepareTransactionRequest(config, { import { type PrepareTransactionRequestReturnType } from '@wagmi/core' ``` -[`TransactionRequest`](https://viem.sh/docs/glossary/types.html#transactionrequest) +[`TransactionRequest`](https://viem.sh/docs/glossary/types#transactionrequest) The transaction request. @@ -304,4 +304,4 @@ import { type PrepareTransactionRequestErrorType } from '@wagmi/core' ## Viem -- [`prepareTransactionRequest`](https://viem.sh/docs/actions/wallet/prepareTransactionRequest.html) +- [`prepareTransactionRequest`](https://viem.sh/docs/actions/wallet/prepareTransactionRequest) diff --git a/site/core/api/actions/readContract.md b/site/core/api/actions/readContract.md index 80dfbb0b2e..c475869dc8 100644 --- a/site/core/api/actions/readContract.md +++ b/site/core/api/actions/readContract.md @@ -255,4 +255,4 @@ import { type ReadContractErrorType } from '@wagmi/core' ## Viem -- [`readContract`](https://viem.sh/docs/contract/readContract.html) +- [`readContract`](https://viem.sh/docs/contract/readContract) diff --git a/site/core/api/actions/readContracts.md b/site/core/api/actions/readContracts.md index 67cbdf65af..d41f8e9863 100644 --- a/site/core/api/actions/readContracts.md +++ b/site/core/api/actions/readContracts.md @@ -359,5 +359,5 @@ import { type ReadContractsErrorType } from '@wagmi/core' ## Viem -- [`multicall`](https://viem.sh/docs/actions/public/multicall.html) when supported by current chain. -- [`readContract`](https://viem.sh/docs/contract/readContract.html) when multicall is not supported. +- [`multicall`](https://viem.sh/docs/contract/multicall) when supported by current chain. +- [`readContract`](https://viem.sh/docs/contract/readContract) when multicall is not supported. diff --git a/site/core/api/actions/sendCalls.md b/site/core/api/actions/sendCalls.md index 6707802f20..e1f8530ce9 100644 --- a/site/core/api/actions/sendCalls.md +++ b/site/core/api/actions/sendCalls.md @@ -1,5 +1,5 @@ @@ -10,14 +10,12 @@ Action that requests for the wallet to sign and broadcast a batch of calls (tran [Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls) -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: + ## Import ```ts -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' ``` ## Usage @@ -25,7 +23,7 @@ import { sendCalls } from '@wagmi/core/experimental' ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -47,7 +45,7 @@ const id = await sendCalls(config, { ## Parameters ```ts -import { type SendCallsParameters } from '@wagmi/core/experimental' +import { type SendCallsParameters } from '@wagmi/core' ``` ### account @@ -61,7 +59,7 @@ If set to `null`, it is assumed that the wallet will handle filling the sender o ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -90,7 +88,7 @@ Calls to execute. ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -118,7 +116,7 @@ Capability metadata for the calls (e.g. specifying a paymaster). ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -151,7 +149,7 @@ The target chain ID to broadcast the calls. ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -181,7 +179,7 @@ Connector to get send the calls with. ```ts [index.ts] import { parseEther } from 'viem' import { getConnections } from '@wagmi/core' -import { sendCalls } from '@wagmi/core/experimental' +import { sendCalls } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) @@ -205,21 +203,21 @@ const id = await sendCalls(config, { ## Return Type ```ts -import { type SendCallsReturnType } from '@wagmi/core/experimental' +import { type SendCallsReturnType } from '@wagmi/core' ``` -`bigint` +`{ id: string; capabilities?: WalletCapabilities | undefined }` -Most recent block number seen. +Identifier of the call batch. ## Error ```ts -import { type SendCallsErrorType } from '@wagmi/core/experimental' +import { type SendCallsErrorType } from '@wagmi/core' ``` ## Viem -- [`sendCalls`](https://viem.sh/experimental/eip5792/sendCalls) +- [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls) diff --git a/site/core/api/actions/sendCallsSync.md b/site/core/api/actions/sendCallsSync.md new file mode 100644 index 0000000000..03fa0dd587 --- /dev/null +++ b/site/core/api/actions/sendCallsSync.md @@ -0,0 +1,221 @@ + + +# sendCallsSync + +Action that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network synchronously. + +Waits for the calls to be included in a block before returning. + +## Import + +```ts +import { sendCallsSync } from '@wagmi/core' +``` + +## Usage + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const status = await sendCallsSync(config, { + calls: [ + { + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', + value: parseEther('1') + }, + { + data: '0xdeadbeef', + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + }, + ] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type SendCallsSyncParameters } from '@wagmi/core' +``` + +### account + +`Account | Address | null | undefined` + +Account to execute the calls. + +If set to `null`, it is assumed that the wallet will handle filling the sender of the calls. + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const status = await sendCallsSync(config, { + account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266', // [!code focus] + calls: [ + { + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', + value: parseEther('1') + }, + { + data: '0xdeadbeef', + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + }, + ], +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### calls + +`{ to: Hex, data?: Hex, value?: bigint }[]` + +Calls to execute. + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const status = await sendCallsSync(config, { + calls: [ // [!code focus] + { // [!code focus] + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', // [!code focus] + value: parseEther('1') // [!code focus] + }, // [!code focus] + { // [!code focus] + data: '0xdeadbeef', // [!code focus] + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', // [!code focus] + }, // [!code focus] + ], // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### capabilities + +`WalletCapabilities | undefined` + +Capability metadata for the calls (e.g. specifying a paymaster). + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const status = await sendCallsSync(config, { + calls: [ + { + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', + value: parseEther('1') + }, + { + data: '0xdeadbeef', + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + }, + ], + capabilities: { // [!code focus] + paymasterService: { // [!code focus] + url: 'https://...' // [!code focus] + } // [!code focus] + } // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### chainId + +`number | undefined` + +The target chain ID to broadcast the calls. + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const status = await sendCallsSync(config, { + calls: [ + { + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', + value: parseEther('1') + }, + { + data: '0xdeadbeef', + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + }, + ], + chainId: 10, // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### connector + +`Connector | undefined` + +Connector to get send the calls with. + +::: code-group +```ts [index.ts] +import { parseEther } from 'viem' +import { getConnections } from '@wagmi/core' +import { sendCallsSync } from '@wagmi/core' +import { config } from './config' + +const connections = getConnections(config) +const status = await sendCallsSync(config, { + calls: [ + { + to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', + value: parseEther('1') + }, + { + data: '0xdeadbeef', + to: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', + }, + ], + connector: connections[0]?.connector, // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Return Type + +```ts +import { type SendCallsSyncReturnType } from '@wagmi/core' +``` + +`{ id: string; capabilities?: WalletCapabilities | undefined }` + +Identifier of the call batch. + +## Error + +```ts +import { type SendCallsSyncErrorType } from '@wagmi/core' +``` + + + +## Viem + +- [`sendCallsSync`](https://viem.sh/docs/actions/wallet/sendCallsSync) diff --git a/site/core/api/actions/sendTransaction.md b/site/core/api/actions/sendTransaction.md index e02e1908dc..5bb67ef701 100644 --- a/site/core/api/actions/sendTransaction.md +++ b/site/core/api/actions/sendTransaction.md @@ -174,7 +174,7 @@ const result = await sendTransaction(config, { `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -195,7 +195,7 @@ const result = await sendTransaction(config, { `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -216,7 +216,7 @@ const result = await sendTransaction(config, { `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -324,7 +324,7 @@ const result = await sendTransaction(config, { import { type SendTransactionReturnType } from '@wagmi/core' ``` -[`Hash`](https://viem.sh/docs/glossary/types.html#hash) +[`Hash`](https://viem.sh/docs/glossary/types#hash) Transaction hash. @@ -338,4 +338,4 @@ import { type SendTransactionErrorType } from '@wagmi/core' ## Viem -- [`sendTransaction`](https://viem.sh/docs/actions/wallet/sendTransaction.html) +- [`sendTransaction`](https://viem.sh/docs/actions/wallet/sendTransaction) diff --git a/site/core/api/actions/sendTransactionSync.md b/site/core/api/actions/sendTransactionSync.md new file mode 100644 index 0000000000..046e50629e --- /dev/null +++ b/site/core/api/actions/sendTransactionSync.md @@ -0,0 +1,342 @@ + + +# sendTransactionSync + +Action for creating, signing, and sending transactions to the network synchronously. +Waits for the transaction to be included in a block before returning. + +## Import + +```ts +import { sendTransactionSync } from '@wagmi/core' +``` + +## Usage + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type SendTransactionSyncParameters } from '@wagmi/core' +``` + +### accessList + +`AccessList | undefined` + +The access list. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + accessList: [{ // [!code focus] + address: '0x1', // [!code focus] + storageKeys: ['0x1'], // [!code focus] + }], // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### account + +`Address | Account | undefined` + +Account to use when sending transaction. Throws if account is not found on [`connector`](#connector). + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e', // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### chainId + +`config['chains'][number]['id'] | undefined` + +Chain ID to validate against before sending transaction. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { mainnet } from '@wagmi/core/chains' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + chainId: mainnet.id, // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### connector + +`Connector | undefined` + +- Connector to send transaction with. +- Defaults to current connector. + +::: code-group +```ts [index.ts] +import { getConnections, sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const connections = getConnections(config) +const result = await sendTransactionSync(config, { + connector: connections[0]?.connector, // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### data + +`` `0x${string}` | undefined `` + +A contract hashed method call with encoded args. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2', // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### gas + +`bigint | undefined | null` + +Gas provided for transaction execution. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther, parseGwei } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + gas: parseGwei('20'), // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +--- + +### gasPrice + +`bigint | undefined` + +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther, parseGwei } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + gasPrice: parseGwei('20'), // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### maxFeePerGas + +`bigint | undefined` + +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther, parseGwei } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + maxFeePerGas: parseGwei('20'), // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### maxPriorityFeePerGas + +`bigint | undefined` + +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther, parseGwei } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + maxFeePerGas: parseGwei('20'), + maxPriorityFeePerGas: parseGwei('2'), // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +--- + +### nonce + +`number` + +Unique number identifying this transaction. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + nonce: 123, // [!code focus] + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### to + +`Address` + +The transaction recipient or contract address. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus] + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### type + +`'legacy' | 'eip1559' | 'eip2930' | undefined` + +Optional transaction request type to narrow parameters. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + type: 'eip1559', // [!code focus] + value: parseEther('0.01'), +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +### value + +`bigint | undefined` + +Value in wei sent with this transaction. + +::: code-group +```ts [index.ts] +import { sendTransactionSync } from '@wagmi/core' +import { parseEther } from 'viem' +import { config } from './config' + +const result = await sendTransactionSync(config, { + to: '0xd2135CfB216b74109775236E36d4b433F1DF507B', + value: parseEther('0.01'), // [!code focus] +}) +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Return Type + +```ts +import { type SendTransactionSyncReturnType } from '@wagmi/core' +``` + +[`TransactionReceipt`](https://viem.sh/docs/glossary/types#transaction-receipt) + +Transaction receipt. + +## Error + +```ts +import { type SendTransactionSyncErrorType } from '@wagmi/core' +``` + + + +## Viem + +- [`sendTransactionSync`](https://viem.sh/docs/actions/wallet/sendTransactionSync) diff --git a/site/core/api/actions/showCallsStatus.md b/site/core/api/actions/showCallsStatus.md index dba02841ff..fdba382c63 100644 --- a/site/core/api/actions/showCallsStatus.md +++ b/site/core/api/actions/showCallsStatus.md @@ -1,30 +1,28 @@ # showCallsStatus -Action to request for the wallet to show information about a call batch that was sent via `showCalls`. +Action to request for the wallet to show information about a call batch that was sent via `sendCalls`. [Read more.](https://github.com/ethereum/EIPs/blob/1663ea2e7a683285f977eda51c32cec86553f585/EIPS/eip-5792.md#wallet_showcallsstatus) -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: + ## Import ```ts -import { showCallsStatus } from '@wagmi/core/experimental' +import { showCallsStatus } from '@wagmi/core' ``` ## Usage ::: code-group ```ts [index.ts] -import { showCallsStatus } from '@wagmi/core/experimental' +import { showCallsStatus } from '@wagmi/core' import { config } from './config' await showCallsStatus(config, { @@ -37,7 +35,7 @@ await showCallsStatus(config, { ## Parameters ```ts -import { type ShowCallsStatusParameters } from '@wagmi/core/experimental' +import { type ShowCallsStatusParameters } from '@wagmi/core' ``` ### connector @@ -48,7 +46,7 @@ Connector to show call statuses with. ::: code-group ```ts [index.ts] -import { getConnections, showCallsStatus } from '@wagmi/core/experimental' +import { getConnections, showCallsStatus } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) @@ -68,7 +66,7 @@ Identifier of the call batch. ::: code-group ```ts [index.ts] -import { showCallsStatus } from '@wagmi/core/experimental' +import { showCallsStatus } from '@wagmi/core' import { config } from './config' await showCallsStatus(config, { @@ -81,7 +79,7 @@ await showCallsStatus(config, { ## Return Type ```ts -import { type ShowCallsStatusReturnType } from '@wagmi/core/experimental' +import { type ShowCallsStatusReturnType } from '@wagmi/core' ``` `bigint` @@ -91,11 +89,11 @@ Most recent block number seen. ## Error ```ts -import { type ShowCallsStatusErrorType } from '@wagmi/core/experimental' +import { type ShowCallsStatusErrorType } from '@wagmi/core' ``` ## Viem -- [`showCallsStatus`](https://viem.sh/experimental/eip5792/showCallsStatus) +- [`showCallsStatus`](https://viem.sh/docs/actions/wallet/showCallsStatus) diff --git a/site/core/api/actions/signMessage.md b/site/core/api/actions/signMessage.md index 23569146ac..788d0347e6 100644 --- a/site/core/api/actions/signMessage.md +++ b/site/core/api/actions/signMessage.md @@ -59,10 +59,10 @@ const result = await signMessage(config, { ::: code-group ```ts [index.ts] -import { getAccount, signMessage } from '@wagmi/core' +import { getConnection, signMessage } from '@wagmi/core' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await signMessage(config, { connector, // [!code focus] message: 'hello world', @@ -108,7 +108,7 @@ const result = await signMessage(config, { import { type SignMessageReturnType } from '@wagmi/core' ``` -[`Hex`](https://viem.sh/docs/glossary/types.html#hex) +[`Hex`](https://viem.sh/docs/glossary/types#hex) The signed message. @@ -122,4 +122,4 @@ import { type SignMessageErrorType } from '@wagmi/core' ## Viem -- [`signMessage`](https://viem.sh/docs/actions/wallet/signMessage.html) +- [`signMessage`](https://viem.sh/docs/actions/wallet/signMessage) diff --git a/site/core/api/actions/signTypedData.md b/site/core/api/actions/signTypedData.md index 757c87160f..41b8f9829f 100644 --- a/site/core/api/actions/signTypedData.md +++ b/site/core/api/actions/signTypedData.md @@ -97,11 +97,11 @@ const result = await signTypedData(config, { ::: code-group ```ts [index.ts] -import { getAccount, signTypedData } from '@wagmi/core' +import { getConnection, signTypedData } from '@wagmi/core' import { config } from './config' import { types } from './typedData' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await signTypedData(config, { connector, // [!code focus] types, @@ -275,7 +275,7 @@ const result = await signTypedData(config, { import { type SignTypedDataReturnType } from '@wagmi/core' ``` -[`Hex`](https://viem.sh/docs/glossary/types.html#hex) +[`Hex`](https://viem.sh/docs/glossary/types#hex) The signed data. @@ -285,6 +285,7 @@ With [`types`](#types) setup correctly, TypeScript will infer the correct types ::: code-group ```ts twoslash [Inline] +// @twoslash-cache: {"v":1,"hash":"44d90fe296d503e3675e18b904994e8969cc43a5fc5d95c28c6ca88739b0e3f3","data":"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"} import { createConfig, http, signTypedData } from '@wagmi/core' import { mainnet, sepolia } from '@wagmi/core/chains' @@ -339,6 +340,7 @@ const result = await signTypedData(config, { }) ``` ```ts twoslash [Const-Asserted] +// @twoslash-cache: {"v":1,"hash":"3253afdbde057c102c6b708011549c2795dd31d2584982f81ae20a403b5bdb54","data":"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"} import { createConfig, http, signTypedData } from '@wagmi/core' import { mainnet, sepolia } from '@wagmi/core/chains' @@ -406,4 +408,4 @@ import { type SignTypedDataErrorType } from '@wagmi/core' ## Viem -- [`signTypedData`](https://viem.sh/docs/actions/wallet/signTypedData.html) +- [`signTypedData`](https://viem.sh/docs/actions/wallet/signTypedData) diff --git a/site/core/api/actions/simulateContract.md b/site/core/api/actions/simulateContract.md index b7884ef713..02eb1b9c17 100644 --- a/site/core/api/actions/simulateContract.md +++ b/site/core/api/actions/simulateContract.md @@ -282,11 +282,11 @@ const result = await simulateContract(config, { ::: code-group ```ts [index.ts] -import { getAccount, simulateContract } from '@wagmi/core' +import { getConnection, simulateContract } from '@wagmi/core' import { abi } from './abi' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await simulateContract(config, { abi, address: '0x6b175474e89094c44da98b954eedeac495271d0f', @@ -391,7 +391,7 @@ const result = await simulateContract(config, { `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -420,7 +420,7 @@ const result = await simulateContract(config, { `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -449,7 +449,7 @@ const result = await simulateContract(config, { `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -595,4 +595,4 @@ import { type SimulateContractErrorType } from '@wagmi/core' ## Viem -- [`simulateContract`](https://viem.sh/docs/contract/simulateContract.html) +- [`simulateContract`](https://viem.sh/docs/contract/simulateContract) diff --git a/site/core/api/actions/switchChain.md b/site/core/api/actions/switchChain.md index c741e801c8..eb58e1dc30 100644 --- a/site/core/api/actions/switchChain.md +++ b/site/core/api/actions/switchChain.md @@ -86,14 +86,14 @@ const result = await switchChain(config, { ::: code-group ```ts [index.ts] -import { getConnections, switchAccount } from '@wagmi/core' +import { getConnection, switchChain } from '@wagmi/core' import { mainnet } from '@wagmi/core/chains' import { config } from './config' -const connections = getConnections(config) +const connection = getConnection(config) const result = await switchChain(config, { chainId: mainnet.id, - connector: connections[0]?.connector, // [!code focus] + connector: connection?.connector, // [!code focus] }) ``` <<< @/snippets/core/config.ts[config.ts] @@ -119,4 +119,4 @@ import { type SwitchChainErrorType } from '@wagmi/core' ## Viem -- [`switchChain`](https://viem.sh/docs/actions/wallet/switchChain.html) when connected. +- [`switchChain`](https://viem.sh/docs/actions/wallet/switchChain) when connected. diff --git a/site/core/api/actions/switchAccount.md b/site/core/api/actions/switchConnection.md similarity index 62% rename from site/core/api/actions/switchAccount.md rename to site/core/api/actions/switchConnection.md index 8d0f629c13..f3c1733814 100644 --- a/site/core/api/actions/switchAccount.md +++ b/site/core/api/actions/switchConnection.md @@ -1,28 +1,28 @@ -# switchAccount +# switchConnection Action for switching the current account. ## Import ```ts -import { switchAccount } from '@wagmi/core' +import { switchConnection } from '@wagmi/core' ``` ## Usage ::: code-group ```ts [index.ts] -import { getConnections, switchAccount } from '@wagmi/core' +import { getConnections, switchConnection } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) -const result = await switchAccount(config, { +const result = await switchConnection(config, { connector: connections[0]?.connector, }) ``` @@ -32,7 +32,7 @@ const result = await switchAccount(config, { ## Parameters ```ts -import { type SwitchAccountParameters } from '@wagmi/core' +import { type SwitchConnectionParameters } from '@wagmi/core' ``` ### connector @@ -43,11 +43,11 @@ import { type SwitchAccountParameters } from '@wagmi/core' ::: code-group ```ts [index.ts] -import { getConnections, switchAccount } from '@wagmi/core' +import { getConnections, switchConnection } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) -const result = await switchAccount(config, { +const result = await switchConnection(config, { connector: connections[0]?.connector, // [!code focus] }) ``` @@ -57,7 +57,7 @@ const result = await switchAccount(config, { ## Return Type ```ts -import { type SwitchAccountReturnType } from '@wagmi/core' +import { type SwitchConnectionReturnType } from '@wagmi/core' ``` ### accounts @@ -75,7 +75,7 @@ Connected chain ID from connector. ## Error ```ts -import { type SwitchAccountErrorType } from '@wagmi/core' +import { type SwitchConnectionErrorType } from '@wagmi/core' ``` diff --git a/site/core/api/actions/verifyMessage.md b/site/core/api/actions/verifyMessage.md index 93d46992b9..f6b3fd8179 100644 --- a/site/core/api/actions/verifyMessage.md +++ b/site/core/api/actions/verifyMessage.md @@ -66,7 +66,7 @@ By default, wagmi verifies the UTF-8 representation of the message. ::: code-group ```ts [index.ts] -import { getAccount, verifyMessage } from '@wagmi/core' +import { verifyMessage } from '@wagmi/core' import { config } from './config' await verifyMessage(config, { @@ -197,4 +197,4 @@ import { type VerifyMessageErrorType } from '@wagmi/core' ## Viem -- [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage.html) +- [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage) diff --git a/site/core/api/actions/verifyTypedData.md b/site/core/api/actions/verifyTypedData.md index e9afa17ad4..8ed8efc83b 100644 --- a/site/core/api/actions/verifyTypedData.md +++ b/site/core/api/actions/verifyTypedData.md @@ -592,4 +592,4 @@ import { type VerifyTypedDataErrorType } from '@wagmi/core' ## Viem -- [`verifyTypedData`](https://viem.sh/docs/actions/public/verifyTypedData.html) +- [`verifyTypedData`](https://viem.sh/docs/actions/public/verifyTypedData) diff --git a/site/core/api/actions/waitForCallsStatus.md b/site/core/api/actions/waitForCallsStatus.md index a6739d3a4b..74a4affee4 100644 --- a/site/core/api/actions/waitForCallsStatus.md +++ b/site/core/api/actions/waitForCallsStatus.md @@ -1,5 +1,5 @@ @@ -8,14 +8,12 @@ const typeName = 'WaitForCallsStatus' Waits for a call bundle to be confirmed & included on a block before returning the status & receipts. -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: + ## Import ```ts -import { waitForCallsStatus } from '@wagmi/core/experimental' +import { waitForCallsStatus } from '@wagmi/core' ``` ## Usage @@ -23,7 +21,7 @@ import { waitForCallsStatus } from '@wagmi/core/experimental' ::: code-group ```ts [index.ts] import { parseEther } from 'viem' -import { sendCalls, waitForCallsStatus } from '@wagmi/core/experimental' +import { sendCalls, waitForCallsStatus } from '@wagmi/core' import { config } from './config' const id = await sendCalls(config, { @@ -43,7 +41,7 @@ const { status, receipts } = await waitForCallsStatus(config, { // [!code focus] ## Parameters ```ts -import { type WaitForCallsStatusParameters } from '@wagmi/core/experimental' +import { type WaitForCallsStatusParameters } from '@wagmi/core' ``` ### connector @@ -54,7 +52,7 @@ Connector to get call statuses with. ::: code-group ```ts [index.ts] -import { getConnections, waitForCallsStatus } from '@wagmi/core/experimental' +import { getConnections, waitForCallsStatus } from '@wagmi/core' import { config } from './config' const connections = getConnections(config) @@ -74,7 +72,7 @@ Identifier of the call batch. ::: code-group ```ts [index.ts] -import { waitForCallsStatus } from '@wagmi/core/experimental' +import { waitForCallsStatus } from '@wagmi/core' import { config } from './config' const status = await waitForCallsStatus(config, { @@ -92,7 +90,7 @@ Polling interval in milliseconds. ::: code-group ```ts [index.ts] -import { waitForCallsStatus } from '@wagmi/core/experimental' +import { waitForCallsStatus } from '@wagmi/core' import { config } from './config' const status = await waitForCallsStatus(config, { @@ -111,7 +109,7 @@ Timeout in milliseconds before `waitForCallsStatus` stops polling. ::: code-group ```ts [index.ts] -import { waitForCallsStatus } from '@wagmi/core/experimental' +import { waitForCallsStatus } from '@wagmi/core' import { config } from './config' const status = await waitForCallsStatus(config, { @@ -125,7 +123,7 @@ const status = await waitForCallsStatus(config, { ## Return Type ```ts -import { type WaitForCallsStatusReturnType } from '@wagmi/core/experimental' +import { type WaitForCallsStatusReturnType } from '@wagmi/core' ``` `{ status: 'PENDING' | 'CONFIRMED', receipts: TransactionReceipt[] }` @@ -135,11 +133,11 @@ The status and receipts of the call batch. ## Error ```ts -import { type WaitForCallsStatusErrorType } from '@wagmi/core/experimental' +import { type WaitForCallsStatusErrorType } from '@wagmi/core' ``` ## Viem -- [`waitForCallsStatus`](https://viem.sh/experimental/eip5792/waitForCallsStatus) +- [`waitForCallsStatus`](https://viem.sh/docs/actions/wallet/waitForCallsStatus) diff --git a/site/core/api/actions/waitForTransactionReceipt.md b/site/core/api/actions/waitForTransactionReceipt.md index 853189055d..313724e161 100644 --- a/site/core/api/actions/waitForTransactionReceipt.md +++ b/site/core/api/actions/waitForTransactionReceipt.md @@ -138,7 +138,7 @@ const transactionReceipt = await waitForTransactionReceipt(config, { import { type WaitForTransactionReceiptReturnType } from '@wagmi/core' ``` -[`TransactionReceipt`](https://viem.sh/docs/glossary/types.html#transactionreceipt) +[`TransactionReceipt`](https://viem.sh/docs/glossary/types#transactionreceipt) The transaction receipt. @@ -152,4 +152,4 @@ import { type WaitForTransactionReceiptErrorType } from '@wagmi/core' ## Viem -- [`waitForTransactionReceipt`](https://viem.sh/docs/actions/public/waitForTransactionReceipt.html) +- [`waitForTransactionReceipt`](https://viem.sh/docs/actions/public/waitForTransactionReceipt) diff --git a/site/core/api/actions/watchAccount.md b/site/core/api/actions/watchAccount.md deleted file mode 100644 index a71ca4d161..0000000000 --- a/site/core/api/actions/watchAccount.md +++ /dev/null @@ -1,61 +0,0 @@ -# watchAccount - -Subscribe to account changes. - -## Import - -```ts -import { watchAccount } from '@wagmi/core' -``` - -## Usage - -::: code-group -```ts [index.ts] -import { watchAccount } from '@wagmi/core' -import { config } from './config' - -const unwatch = watchAccount(config, { - onChange(data) { - console.log('Account changed!', data) - }, -}) -unwatch() -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -## Parameters - -```ts -import { type WatchAccountParameters } from '@wagmi/core' -``` - -### onChange - -`onChange(account: GetAccountReturnType, prevAccount: GetAccountReturnType): void` - -Callback function called when account changes. - -::: code-group -```ts [index.ts] -import { watchAccount } from '@wagmi/core' -import { config } from './config' - -const unwatch = watchAccount(config, { - onChange(account) { // [!code focus:3] - console.log('Account changed!', account) - }, -}) -unwatch() -``` -<<< @/snippets/core/config.ts[config.ts] -::: - -## Return Type - -```ts -import { type WatchAccountReturnType } from '@wagmi/core' -``` - -Function for cleaning up watcher. \ No newline at end of file diff --git a/site/core/api/actions/watchAsset.md b/site/core/api/actions/watchAsset.md index 394dadd7ae..483f5354a3 100644 --- a/site/core/api/actions/watchAsset.md +++ b/site/core/api/actions/watchAsset.md @@ -47,10 +47,10 @@ import { type WatchAssetParameters } from '@wagmi/core' ::: code-group ```ts [index.ts] -import { getAccount, watchAsset } from '@wagmi/core' +import { getConnection, watchAsset } from '@wagmi/core' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await watchAsset(config, { connector, // [!code focus] options: { @@ -130,5 +130,5 @@ import { type WatchAssetErrorType } from '@wagmi/core' ## Viem -- [`watchAsset`](https://viem.sh/docs/actions/wallet/watchAsset.html) +- [`watchAsset`](https://viem.sh/docs/actions/wallet/watchAsset) diff --git a/site/core/api/actions/watchBlockNumber.md b/site/core/api/actions/watchBlockNumber.md index 098fd6613e..c7e5d3dbb9 100644 --- a/site/core/api/actions/watchBlockNumber.md +++ b/site/core/api/actions/watchBlockNumber.md @@ -223,4 +223,4 @@ Function for cleaning up watcher. ## Viem -- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber.html) +- [`watchBlockNumber`](https://viem.sh/docs/actions/public/watchBlockNumber) diff --git a/site/core/api/actions/watchBlocks.md b/site/core/api/actions/watchBlocks.md index 892ef0005f..52eb107888 100644 --- a/site/core/api/actions/watchBlocks.md +++ b/site/core/api/actions/watchBlocks.md @@ -246,4 +246,4 @@ Function for cleaning up watcher. ## Viem -- [`watchBlocks`](https://viem.sh/docs/actions/public/watchBlocks.html) +- [`watchBlocks`](https://viem.sh/docs/actions/public/watchBlocks) diff --git a/site/core/api/actions/watchConnection.md b/site/core/api/actions/watchConnection.md new file mode 100644 index 0000000000..abb4db097e --- /dev/null +++ b/site/core/api/actions/watchConnection.md @@ -0,0 +1,61 @@ +# watchConnection + +Subscribe to connection changes. + +## Import + +```ts +import { watchConnection } from '@wagmi/core' +``` + +## Usage + +::: code-group +```ts [index.ts] +import { watchConnection } from '@wagmi/core' +import { config } from './config' + +const unwatch = watchConnection(config, { + onChange(data) { + console.log('Connection changed!', data) + }, +}) +unwatch() +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type WatchConnectionParameters } from '@wagmi/core' +``` + +### onChange + +`onChange(connection: GetConnectionReturnType, prevConnection: GetConnectionReturnType): void` + +Callback function called when connection changes. + +::: code-group +```ts [index.ts] +import { watchConnection } from '@wagmi/core' +import { config } from './config' + +const unwatch = watchConnection(config, { + onChange(connection) { // [!code focus:3] + console.log('Connection changed!', connection) + }, +}) +unwatch() +``` +<<< @/snippets/core/config.ts[config.ts] +::: + +## Return Type + +```ts +import { type WatchConnectionReturnType } from '@wagmi/core' +``` + +Function for cleaning up watcher. diff --git a/site/core/api/actions/watchContractEvent.md b/site/core/api/actions/watchContractEvent.md index 91498f1784..f819cd280d 100644 --- a/site/core/api/actions/watchContractEvent.md +++ b/site/core/api/actions/watchContractEvent.md @@ -373,4 +373,4 @@ import { type WatchContractEventError } from '@wagmi/core' ## Viem -- [`watchContractEvent`](https://viem.sh/docs/contract/watchContractEvent.html) +- [`watchContractEvent`](https://viem.sh/docs/contract/watchContractEvent) diff --git a/site/core/api/actions/watchPendingTransactions.md b/site/core/api/actions/watchPendingTransactions.md index fe0e5c3885..6e332c9f6b 100644 --- a/site/core/api/actions/watchPendingTransactions.md +++ b/site/core/api/actions/watchPendingTransactions.md @@ -204,4 +204,4 @@ import { type WatchPendingTransactionsError } from '@wagmi/core' ## Viem -- [`watchPendingTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions.html) +- [`watchPendingTransactions`](https://viem.sh/docs/actions/public/watchPendingTransactions) diff --git a/site/core/api/actions/writeContract.md b/site/core/api/actions/writeContract.md index 34000d9d32..950466eb6a 100644 --- a/site/core/api/actions/writeContract.md +++ b/site/core/api/actions/writeContract.md @@ -252,11 +252,11 @@ const result = await writeContract(config, { ::: code-group ```ts [index.ts] -import { getAccount, writeContract } from '@wagmi/core' +import { getConnection, writeContract } from '@wagmi/core' import { abi } from './abi' import { config } from './config' -const { connector } = getAccount(config) +const { connector } = getConnection(config) const result = await writeContract(config, { abi, address: '0x6b175474e89094c44da98b954eedeac495271d0f', @@ -362,7 +362,7 @@ const result = await writeContract(config, { `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -391,7 +391,7 @@ const result = await writeContract(config, { `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -420,7 +420,7 @@ const result = await writeContract(config, { `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -539,7 +539,7 @@ const result = await writeContract(config, { import { type WriteContractReturnType } from '@wagmi/core' ``` -[`Hash`](https://viem.sh/docs/glossary/types.html#hash) +[`Hash`](https://viem.sh/docs/glossary/types#hash) The transaction hash. @@ -557,4 +557,4 @@ import { type WriteContractErrorType } from '@wagmi/core' ## Viem -- [`writeContract`](https://viem.sh/docs/contract/writeContract.html) +- [`writeContract`](https://viem.sh/docs/contract/writeContract) diff --git a/site/core/api/actions/writeContracts.md b/site/core/api/actions/writeContracts.md index c782330707..b06568fba5 100644 --- a/site/core/api/actions/writeContracts.md +++ b/site/core/api/actions/writeContracts.md @@ -10,9 +10,7 @@ Action that requests for the wallet to sign and broadcast a batch of write contr [Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcalls) -::: warning -This is an experimental action that is not supported in most wallets. It is recommended to have a fallback mechanism if using this in production. -::: + ## Import @@ -302,9 +300,9 @@ const id = await writeContracts(config, { import { type WriteContractsReturnType } from '@wagmi/core/experimental' ``` -`bigint` +`{ id: string; capabilities?: WalletCapabilities | undefined }` -Most recent block number seen. +Identifier of the call batch. ## Error diff --git a/site/core/api/connectors.md b/site/core/api/connectors.md index d68718b25b..8dc5912565 100644 --- a/site/core/api/connectors.md +++ b/site/core/api/connectors.md @@ -13,13 +13,17 @@ Connectors for popular wallet providers and protocols. ## Import +Available via the `'@wagmi/connectors'` package. + ```ts -import { injected } from 'wagmi/connectors' +import { injected } from '@wagmi/connectors' ``` ## Built-In Connectors -Available via the `'wagmi/connectors'` entrypoint. +::: tip +Some connectors require third-party packages. See the "Install" section on each connector's page for more info on license, version, and more. +:::
  • diff --git a/site/core/api/connectors/baseAccount.md b/site/core/api/connectors/baseAccount.md new file mode 100644 index 0000000000..ddc1ffcb3d --- /dev/null +++ b/site/core/api/connectors/baseAccount.md @@ -0,0 +1,14 @@ +--- +title: baseAccount +--- + + + + diff --git a/site/core/api/connectors/coinbaseWallet.md b/site/core/api/connectors/coinbaseWallet.md index d8968eac7d..7eeab9959d 100644 --- a/site/core/api/connectors/coinbaseWallet.md +++ b/site/core/api/connectors/coinbaseWallet.md @@ -1,6 +1,10 @@ - \ No newline at end of file + diff --git a/site/core/api/connectors/gemini.md b/site/core/api/connectors/gemini.md new file mode 100644 index 0000000000..a6ed4caddb --- /dev/null +++ b/site/core/api/connectors/gemini.md @@ -0,0 +1,15 @@ +--- +title: gemini +--- + + + + diff --git a/site/core/api/connectors/injected.md b/site/core/api/connectors/injected.md index 6e874baef3..14a97f735b 100644 --- a/site/core/api/connectors/injected.md +++ b/site/core/api/connectors/injected.md @@ -1,3 +1,7 @@ +--- +title: injected +--- + diff --git a/site/core/api/connectors/mock.md b/site/core/api/connectors/mock.md index d085d93cb4..990e1d7d11 100644 --- a/site/core/api/connectors/mock.md +++ b/site/core/api/connectors/mock.md @@ -1,3 +1,7 @@ +--- +title: mock +--- + + + diff --git a/site/core/api/connectors/safe.md b/site/core/api/connectors/safe.md index cc800dcc90..651d2431c0 100644 --- a/site/core/api/connectors/safe.md +++ b/site/core/api/connectors/safe.md @@ -1,6 +1,17 @@ +--- +title: safe +--- + diff --git a/site/core/api/connectors/walletConnect.md b/site/core/api/connectors/walletConnect.md index ba65cbda96..c1d80874fc 100644 --- a/site/core/api/connectors/walletConnect.md +++ b/site/core/api/connectors/walletConnect.md @@ -1,6 +1,14 @@ +--- +title: walletConnect +--- + diff --git a/site/core/api/createConfig.md b/site/core/api/createConfig.md index 26df850162..8b738c68ae 100644 --- a/site/core/api/createConfig.md +++ b/site/core/api/createConfig.md @@ -1,3 +1,7 @@ +--- +title: createConfig +--- + diff --git a/site/core/api/transports/fallback.md b/site/core/api/transports/fallback.md index cefffa734e..a780366f1c 100644 --- a/site/core/api/transports/fallback.md +++ b/site/core/api/transports/fallback.md @@ -1,3 +1,7 @@ +--- +title: fallback +--- + diff --git a/site/core/api/transports/http.md b/site/core/api/transports/http.md index 7fed8c6d72..3681a254ba 100644 --- a/site/core/api/transports/http.md +++ b/site/core/api/transports/http.md @@ -1,3 +1,7 @@ +--- +title: http +--- + diff --git a/site/core/api/transports/unstable_connector.md b/site/core/api/transports/unstable_connector.md index 19a9b43575..c24e05d150 100644 --- a/site/core/api/transports/unstable_connector.md +++ b/site/core/api/transports/unstable_connector.md @@ -1,3 +1,7 @@ +--- +title: unstable_connector +--- + diff --git a/site/core/api/utilities/cookieToInitialState.md b/site/core/api/utilities/cookieToInitialState.md index c0470295c9..a67ffdce2b 100644 --- a/site/core/api/utilities/cookieToInitialState.md +++ b/site/core/api/utilities/cookieToInitialState.md @@ -1,3 +1,7 @@ +--- +title: cookieToInitialState +--- + diff --git a/site/core/api/utilities/deserialize.md b/site/core/api/utilities/deserialize.md index 4f051cdc53..d3e0c5a8ad 100644 --- a/site/core/api/utilities/deserialize.md +++ b/site/core/api/utilities/deserialize.md @@ -1,3 +1,7 @@ +--- +title: deserialize +--- + diff --git a/site/core/api/utilities/normalizeChainId.md b/site/core/api/utilities/normalizeChainId.md deleted file mode 100644 index 9dd43935bb..0000000000 --- a/site/core/api/utilities/normalizeChainId.md +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/site/core/api/utilities/serialize.md b/site/core/api/utilities/serialize.md index 3672a67c17..bb8abd75bd 100644 --- a/site/core/api/utilities/serialize.md +++ b/site/core/api/utilities/serialize.md @@ -1,3 +1,7 @@ +--- +title: serialize +--- + diff --git a/site/core/getting-started.md b/site/core/getting-started.md index f5759957a5..8b4988b54b 100644 --- a/site/core/getting-started.md +++ b/site/core/getting-started.md @@ -52,10 +52,10 @@ Now that everything is set up, you can pass the `config` to use actions. ::: code-group ```tsx [index.ts] -import { getAccount, getEnsName } from '@wagmi/core' +import { getConnection, getEnsName } from '@wagmi/core' import { config } from './config' -const { address } = getAccount(config) +const { address } = getConnection(config) const ensName = await getEnsName(config, { address }) ``` <<< @/snippets/core/config.ts[config.ts] diff --git a/site/core/guides/framework-adapters.md b/site/core/guides/framework-adapters.md index 1e45ba63ec..7468e34b6a 100644 --- a/site/core/guides/framework-adapters.md +++ b/site/core/guides/framework-adapters.md @@ -16,7 +16,7 @@ Once you create a Wagmi Config, you'll need to make sure your framework has acce All frameworks approach reactivity in a different way. To hook into your favorite frameworks, reactivity system, it's often helpful to see what other popular libraries for your framework are doing. -The most important thing to hook up Wagmi Core with your framework is to make sure changes to the Wagmi Config are tracked. This enables behavior, like switching chains or connecting accounts, to propagate throughout your app and update state. Check out [`useAccount`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useAccount.ts), [`useChainId`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useChainId.ts), [`useClient`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useClient.ts), and [`useConnectorClient`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useConnectorClient.ts) — versions of these for your framework are important to get right as they power a lot of internals. +The most important thing to hook up Wagmi Core with your framework is to make sure changes to the Wagmi Config are tracked. This enables behavior, like switching chains or connecting accounts, to propagate throughout your app and update state. Check out [`useConnection`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useConnection.ts), [`useChainId`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useChainId.ts), [`useClient`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useClient.ts), and [`useConnectorClient`](https://github.com/wevm/wagmi/blob/main/packages/react/src/hooks/useConnectorClient.ts) — versions of these for your framework are important to get right as they power a lot of internals. ## TanStack Query diff --git a/site/core/guides/migrate-from-v1-to-v2.md b/site/core/guides/migrate-from-v1-to-v2.md index 6807ebafcd..93dc78905c 100644 --- a/site/core/guides/migrate-from-v1-to-v2.md +++ b/site/core/guides/migrate-from-v1-to-v2.md @@ -78,7 +78,7 @@ The previous global `config` singleton made it so you couldn't use multiple `Con ### Removed `getContract` -Removed `getContract` export. Use Viem's [`getContract`](https://viem.sh/docs/contract/getContract.html) instead. +Removed `getContract` export. Use Viem's [`getContract`](https://viem.sh/docs/contract/getContract) instead. ```ts import { getContract } from '@wagmi/core' // [!code --] @@ -94,57 +94,57 @@ The `getNetwork` and `watchNetwork` actions were removed since the connected cha - Use [`config.chains`](/core/api/createConfig#chains-1) instead to get `chains`. - ::: code-group - ```ts [index.ts] - import { getNetwork } from '@wagmi/core' // [!code --] +::: code-group +```ts [index.ts] +import { getNetwork } from '@wagmi/core' // [!code --] - const { chains } = getNetwork() // [!code --] - const chains = config.chains // [!code ++] - ``` - <<< @/snippets/core/config.ts[config.ts] - ::: +const { chains } = getNetwork() // [!code --] +const chains = config.chains // [!code ++] +``` +<<< @/snippets/core/config.ts[config.ts] +::: -- Use [`getAccount`](/core/api/actions/getAccount) and `config.chains` instead to get `chain`. +- Use [`getAccount`](/core/api/actions/getConnection) and `config.chains` instead to get `chain`. - ::: code-group - ```ts [index.ts] - import { getNetwork } from '@wagmi/core' // [!code --] - import { getAccount } from '@wagmi/core' // [!code ++] - import { config } from './config' // [!code ++] +::: code-group +```ts [index.ts] +import { getNetwork } from '@wagmi/core' // [!code --] +import { getAccount } from '@wagmi/core' // [!code ++] +import { config } from './config' // [!code ++] - const { chain } = getNetwork() // [!code --] - const { chainId } = getAccount(config) // [!code ++] - const chain = chains.find(chain => chain.id === chainId) // [!code ++] - ``` - <<< @/snippets/core/config.ts[config.ts] - ::: +const { chain } = getNetwork() // [!code --] +const { chainId } = getAccount(config) // [!code ++] +const chain = chains.find(chain => chain.id === chainId) // [!code ++] +``` +<<< @/snippets/core/config.ts[config.ts] +::: Before v2, `getNetwork().chain` could result in an invalid chain if the active connector's `chainId` was not configured in the list of `config.chains`. Using `getAccount` and `config.chains` is more work, but ensures that chain is either valid or not defined. You can also use `getAccount(config).chain` if you don't care about the chain being `undefined` when not configured. - Use `watchAccount` instead of `watchNetwork`. - ::: code-group - ```ts [index.ts] - import { watchNetwork } from '@wagmi/core' // [!code --] - import { watchAccount } from '@wagmi/core' // [!code ++] - import { config } from './config' // [!code ++] - - const unwatch = watchNetwork((data) => console.log('Changed!', data)) // [!code --] - const unwatch = watchAccount(config, { // [!code ++] - onChange(data) { // [!code ++] - const chains = config.chains // [!code ++] - const chain = chains.find(chain => chain.id === data.chainId) // [!code ++] - }, // [!code ++] - }) // [!code ++] - ``` - <<< @/snippets/core/config.ts[config.ts] - ::: +::: code-group +```ts [index.ts] +import { watchNetwork } from '@wagmi/core' // [!code --] +import { watchAccount } from '@wagmi/core' // [!code ++] +import { config } from './config' // [!code ++] + +const unwatch = watchNetwork((data) => console.log('Changed!', data)) // [!code --] +const unwatch = watchAccount(config, { // [!code ++] +onChange(data) { // [!code ++] + const chains = config.chains // [!code ++] + const chain = chains.find(chain => chain.id === data.chainId) // [!code ++] +}, // [!code ++] +}) // [!code ++] +``` +<<< @/snippets/core/config.ts[config.ts] +::: ### Removed `getWebSocketPublicClient` and `watchWebSocketPublicClient` -Viem [Transports](https://viem.sh/docs/clients/intro.html#transports) now determine the type of client that is returned. You can use [`getPublicClient`](/core/api/actions/getPublicClient) and [`watchPublicClient`](/core/api/actions/watchPublicClient) to retrieve Viem [`PublicClient`](https://viem.sh/docs/clients/public.html) instances. +Viem [Transports](https://viem.sh/docs/clients/intro#transports) now determine the type of client that is returned. You can use [`getPublicClient`](/core/api/actions/getPublicClient) and [`watchPublicClient`](/core/api/actions/watchPublicClient) to retrieve Viem [`PublicClient`](https://viem.sh/docs/clients/public) instances. -Alternatively, you can use [`getClient`](/core/api/actions/getClient) and [`watchClient`](/core/api/actions/watchClient) to retrieve plain Viem [`Client`](https://viem.sh/docs/clients/custom.html) instances. This is a better option for users that care about optimizing bundle size to be as small as possible. +Alternatively, you can use [`getClient`](/core/api/actions/getClient) and [`watchClient`](/core/api/actions/watchClient) to retrieve plain Viem [`Client`](https://viem.sh/docs/clients/custom) instances. This is a better option for users that care about optimizing bundle size to be as small as possible. ### Removed `watchReadContract`, `watchReadContracts`, and `watchReadMulticall` @@ -367,7 +367,7 @@ A number of errors were renamed to better reflect their functionality or replace ### Removed internal ENS normalization -Before v2, Wagmi handled ENS name normalization internally for `getEnsAddress`, `getEnsAvatar`, and `getEnsResolver`, using Viem's [`normalize`](https://viem.sh/docs/ens/utilities/normalize.html) function. This added extra bundle size as full normalization is quite heavy. For v2, you must normalize ENS names yourself before passing them to these actions. You can use Viem's `normalize` function or any other function that performs [UTS-46 normalization](https://unicode.org/reports/tr46). +Before v2, Wagmi handled ENS name normalization internally for `getEnsAddress`, `getEnsAvatar`, and `getEnsResolver`, using Viem's [`normalize`](https://viem.sh/docs/ens/utilities/normalize) function. This added extra bundle size as full normalization is quite heavy. For v2, you must normalize ENS names yourself before passing them to these actions. You can use Viem's `normalize` function or any other function that performs [UTS-46 normalization](https://unicode.org/reports/tr46). ::: code-group @@ -421,7 +421,7 @@ import { erc20Abi } from 'viem' // [!code ++] ### Removed `'@wagmi/core/providers/*` entrypoints -It never made sense that we would have provider URLs hardcoded in the Wagmi codebase. Use [Viem transports](https://viem.sh/docs/clients/intro.html#transports) along with RPC provider URLs instead. +It never made sense that we would have provider URLs hardcoded in the Wagmi codebase. Use [Viem transports](https://viem.sh/docs/clients/intro#transports) along with RPC provider URLs instead. ```ts import { alchemyProvider } from '@wagmi/core/providers/alchemy' // [!code --] @@ -551,7 +551,7 @@ const result = await readContracts(config, { // [!code ++] The `formatUnits` parameter and related return values (e.g. `result.formatted`) are deprecated for the following actions: - [`estimateFeesPerGas`](/core/api/actions/estimateFeesPerGas) -- [`getToken`](/core/api/actions/getToken) +- `getToken` Instead you can call `formatUnits` from Viem directly or use another number formatting library, like [dnum](https://github.com/bpierre/dnum) instead. @@ -579,7 +579,7 @@ The following actions were renamed to better reflect their functionality and und - `fetchEnsAvatar` is now [`getEnsAvatar`](/core/api/actions/getEnsAvatar) - `fetchEnsName` is now [`getEnsName`](/core/api/actions/getEnsName) - `fetchEnsResolver` is now [`getEnsResolver`](/core/api/actions/getEnsResolver) -- `fetchToken` is now [`getToken`](/core/api/actions/getToken) +- `fetchToken` is now `getToken` - `fetchTransaction` is now [`getTransaction`](/core/api/actions/getTransaction) - `switchNetwork` is now [`switchChain`](/core/api/actions/switchChain) - `waitForTransaction` is now [`waitForTransactionReceipt`](/core/api/actions/waitForTransactionReceipt) diff --git a/site/core/guides/migrate-from-v2-to-v3.md b/site/core/guides/migrate-from-v2-to-v3.md new file mode 100644 index 0000000000..3ec09c989a --- /dev/null +++ b/site/core/guides/migrate-from-v2-to-v3.md @@ -0,0 +1,71 @@ +--- +title: Migrate from v2 to v3 +description: Guide for migrating from Wagmi v2 to v3. +--- + + + +# Migrate from v2 to v3 + +## Overview + +Wagmi v3 gives you total control over connector dependencies. Since Wagmi's initial release, Wagmi included required connector dependencies as part of its package to eliminate the need to manage multiple third-party dependencies. + +This worked worked well in the early years as a "batteries-included" approach, but didn't allow for more fine-grained control over your dependency tree. By giving you control over connector dependencies, you can decide to only install what you need, manage version bumps at your own pace, and have total control over what third-party code and licenses you bring into your project + +To get started, install the latest version of Wagmi. + +::: code-group +```bash [pnpm] +pnpm add @wagmi/core@3 +``` + +```bash [npm] +npm install @wagmi/core@3 +``` + +```bash [yarn] +yarn add @wagmi/core@3 +``` + +```bash [bun] +bun add @wagmi/core@3 +``` +::: + +::: info Not ready to migrate yet? +The Wagmi v2 docs are still available at [2.x.wagmi.sh/core](https://2.x.wagmi.sh/core). +::: + + + +## Deprecations + +### Renamed Account Actions + +At the core of Wagmi are connections between apps and Ethereum providers (e.g. EIP-1193), `getAccount`, `switchAccount`, and `watchAccount` are renamed to `getConnection`, `switchConnection`, and `watchConnection` to more accurately represent to how Wagmi works. + +```ts +import { + getAccount, // [!code --] + getConnection, // [!code ++] + switchAccount, // [!code --] + switchConnection, // [!code ++] + watchAccount, // [!code --] + watchConnection, // [!code ++] +} from '@wagmi/core' +``` + +`switchAccountMutationOptions` is also updated to `switchConnectionMutationOptions`. + +```ts +import { + switchAccountMutationOptions, // [!code --] + switchConnectionMutationOptions, // [!code ++] +} from '@wagmi/core/query' + +``` diff --git a/site/core/guides/viem.md b/site/core/guides/viem.md index 275ed86949..4a9b4b0f90 100644 --- a/site/core/guides/viem.md +++ b/site/core/guides/viem.md @@ -6,7 +6,7 @@ ## Leveraging Viem Actions -All of the core [Wagmi Actions](/core/api/actions) are friendly wrappers around [Viem Actions](https://viem.sh/docs/actions/public/introduction.html) that inject a multi-chain and connector aware [Wagmi Config](/core/api/createConfig). +All of the core [Wagmi Actions](/core/api/actions) are friendly wrappers around [Viem Actions](https://viem.sh/docs/actions/public/introduction) that inject a multi-chain and connector aware [Wagmi Config](/core/api/createConfig). There may be cases where you might want to dig deeper and utilize Viem Actions directly (maybe an Action doesn't exist in Wagmi yet). In these cases, you can import Viem Actions directly via `viem/actions` and plug in a Viem Client returned by the [`getClient` Action](/core/api/actions/getClient). @@ -78,7 +78,7 @@ const success = await walletClient.watchAsset(walletClient, /* ... */) // [!code ## Multi-chain Viem Client -The [Viem Client](https://viem.sh/docs/client) provides an interface to interact with an JSON-RPC Provider. By nature, JSON-RPC Providers are single-chain, so the Viem Client is designed to be instantiated with a single `chain`. As a result, setting up Viem to be multi-chain aware can get a bit verbose. +The [Viem Client](https://viem.sh/docs/clients/intro) provides an interface to interact with an JSON-RPC Provider. By nature, JSON-RPC Providers are single-chain, so the Viem Client is designed to be instantiated with a single `chain`. As a result, setting up Viem to be multi-chain aware can get a bit verbose. The good news is that you can create a **"multi-chain Viem Client"** with **Wagmi** by utilizing [`createConfig`](/core/api/createConfig) and [`getClient`](/core/api/actions/getClient). @@ -163,7 +163,7 @@ const hash = await walletClient.mainnet.sendTransaction(/* ... */) ## Private Key & Mnemonic Accounts -It is possible to utilize Viem's [Private Key & Mnemonic Accounts](https://viem.sh/docs/accounts/local.html) with Wagmi by explicitly passing through the account via the `account` argument on Wagmi Actions. +It is possible to utilize Viem's [Private Key & Mnemonic Accounts](https://viem.sh/docs/accounts/local) with Wagmi by explicitly passing through the account via the `account` argument on Wagmi Actions. ```tsx import { http, createConfig, sendTransaction } from '@wagmi/core' diff --git a/site/core/typescript.md b/site/core/typescript.md index e41d942828..00a07051f1 100644 --- a/site/core/typescript.md +++ b/site/core/typescript.md @@ -57,6 +57,7 @@ Here's what [`readContract`](/core/api/actions/readContract) looks like with and ::: code-group ```ts twoslash [Const-Asserted] +// @twoslash-cache: {"v":1,"hash":"ce7669bfd8403077642e11ee62585359f9005b3491bb5cb9aa7196e861042c9f","data":"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"} import { createConfig, http } from '@wagmi/core' import { mainnet, sepolia } from '@wagmi/core/chains' @@ -127,6 +128,7 @@ result // ^? ``` ```ts twoslash [Not Const-Asserted] +// @twoslash-cache: {"v":1,"hash":"32e9700c30963257f6c79b087bc2f37aa4f1bb4bb135b24ec22d2f898493f29f","data":"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"} import { createConfig, http } from '@wagmi/core' import { mainnet, sepolia } from '@wagmi/core/chains' @@ -173,6 +175,7 @@ result You can prevent runtime errors and be more productive by making sure your ABIs and Typed Data definitions are set up appropriately. 🎉 ```ts twoslash +// @twoslash-cache: {"v":1,"hash":"1302572cb196fc0dde6d7e01c4f069233f8e54486c2e57cde92bd7a1bf18508b","data":"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"} // @errors: 2820 import { createConfig, http } from '@wagmi/core' import { mainnet, sepolia } from '@wagmi/core/chains' diff --git a/site/dev/contributing.md b/site/dev/contributing.md index f5c0d8335a..1bc0ca752d 100644 --- a/site/dev/contributing.md +++ b/site/dev/contributing.md @@ -1,7 +1,7 @@ @@ -96,20 +96,23 @@ Once a playground dev server is running, you can make changes to any of the pack ## 6. Running the test suite -Wagmi uses [Vitest](https://vitest.dev) to run tests and [Prool](https://github.com/wevm/prool) to execute tests against locally running chain forks. First, install [Anvil](https://github.com/foundry-rs/foundry/tree/master/crates/anvil) via [Foundryup](https://book.getfoundry.sh/getting-started/installation). +Wagmi uses [Vitest](https://vitest.dev) to run tests and [Prool](https://github.com/wevm/prool) to execute tests against locally running chain forks. First, make sure you have Docker ([OrbStack](https://orbstack.dev) works great!) and install [Anvil](https://github.com/foundry-rs/foundry/tree/master/crates/anvil) via [Foundryup](https://book.getfoundry.sh/getting-started/installation). ```bash curl -L https://foundry.paradigm.xyz | bash foundryup ``` +You'll also need to install [Playwright](https://playwright.dev/) browser binaries: + +```bash +pnpm exec playwright install +``` + Next, make sure you have set up your [env variables](#_4-adding-the-env-variables). Now you are ready to run the tests! You have the following options for running tests: - `pnpm test [package?]` — runs tests in watch mode - `pnpm test:cov` — runs tests and reports coverage -- `pnpm test:core` — runs `@wagmi/core` tests -- `pnpm test:react` — runs `wagmi` tests -- `pnpm test:vue` — runs `@wagmi/vue` tests When adding new features or fixing bugs, it's important to add test cases to cover the new or updated behavior. If snapshot tests fail, you can run the `test:update` command to update the snapshots. @@ -168,4 +171,10 @@ pnpm deps patch # print outdated deps with new patch versions pnpm deps -w # updates deps (best done with clean working tree) ``` +Update GitHub Actions via [Actions Up!](https://github.com/azat-io/actions-up) by running: + +```bash +pnpm deps:ci +``` + [Socket](https://socket.dev) checks pull requests for vulnerabilities when new dependencies and versions are added, but you should also be vigilant! When updating dependencies, you should check release notes and source code as well as lock versions when possible. diff --git a/site/dev/creating-connectors.md b/site/dev/creating-connectors.md index c9e82b04b1..a45eaf56ad 100644 --- a/site/dev/creating-connectors.md +++ b/site/dev/creating-connectors.md @@ -18,7 +18,7 @@ Check out the [Contributing Guide](/dev/contributing) to get your local developm ## 2. Create a new file for the connector -Create a new file in `packages/connector/src` named after the connector you want to add. +Create a new file in `packages/connectors/src` named after the connector you want to add. For example, if you want to add Foo, you would create a file named `foo.ts`. File names should be camel-cased and as short as possible. @@ -41,6 +41,7 @@ export function fooBarBaz(parameters: FooBarBazParameters = {}) { Now that the base of the connector is set up, you should see a type error that looks something like this: ```ts twoslash +// @twoslash-cache: {"v":1,"hash":"51529c3efa008aca29b1a99d6189d29f0675b46bfd307c0fa712fc44cfd1d5b5","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAIBjUjGY0AwhDBgY/NBFIAeAK5gA1pADuYCrwBK0uVHlw0pdmADm25WoiaAfNr38DRk2cu9rGsA96ihIjDiktKypABiYEqq3o76pIbGphZWMbY+cc4JrskeXul2hYyCwmISUjJykYh+AWUhlRFR+ZqZLknuqTb2bdkdKZ5p9nbcNf6lQeWhVc1DWrrxiW4DLRkLWUu5Xd6FADpg7AC2WHJoAnWTDWGUIMbMpAyIAAxUrDAWaPhIAIwArFRoe7mGCPEAlQLBCrXV5mXDPKj8fD3ZgyMhIJ4AXwo6GwcIIxDRALooMYWGRhxBZD4zjAADN2OYasB9rxWQIkWY4DUAlAJKwMLxkKIOfMAHTi4XMMzIAC6MoA3Cy2TBDuw0DRSDUAKKq9VkeSQ6akLUkMBoACyzCwdkVYDZvGMcmYwIA/EylfbWSoYBgav1zLbPWzgWgAJI0Q41eTegXE95QOAO5YeIhsRQwXhxsAJ3iMADKYWdMHDKstWF4ADJ1u1k9sCtxkDGZdpYLTmIpWGgAGppjNZnOp1jp3gAH14YA7rFHg1bsKgdkYMZqMZbMDbHe7vbdvFb7c7PaHGbHylnUigfAAvHZc7uNwfh/3ExPWFOXbxB8Ox8+pzUPzA+GOAAKpAQKqcAwPIt77r2mb0PGT6Trwb5/tO368L+vY2h6nrgWGEZRjGsE0Nmib+toKGPrmBZOsCJaHGWlbVtk4qiiMjY+jKqGTguS68Cu769hhh6XteRAQOwUDTsBoHsOB8hiRJWF2kGvBCIcBJ0TUi4+n6yYie+4mSUBIFgRBCnzoGbIYlxL7Tiea5zpZrImMwYBwCcDxwNuTguBOhwAEZkNoAAqpCue5pzXse2YOWetoYjcdwPD8ADsrzvOYnxIAAbACQIgngNL0uYNwcFI6IIkiYWouQiDfClWI4jgeBkCB5BUEljwAEwABzpR8XyIAALAi0Bwl1KVDS8ID0m8YDMBSeBmLAtCimgCBUBJLWkKQAC0E1Tbt3xPENu1DTcND0HgwW4rwADkwAYndvCybwYFwO4vCfBmtIQC+tifVgIE4A87DwLwtImV9t0PYKtC6bkMo1Ks8qqcIvJgPyL00tu/p2TF9JxWjzAY1jEkI+4qM8nyArzRSFMWFT6M06pUBubjybTtTmMCv6sr46eMBQEzJMs5gOAMwGDogooWDbowjD6dJpnyYZIwC7FQuoyxvDfF1b1yBmLGoxI5rwHARby4wFJwBbwI1NJRASWQZu20W+nmQBM6a8LvBPTUEnaHTMDaOLIcCFMMjaK5kk9QbQiiqVMAkKw21taVsIVWCVUohqSC9RizZgmNhUXIajQK0VDL6Ywj3cNwNwUoCSCgFmH0SHg60gBiGJAA=="} // @errors: 2740 import { createConnector } from '@wagmi/core' // ---cut--- @@ -98,7 +99,7 @@ All address values returned and emitted by the connector should be checksummed u ## 5. Export the connector -Export the connector from `packages/connector/src/exports/index.ts` in alphabetic order. +Export the connector from `packages/connectors/src/exports/index.ts` in alphabetic order. ```ts export { fooBarBaz } from './fooBarBaz.js' diff --git a/site/package.json b/site/package.json index f683675231..5cfd1035e0 100644 --- a/site/package.json +++ b/site/package.json @@ -4,11 +4,11 @@ "type": "module", "scripts": { "dev": "vitepress dev", - "build": "vitepress build", + "build": "NODE_OPTIONS=\"--max-old-space-size=16384\" vitepress build", "preview": "vitepress preview" }, "devDependencies": { - "@shikijs/vitepress-twoslash": "1.22.2", + "@shikijs/vitepress-twoslash": "3.20.0", "@tanstack/query-core": "catalog:", "@tanstack/react-query": "catalog:", "@tanstack/vue-query": "catalog:", @@ -17,11 +17,13 @@ "@wagmi/core": "workspace:*", "@wagmi/vue": "workspace:*", "abitype": "*", - "nuxt": "^3.11.2", + "nuxt": "^3.19.2", "react": "catalog:", - "unocss": "^0.59.4", + "unocss": "^66.5.6", "viem": "2.*", - "vitepress": "1.5.0", + "vitepress": "1.6.3", + "vitepress-plugin-group-icons": "^1.6.5", + "vitepress-plugin-llms": "^1.8.1", "vue": "catalog:", "wagmi": "workspace:*" } diff --git a/site/react/api/connectors.md b/site/react/api/connectors.md index 49096a1641..95a0e4124d 100644 --- a/site/react/api/connectors.md +++ b/site/react/api/connectors.md @@ -21,6 +21,10 @@ import { injected } from 'wagmi/connectors' ## Available Connectors +::: tip +Some connectors require third-party packages. See the "Install" section on each connector's page for more info on license, version, and more. +::: +
    • {{ connector.text }} diff --git a/site/react/api/connectors/baseAccount.md b/site/react/api/connectors/baseAccount.md new file mode 100644 index 0000000000..110da644ac --- /dev/null +++ b/site/react/api/connectors/baseAccount.md @@ -0,0 +1,14 @@ +--- +title: baseAccount +--- + + + + diff --git a/site/react/api/connectors/coinbaseWallet.md b/site/react/api/connectors/coinbaseWallet.md index b8597b11ae..2a25b8c583 100644 --- a/site/react/api/connectors/coinbaseWallet.md +++ b/site/react/api/connectors/coinbaseWallet.md @@ -1,6 +1,10 @@ - \ No newline at end of file + diff --git a/site/react/api/connectors/gemini.md b/site/react/api/connectors/gemini.md new file mode 100644 index 0000000000..c30891d8e7 --- /dev/null +++ b/site/react/api/connectors/gemini.md @@ -0,0 +1,15 @@ +--- +title: gemini +--- + + + + diff --git a/site/react/api/connectors/injected.md b/site/react/api/connectors/injected.md index 56573881f4..3a029864a6 100644 --- a/site/react/api/connectors/injected.md +++ b/site/react/api/connectors/injected.md @@ -1,3 +1,7 @@ +--- +title: injected +--- + diff --git a/site/react/api/connectors/mock.md b/site/react/api/connectors/mock.md index 3a111297a1..e59bd30a33 100644 --- a/site/react/api/connectors/mock.md +++ b/site/react/api/connectors/mock.md @@ -1,3 +1,7 @@ +--- +title: mock +--- + + + diff --git a/site/react/api/connectors/safe.md b/site/react/api/connectors/safe.md index 375ddb7b2d..ce779051eb 100644 --- a/site/react/api/connectors/safe.md +++ b/site/react/api/connectors/safe.md @@ -1,6 +1,17 @@ +--- +title: safe +--- + diff --git a/site/react/api/connectors/walletConnect.md b/site/react/api/connectors/walletConnect.md index 3e1a4a5c24..9936ed2aaf 100644 --- a/site/react/api/connectors/walletConnect.md +++ b/site/react/api/connectors/walletConnect.md @@ -1,6 +1,14 @@ +--- +title: walletConnect +--- + diff --git a/site/react/api/createConfig.md b/site/react/api/createConfig.md index f42bec2539..b02bb66b13 100644 --- a/site/react/api/createConfig.md +++ b/site/react/api/createConfig.md @@ -1,3 +1,7 @@ +--- +title: createConfig +--- + # useBalance -Hook for fetching native currency or token balance. +Hook for fetching native currency balance. ## Import @@ -168,47 +168,6 @@ function App() { <<< @/snippets/react/config.ts[config.ts] ::: -### token [deprecated](/react/guides/migrate-from-v1-to-v2#deprecated-usebalance-token-parameter) - -`Address | undefined` - -ERC-20 token address to get balance for. - -::: code-group -```ts [index.ts] -import { useBalance } from 'wagmi' - -function App() { - const result = useBalance({ - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - token: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -### unit [deprecated](/react/guides/migrate-from-v1-to-v2#deprecated-usebalance-unit-parameter-and-formatted-return-value) - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { useBalance } from 'wagmi' - -function App() { - const result = useBalance({ - address: '0x4557B18E779944BFE9d78A672452331C186a9f48', - unit: 'ether', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - ## Return Type diff --git a/site/react/api/hooks/useCall.md b/site/react/api/hooks/useCall.md index 9bc2250cf2..aa3ca99b4d 100644 --- a/site/react/api/hooks/useCall.md +++ b/site/react/api/hooks/useCall.md @@ -160,7 +160,7 @@ function App() { `bigint | undefined` -The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```tsx [index.tsx] @@ -182,7 +182,7 @@ function App() { `bigint | undefined` -Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```tsx [index.tsx] @@ -204,7 +204,7 @@ function App() { `bigint | undefined` -Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```tsx [index.tsx] diff --git a/site/react/api/hooks/useCallsStatus.md b/site/react/api/hooks/useCallsStatus.md index 94b333b7c7..9961c68fde 100644 --- a/site/react/api/hooks/useCallsStatus.md +++ b/site/react/api/hooks/useCallsStatus.md @@ -4,7 +4,7 @@ description: Hook for fetching the number of the most recent block seen. --- # useConnect @@ -31,10 +31,9 @@ import { useConnect } from 'wagmi' import { injected } from 'wagmi/connectors' function App() { - const { connect } = useConnect() - + const connect = useConnect() return ( - ) @@ -61,7 +60,7 @@ import { useConnect } from 'wagmi' import { config } from './config' // [!code focus] function App() { - const result = useConnect({ + const connect = useConnect({ config, // [!code focus] }) } @@ -77,7 +76,7 @@ function App() { import { type UseConnectReturnType } from 'wagmi' ``` -### connectors +### connectors [deprecated](/react/guides/migrate-from-v2-to-v3#removed-useconnect-connectors-usereconnect-connectors) `readonly Connector[]` @@ -88,12 +87,12 @@ Globally configured connectors via [`createConfig`](/react/api/createConfig#conn import { useConnect } from 'wagmi' function App() { - const { connect, connectors } = useConnect() + const connect = useConnect() return (
      - {connectors.map((connector) => ( - ))} diff --git a/site/react/api/hooks/useAccount.md b/site/react/api/hooks/useConnection.md similarity index 52% rename from site/react/api/hooks/useAccount.md rename to site/react/api/hooks/useConnection.md index d5b9e2964c..5ba384c191 100644 --- a/site/react/api/hooks/useAccount.md +++ b/site/react/api/hooks/useConnection.md @@ -1,26 +1,26 @@ --- -title: useAccount -description: Hook for getting current account. +title: useConnection +description: Hook for getting current connection. --- -# useAccount +# useConnection -Hook for getting current account. +Hook for getting current connection. ## Import ```ts -import { useAccount } from 'wagmi' +import { useConnection } from 'wagmi' ``` ## Usage ::: code-group ```tsx [index.tsx] -import { useAccount } from 'wagmi' +import { useConnection } from 'wagmi' function App() { - const account = useAccount() + const connection = useConnection() } ``` <<< @/snippets/react/config.ts[config.ts] @@ -29,7 +29,7 @@ function App() { ## Parameters ```ts -import { type UseAccountParameters } from 'wagmi' +import { type UseConnectionParameters } from 'wagmi' ``` ### config @@ -40,11 +40,11 @@ import { type UseAccountParameters } from 'wagmi' ::: code-group ```tsx [index.tsx] -import { useAccount } from 'wagmi' +import { useConnection } from 'wagmi' import { config } from './config' // [!code focus] function App() { - const account = useAccount({ + const connection = useConnection({ config, // [!code focus] }) } @@ -55,11 +55,11 @@ function App() { ## Return Type ```ts -import { type UseAccountReturnType } from 'wagmi' +import { type UseConnectionReturnType } from 'wagmi' ``` - + ## Action -- [`getAccount`](/core/api/actions/getAccount) +- [`getConnection`](/core/api/actions/getConnection) diff --git a/site/react/api/hooks/useAccountEffect.md b/site/react/api/hooks/useConnectionEffect.md similarity index 67% rename from site/react/api/hooks/useAccountEffect.md rename to site/react/api/hooks/useConnectionEffect.md index 6636f4bbaa..ffa4a21331 100644 --- a/site/react/api/hooks/useAccountEffect.md +++ b/site/react/api/hooks/useConnectionEffect.md @@ -1,26 +1,26 @@ --- -title: useAccountEffect -description: Hook for listening to account lifecycle events. +title: useConnectionEffect +description: Hook for listening to connection lifecycle events. --- -# useAccountEffect +# useConnectionEffect -Hook for listening to account lifecycle events. +Hook for listening to connection lifecycle events. ## Import ```ts -import { useAccountEffect } from 'wagmi' +import { useConnectionEffect } from 'wagmi' ``` ## Usage ::: code-group ```tsx [index.tsx] -import { useAccountEffect } from 'wagmi' +import { useConnectionEffect } from 'wagmi' function App() { - useAccountEffect({ + useConnectionEffect({ onConnect(data) { console.log('Connected!', data) }, @@ -36,7 +36,7 @@ function App() { ## Parameters ```ts -import { type UseAccountEffectParameters } from 'wagmi' +import { type UseConnectionEffectParameters } from 'wagmi' ``` ### config @@ -47,11 +47,11 @@ import { type UseAccountEffectParameters } from 'wagmi' ::: code-group ```tsx [index.tsx] -import { useAccountEffect } from 'wagmi' +import { useConnectionEffect } from 'wagmi' import { config } from './config' // [!code focus] function App() { - useAccountEffect({ + useConnectionEffect({ config, // [!code focus] onConnect(data) { console.log('Connected!', data) @@ -69,14 +69,14 @@ function App() { `` ((data: { address: `0x${string}`; addresses: readonly [`0x${string}`, ...`0x${string}`[]]; chain: Chain | undefined chainId: number; connector: Connector; isReconnected: boolean }) => void) | undefined `` -Callback that is called when accounts are connected. +Callback that is called when connection is made. ::: code-group ```tsx [index.tsx] -import { useAccountEffect } from 'wagmi' +import { useConnectionEffect } from 'wagmi' function App() { - useAccountEffect({ + useConnectionEffect({ onConnect(data) { // [!code focus] console.log('Connected!', data) // [!code focus] }, // [!code focus] @@ -90,14 +90,14 @@ function App() { `(() => void) | undefined` -Callback that is called when no more accounts are connected. +Callback that is called when there no more connections. ::: code-group ```tsx [index.tsx] -import { useAccountEffect } from 'wagmi' +import { useConnectionEffect } from 'wagmi' function App() { - useAccountEffect({ + useConnectionEffect({ onDisconnect() { // [!code focus] console.log('Disconnected!') // [!code focus] }, // [!code focus] @@ -109,5 +109,5 @@ function App() { ## Action -- [`getAccount`](/core/api/actions/getAccount) -- [`watchAccount`](/core/api/actions/watchAccount) +- [`getConnection`](/core/api/actions/getConnection) +- [`watchConnection`](/core/api/actions/watchConnection) diff --git a/site/react/api/hooks/useConnectorClient.md b/site/react/api/hooks/useConnectorClient.md index 60aa74b77d..7e8e127e41 100644 --- a/site/react/api/hooks/useConnectorClient.md +++ b/site/react/api/hooks/useConnectorClient.md @@ -14,7 +14,7 @@ const hideQueryOptions = ['gcTime', 'staleTime'] # useConnectorClient -Hook for getting a Viem [`Client`](https://viem.sh/docs/clients/custom.html) object for the current or provided connector. +Hook for getting a Viem [`Client`](https://viem.sh/docs/clients/custom) object for the current or provided connector. ## Import diff --git a/site/react/api/hooks/useDeployContract.md b/site/react/api/hooks/useDeployContract.md index 42b2e9ffe3..5e2a14cc75 100644 --- a/site/react/api/hooks/useDeployContract.md +++ b/site/react/api/hooks/useDeployContract.md @@ -7,7 +7,7 @@ description: Hook for deploying a contract to the network, given bytecode & cons const packageName = 'wagmi' const actionName = 'deployContract' const typeName = 'DeployContract' -const mutate = 'deployContract' +const mutate = 'mutate' const TData = 'DeployContractData' const TError = 'DeployContractErrorType' const TVariables = 'DeployContractVariables' @@ -32,12 +32,12 @@ import { parseEther } from 'viem' import { wagmiAbi } from './abi' function App() { - const { deployContract } = useDeployContract() + const deployContract = useDeployContract() return ( ) @@ -76,7 +75,7 @@ function App() { import { type UseDisconnectReturnType } from 'wagmi' ``` -### connectors +### connectors [deprecated](/react/guides/migrate-from-v2-to-v3#removed-usedisconnect-connectors-useswitchconnection-connectors) `readonly Connector[]` @@ -84,16 +83,17 @@ Connectors that are currently connected. Useful for rendering a list of connecto ::: code-group ```tsx [index.tsx] -import { useDisconnect } from 'wagmi' +import { useConnectors, useDisconnect } from 'wagmi' import { mainnet } from 'wagmi/chains' function App() { - const { connectors, disconnect } = useDisconnect() + const disconnect = useDisconnect() + const connectors = useConnectors() return (
      {connectors.map((connector) => ( - ))} diff --git a/site/react/api/hooks/useEstimateFeesPerGas.md b/site/react/api/hooks/useEstimateFeesPerGas.md index 29b8711673..2ff6ace4a2 100644 --- a/site/react/api/hooks/useEstimateFeesPerGas.md +++ b/site/react/api/hooks/useEstimateFeesPerGas.md @@ -7,7 +7,7 @@ description: Hook for fetching an estimate for the fees per gas (in wei) for a t const packageName = 'wagmi' const actionName = 'estimateFeesPerGas' const typeName = 'EstimateFeesPerGas' -const TData = '{ formatted: { gasPrice: string | undefined; maxFeePerGas: string | undefined; maxPriorityFeePerGas: string | undefined; }; gasPrice: bigint | undefined; maxFeePerGas: bigint | undefined; maxPriorityFeePerGas: bigint | undefined; }' +const TData = '{ gasPrice: bigint | undefined; maxFeePerGas: bigint | undefined; maxPriorityFeePerGas: bigint | undefined; }' const TError = 'EstimateFeesPerGasErrorType' @@ -80,26 +80,6 @@ function App() { <<< @/snippets/react/config.ts[config.ts] ::: -### formatUnits - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { useEstimateFeesPerGas } from 'wagmi' - -function App() { - const result = useEstimateFeesPerGas({ - formatUnits: 'ether', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - ### scopeKey `string | undefined` diff --git a/site/react/api/hooks/useEstimateGas.md b/site/react/api/hooks/useEstimateGas.md index db0707ca1a..b2137f28c5 100644 --- a/site/react/api/hooks/useEstimateGas.md +++ b/site/react/api/hooks/useEstimateGas.md @@ -189,7 +189,7 @@ function App() { `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```ts [index.ts] @@ -212,7 +212,7 @@ function App() { `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] @@ -235,7 +235,7 @@ function App() { `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```ts [index.ts] diff --git a/site/react/api/hooks/usePrepareTransactionRequest.md b/site/react/api/hooks/usePrepareTransactionRequest.md index 431fdda482..a19ca6c582 100644 --- a/site/react/api/hooks/usePrepareTransactionRequest.md +++ b/site/react/api/hooks/usePrepareTransactionRequest.md @@ -166,7 +166,7 @@ function App() { `bigint | undefined` -The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price (in wei) to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```tsx [index.tsx] @@ -189,7 +189,7 @@ function App() { `bigint | undefined` -Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas (in wei), inclusive of `maxPriorityFeePerGas`. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```tsx [index.tsx] @@ -212,7 +212,7 @@ function App() { `bigint | undefined` -Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas (in wei). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```tsx [index.tsx] diff --git a/site/react/api/hooks/usePublicClient.md b/site/react/api/hooks/usePublicClient.md index 9f0411055b..553b402498 100644 --- a/site/react/api/hooks/usePublicClient.md +++ b/site/react/api/hooks/usePublicClient.md @@ -5,7 +5,7 @@ description: Hook for getting Viem `PublicClient` instance. # usePublicClient -Hook for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public.html) instance. +Hook for getting Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance. ## Import @@ -27,7 +27,7 @@ function App() { ::: ::: warning -If you want to optimize bundle size, you should use [`useClient`](/react/api/hooks/useClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom.html#tree-shaking) instead. Since Public Client has all public actions attached directly to it. +If you want to optimize bundle size, you should use [`useClient`](/react/api/hooks/useClient) along with Viem's [tree-shakable actions](https://viem.sh/docs/clients/custom#tree-shaking) instead. Since Public Client has all public actions attached directly to it. ::: ## Parameters @@ -85,7 +85,7 @@ import { type UsePublicClientReturnType } from 'wagmi' `PublicClient | undefined` -Viem [`PublicClient`](https://viem.sh/docs/clients/public.html) instance. +Viem [`PublicClient`](https://viem.sh/docs/clients/public) instance. ## Action diff --git a/site/react/api/hooks/useReadContract.md b/site/react/api/hooks/useReadContract.md index 07be91e010..0870801753 100644 --- a/site/react/api/hooks/useReadContract.md +++ b/site/react/api/hooks/useReadContract.md @@ -314,6 +314,7 @@ With [`abi`](#abi) setup correctly, TypeScript will infer the correct types for ::: code-group ```ts twoslash [Inline] +// @twoslash-cache: {"v":1,"hash":"8bfa3d1e805ee2d7a8b83c91b1e75f961b748f9d5c3b79a8bca9b7494b57cb8e","data":"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"} import { createConfig, http, useReadContract } from 'wagmi' import { mainnet, sepolia } from 'wagmi/chains' @@ -355,6 +356,7 @@ result.data // ^? ``` ```ts twoslash [Const-Asserted] +// @twoslash-cache: {"v":1,"hash":"9f8b59d36cf11dedf27c45ac2abd580ec38459b071c6641a3e4025c048f71072","data":"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"} import { createConfig, http, useReadContract } from 'wagmi' import { mainnet, sepolia } from 'wagmi/chains' diff --git a/site/react/api/hooks/useReadContracts.md b/site/react/api/hooks/useReadContracts.md index 48436c9362..a5ac591316 100644 --- a/site/react/api/hooks/useReadContracts.md +++ b/site/react/api/hooks/useReadContracts.md @@ -3,6 +3,14 @@ title: useReadContracts description: Hook for calling multiple read methods on a contract. --- + + # useReadContracts Hook for calling multiple read methods on a contract. @@ -389,6 +397,8 @@ import { type UseReadContractsReturnType } from 'wagmi' + + ## Action - [`readContracts`](/core/api/actions/readContracts) diff --git a/site/react/api/hooks/useReconnect.md b/site/react/api/hooks/useReconnect.md index 7aff4945c9..7e8ba414e2 100644 --- a/site/react/api/hooks/useReconnect.md +++ b/site/react/api/hooks/useReconnect.md @@ -31,10 +31,9 @@ import { useReconnect } from 'wagmi' import { useEffect } from 'react' function App() { - const { reconnect } = useReconnect() - + const reconnect = useReconnect() useEffect(() => { - reconnect() + reconnect.mutate() }, []) } ``` @@ -63,7 +62,7 @@ import { useReconnect } from 'wagmi' import { config } from './config' // [!code focus] function App() { - const result = useReconnect({ + const reconnect = useReconnect({ config, // [!code focus] }) } @@ -79,7 +78,7 @@ function App() { import { type UseReconnectReturnType } from 'wagmi' ``` -### connectors +### connectors [deprecated](/react/guides/migrate-from-v2-to-v3#removed-useconnect-connectors-usereconnect-connectors) `readonly Connector[]` @@ -92,10 +91,10 @@ import { mainnet } from 'wagmi/chains' import { useEffect } from 'react' function App() { - const { reconnect, connectors } = useReconnect() + const reconnect = useReconnect() useEffect(() => { - reconnect({ connectors }) + reconnect.mutate({ connectors: reconnect.connectors }) }, []) } ``` diff --git a/site/react/api/hooks/useSendCalls.md b/site/react/api/hooks/useSendCalls.md index 32b2f81afa..44fc72e419 100644 --- a/site/react/api/hooks/useSendCalls.md +++ b/site/react/api/hooks/useSendCalls.md @@ -4,7 +4,7 @@ description: Hook that requests for the wallet to sign and broadcast a batch of --- + +# useSendCallsSync + +Hook that requests for the wallet to sign and broadcast a batch of calls (transactions) to the network. + +[Read more.](https://github.com/ethereum/EIPs/blob/815028dc634463e1716fc5ce44c019a6040f0bef/EIPS/eip-5792.md#wallet_sendcallsSync) + +## Import + +```ts +import { useSendCallsSync } from 'wagmi' +``` + +## Usage + +::: code-group +```tsx [index.tsx] +import { useSendCallsSync } from 'wagmi' +import { parseEther } from 'viem' + +function App() { + const sendCallsSync = useSendCallsSync() + return ( + + ) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type UseSendCallsSyncParameters } from 'wagmi' +``` + +### config + +`Config | undefined` + +[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). + +::: code-group +```tsx [index.tsx] +import { useSendCallsSync } from 'wagmi' +import { config } from './config' // [!code focus] + +function App() { + const sendCallsSync = useSendCallsSync({ + config, // [!code focus] + }) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + + + +## Return Type + +```ts +import { type UseSendCallsSyncReturnType } from 'wagmi' +``` + + + + + +## Action + +- [`sendCallsSync`](/core/api/actions/sendCallsSync) diff --git a/site/react/api/hooks/useSendTransaction.md b/site/react/api/hooks/useSendTransaction.md index c9d4bf441b..9ae3d1e9ba 100644 --- a/site/react/api/hooks/useSendTransaction.md +++ b/site/react/api/hooks/useSendTransaction.md @@ -31,12 +31,11 @@ import { useSendTransaction } from 'wagmi' import { parseEther } from 'viem' function App() { - const { sendTransaction } = useSendTransaction() - + const sendTransaction = useSendTransaction() return ( + ) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type UseSendTransactionSyncParameters } from 'wagmi' +``` + +### config + +`Config | undefined` + +[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). + +::: code-group +```tsx [index.tsx] +import { useSendTransactionSync } from 'wagmi' +import { config } from './config' // [!code focus] + +function App() { + const sendTransactionSync = useSendTransactionSync({ + config, // [!code focus] + }) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + + + +## Return Type + +```ts +import { type UseSendTransactionSyncReturnType } from 'wagmi' +``` + + + + + +## Action + +- [`sendTransactionSync`](/core/api/actions/sendTransactionSync) diff --git a/site/react/api/hooks/useShowCallsStatus.md b/site/react/api/hooks/useShowCallsStatus.md index 5ff5fbe958..cf234668a6 100644 --- a/site/react/api/hooks/useShowCallsStatus.md +++ b/site/react/api/hooks/useShowCallsStatus.md @@ -4,7 +4,7 @@ description: Action to request for the wallet to show information about a call b --- - -# useSwitchAccount - -Hook for switching the current account. - -## Import - -```ts -import { useSwitchAccount } from 'wagmi' -``` - -## Usage - -::: code-group -```tsx [index.tsx] -import { useSwitchAccount } from 'wagmi' - -function App() { - const { connectors, switchAccount } = useSwitchAccount() - - return ( -
      - {connectors.map((connector) => ( - - ))} -
      - ) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -## Parameters - -```ts -import { type UseSwitchAccountParameters } from 'wagmi' -``` - -### config - -`Config | undefined` - -[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). - -::: code-group -```tsx [index.tsx] -import { useSwitchAccount } from 'wagmi' -import { config } from './config' // [!code focus] - -function App() { - const result = useSwitchAccount({ - config, // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - - - -## Return Type - -```ts -import { type UseSwitchAccountReturnType } from 'wagmi' -``` - -### connectors - -`readonly Connector[]` - -Globally configured and actively connected connectors. Useful for rendering a list of available connectors to switch to. - -::: code-group -```tsx [index.tsx] -import { useSwitchAccount } from 'wagmi' - -function App() { - const { connectors, switchAccount } = useSwitchAccount() - - return ( -
      - {connectors.map((connector) => ( - - ))} -
      - ) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - - - - - -## Action - -- [`switchAccount`](/core/api/actions/switchAccount) diff --git a/site/react/api/hooks/useSwitchChain.md b/site/react/api/hooks/useSwitchChain.md index 3b139bd701..9d2694225e 100644 --- a/site/react/api/hooks/useSwitchChain.md +++ b/site/react/api/hooks/useSwitchChain.md @@ -27,15 +27,15 @@ import { useSwitchChain } from 'wagmi' ::: code-group ```tsx [index.tsx] -import { useSwitchChain } from 'wagmi' +import { useChains, useSwitchChain } from 'wagmi' function App() { - const { chains, switchChain } = useSwitchChain() - + const switchChain = useSwitchChain() + const chains = useChains() return (
      {chains.map((chain) => ( - ))} @@ -68,7 +68,7 @@ import { useSwitchChain } from 'wagmi' import { config } from './config' // [!code focus] function App() { - const result = useSwitchChain({ + const switchChain = useSwitchChain({ config, // [!code focus] }) } @@ -84,7 +84,7 @@ function App() { import { type UseSwitchChainReturnType } from 'wagmi' ``` -### chains +### chains [deprecated](/react/guides/migrate-from-v2-to-v3#removed-useswitchchain-chains) `readonly [Chain, ...Chain[]]` @@ -95,11 +95,10 @@ Globally configured chains. Useful for rendering a list of available chains to s import { useSwitchChain } from 'wagmi' function App() { - const { chains, switchChain } = useSwitchChain() - + const switchChain = useSwitchChain() return (
      - {chains.map((chain) => ( + {switchChain.chains.map((chain) => ( diff --git a/site/react/api/hooks/useSwitchConnection.md b/site/react/api/hooks/useSwitchConnection.md new file mode 100644 index 0000000000..f278dcc3d5 --- /dev/null +++ b/site/react/api/hooks/useSwitchConnection.md @@ -0,0 +1,116 @@ +--- +title: useSwitchConnection +description: Hook for switching the current connection. +--- + + + +# useSwitchConnection + +Hook for switching the current connection. + +## Import + +```ts +import { useSwitchConnection } from 'wagmi' +``` + +## Usage + +::: code-group +```tsx [index.tsx] +import { useConnections, useSwitchConnection } from 'wagmi' + +function App() { + const switchConnection = useSwitchConnection() + const connections = useConnections() + return ( +
      + {connections.map((connection) => ( + + ))} +
      + ) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + +## Parameters + +```ts +import { type UseSwitchConnectionParameters } from 'wagmi' +``` + +### config + +`Config | undefined` + +[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). + +::: code-group +```tsx [index.tsx] +import { useSwitchConnection } from 'wagmi' +import { config } from './config' // [!code focus] + +function App() { + const result = useSwitchConnection({ + config, // [!code focus] + }) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + + + +## Return Type + +```ts +import { type UseSwitchConnectionReturnType } from 'wagmi' +``` + +### connectors [deprecated](/react/guides/migrate-from-v2-to-v3#removed-usedisconnect-connectors-useswitchconnection-connectors) + +`readonly Connector[]` + +Globally configured and actively connected connectors. Useful for rendering a list of available connectors to switch to. + +::: code-group +```tsx [index.tsx] +import { useSwitchConnection } from 'wagmi' + +function App() { + const switchConnection = useSwitchConnection() + + return ( +
      + {switchConnection.connectors.map((connector) => ( + + ))} +
      + ) +} +``` +<<< @/snippets/react/config.ts[config.ts] +::: + + + + + +## Action + +- [`switchConnection`](/core/api/actions/switchConnection) diff --git a/site/react/api/hooks/useToken.md b/site/react/api/hooks/useToken.md deleted file mode 100644 index cd4c6dbec2..0000000000 --- a/site/react/api/hooks/useToken.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: useToken -description: Hook for fetching token info. ---- - - - -# useToken [deprecated](/react/guides/migrate-from-v1-to-v2#deprecated-usetoken) - -Hook for fetching token info. - -## Import - -```ts -import { useToken } from 'wagmi' -``` - -## Usage - -::: code-group -```tsx [index.tsx] -import { useToken } from 'wagmi' - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -## Parameters - -```ts -import { type UseTokenParameters } from 'wagmi' -``` - -### address - -`Address | undefined` - -Address to get token for. [`enabled`](#enabled) set to `false` if `address` is `undefined`. - -::: code-group -```tsx [index.tsx] -import { useToken } from 'wagmi' -import { mainnet } from 'wagmi/chains' - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -### chainId - -`config['chains'][number]['id'] | undefined` - -ID of chain to use when fetching data. - -::: code-group -```tsx [index.tsx] -import { useToken } from 'wagmi' -import { mainnet } from 'wagmi/chains' // [!code focus] - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - chainId: mainnet.id, // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -### config - -`Config | undefined` - -[`Config`](/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](/react/api/WagmiProvider). - -::: code-group -```tsx [index.tsx] -import { useToken } from 'wagmi' -import { config } from './config' // [!code focus] - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - config, // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -### formatUnits - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```ts [index.ts] -import { useToken } from 'wagmi' - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - formatUnits: 'ether', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - -### scopeKey - -`string | undefined` - -Scopes the cache to a given context. Hooks that have identical context will share the same cache. - -::: code-group -```ts [index.ts] -import { useToken } from 'wagmi' - -function App() { - const result = useToken({ - address: '0x6B175474E89094C44Da98b954EedeAC495271d0F', - scopeKey: 'foo', // [!code focus] - }) -} -``` -<<< @/snippets/react/config.ts[config.ts] -::: - - - -## Return Type - -```ts -import { type UseTokenReturnType } from 'wagmi' -``` - - - - - -## Action - -- [`getToken`](/core/api/actions/getToken) diff --git a/site/react/api/hooks/useTransactionReceipt.md b/site/react/api/hooks/useTransactionReceipt.md index 2f909ee891..cccb32b56e 100644 --- a/site/react/api/hooks/useTransactionReceipt.md +++ b/site/react/api/hooks/useTransactionReceipt.md @@ -13,7 +13,7 @@ const TError = 'GetTransactionReceiptErrorType' # useTransactionReceipt -Hook for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) hash. +Hook for return the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. ## Import diff --git a/site/react/api/hooks/useWaitForCallsStatus.md b/site/react/api/hooks/useWaitForCallsStatus.md index 070115179d..9ea5d6db33 100644 --- a/site/react/api/hooks/useWaitForCallsStatus.md +++ b/site/react/api/hooks/useWaitForCallsStatus.md @@ -4,7 +4,7 @@ description: Waits for a call bundle to be confirmed & included on a block. --- diff --git a/site/react/api/transports/fallback.md b/site/react/api/transports/fallback.md index cffcd08f05..6a73b6d872 100644 --- a/site/react/api/transports/fallback.md +++ b/site/react/api/transports/fallback.md @@ -1,3 +1,7 @@ +--- +title: fallback +--- + diff --git a/site/react/api/transports/http.md b/site/react/api/transports/http.md index 31d80d8a8d..d6eb4562bf 100644 --- a/site/react/api/transports/http.md +++ b/site/react/api/transports/http.md @@ -1,3 +1,7 @@ +--- +title: http +--- + diff --git a/site/react/api/transports/unstable_connector.md b/site/react/api/transports/unstable_connector.md index 008b9aa3d4..410f8627b4 100644 --- a/site/react/api/transports/unstable_connector.md +++ b/site/react/api/transports/unstable_connector.md @@ -1,3 +1,7 @@ +--- +title: unstable_connector +--- + diff --git a/site/react/api/utilities/cookieToInitialState.md b/site/react/api/utilities/cookieToInitialState.md index 98363c60e6..7d59f94cdd 100644 --- a/site/react/api/utilities/cookieToInitialState.md +++ b/site/react/api/utilities/cookieToInitialState.md @@ -1,3 +1,7 @@ +--- +title: cookieToInitialState +--- + diff --git a/site/react/api/utilities/deserialize.md b/site/react/api/utilities/deserialize.md index 24e9aa22c4..605025b6fa 100644 --- a/site/react/api/utilities/deserialize.md +++ b/site/react/api/utilities/deserialize.md @@ -1,3 +1,7 @@ +--- +title: deserialize +--- + diff --git a/site/react/api/utilities/normalizeChainId.md b/site/react/api/utilities/normalizeChainId.md deleted file mode 100644 index deceae7a4e..0000000000 --- a/site/react/api/utilities/normalizeChainId.md +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/site/react/api/utilities/serialize.md b/site/react/api/utilities/serialize.md index 9ff2ff3225..647088a02d 100644 --- a/site/react/api/utilities/serialize.md +++ b/site/react/api/utilities/serialize.md @@ -1,3 +1,7 @@ +--- +title: serialize +--- + diff --git a/site/react/getting-started.md b/site/react/getting-started.md index 0d49eeeac1..abe10877e2 100644 --- a/site/react/getting-started.md +++ b/site/react/getting-started.md @@ -84,6 +84,7 @@ If you are using TypeScript, you can "register" the Wagmi config or use the hook ::: code-group ```ts twoslash [register config] +// @twoslash-cache: {"v":1,"hash":"1e950b442ed7db157508f31fce13aca96913b67241b30d5521468ad652cad085","data":"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="} // @errors: 2322 import { type Config } from 'wagmi' import { mainnet, sepolia } from 'wagmi/chains' @@ -102,6 +103,7 @@ declare module 'wagmi' { ``` ```ts twoslash [hook config property] +// @twoslash-cache: {"v":1,"hash":"849a5652cb34072baf13797118507e525565a80b04851946389914c2dc341926","data":"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"} // @errors: 2322 import { type Config } from 'wagmi' import { mainnet, sepolia } from 'wagmi/chains' @@ -118,7 +120,7 @@ By registering or using the hook `config` property, `useBlockNumber`'s `chainId` ### Wrap App in Context Provider -Wrap your app in the `WagmiProvider` React Context Provider and pass the `config` you created earlier to the `value` property. +Wrap your app in the `WagmiProvider` React Context Provider and pass the `config` you created earlier to the `config` property. ::: code-group ```tsx [app.tsx] @@ -163,7 +165,7 @@ function App() { <<< @/snippets/react/config.ts[config.ts] ::: -Check out the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/react) to learn about the library, APIs, and more. +Check out the [TanStack Query docs](https://tanstack.com/query/latest/docs/framework/react/overview) to learn about the library, APIs, and more. ### Use Wagmi @@ -171,10 +173,10 @@ Now that everything is set up, every component inside the Wagmi and TanStack Que ::: code-group ```tsx [profile.tsx] -import { useAccount, useEnsName } from 'wagmi' +import { useConnection, useEnsName } from 'wagmi' export function Profile() { - const { address } = useAccount() + const { address } = useConnection() const { data, error, status } = useEnsName({ address }) if (status === 'pending') return
      Loading ENS name
      if (status === 'error') diff --git a/site/react/guides/connect-wallet.md b/site/react/guides/connect-wallet.md index 05e623d04c..9ae03f2332 100644 --- a/site/react/guides/connect-wallet.md +++ b/site/react/guides/connect-wallet.md @@ -9,7 +9,7 @@ Wagmi contains everything you need to get started with building a Connect Wallet You can use a pre-built Connect Wallet module from a third-party library such as: - [ConnectKit](https://docs.family.co/connectkit) - [Guide](https://docs.family.co/connectkit/getting-started) -- [AppKit](https://walletconnect.com/appkit) - [Guide](https://docs.walletconnect.com/appkit/next/core/installation) +- [AppKit](https://reown.com/appkit) - [Guide](https://docs.reown.com/appkit/next/core/installation) - [RainbowKit](https://www.rainbowkit.com/) - [Guide](https://www.rainbowkit.com/docs/installation) - [Dynamic](https://www.dynamic.xyz/) - [Guide](https://docs.dynamic.xyz/quickstart) - [Privy](https://privy.io) - [Guide](https://docs.privy.io/guide/react/wallets/usage/wagmi) @@ -60,7 +60,7 @@ In the above configuration, we want to set up connectors for Injected (browser), Make sure to replace the `projectId` with your own WalletConnect Project ID, if you wish to use WalletConnect! -[Get your Project ID](https://cloud.walletconnect.com/) +[Get your Project ID](https://cloud.reown.com/) ::: @@ -125,10 +125,11 @@ Below, we are rendering a list of `connectors` retrieved from `useConnect`. When ```tsx [wallet-options.tsx] import * as React from 'react' -import { Connector, useConnect } from 'wagmi' +import { Connector, useConnect, useConnectors } from 'wagmi' export function WalletOptions() { - const { connectors, connect } = useConnect() + const { connect } = useConnect() + const connectors = useConnectors() return connectors.map((connector) => ( + ) +} +``` +```tsx [app.tsx] +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { WagmiProvider } from 'wagmi' +import { config } from './config' +import { TokenMetadata } from './tokenMetadata' + +const queryClient = new QueryClient() + +function App() { + return ( + + + + + + ) +} +``` +```tsx [config.ts] +import { createConfig, http } from 'wagmi' +import { tempoTest } from 'wagmi/chains' +import { KeyManager, webAuthn } from 'wagmi/tempo' + +export const config = createConfig({ + connectors: [ + webAuthn({ + keyManager: KeyManager.localStorage(), + }), + ], + chains: [tempoTest], + multiInjectedProviderDiscovery: false, + transports: { + [tempoTest.id]: http(), + }, +}) +``` +::: + +## Use Tempo Hooks + +You can also use [Tempo-specific Hooks](/tempo/hooks/): + +::: code-group + +```tsx [tokenMetadata.tsx] +import { Hooks } from 'wagmi/tempo' + +const alphaUsd = '0x20c0000000000000000000000000000000000001' + +export function TokenMetadata() { + const { data: metadata, ...metadataQuery } = Hooks.token.useGetMetadata({ + token: alphaUsd + }) + + if (metadataQuery.isError) + return
      Error fetching metadata: {metadataQuery.error.message}
      + if (metadataQuery.isLoading) return
      Loading metadata...
      + return
      {metadata.name} ({metadata.symbol})
      +} +``` + +```tsx [app.tsx] +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { WagmiProvider } from 'wagmi' +import { config } from './config' +import { TokenMetadata } from './tokenMetadata' + +const queryClient = new QueryClient() + +function App() { + return ( + + + + + + ) +} +``` + +```tsx [config.ts] +import { createConfig, http } from 'wagmi' +import { tempo } from 'wagmi/chains' +import { KeyManager, webAuthn } from 'wagmi/tempo' + +export const config = createConfig({ + connectors: [ + webAuthn({ + keyManager: KeyManager.localStorage(), + }), + ], + chains: [tempo], + multiInjectedProviderDiscovery: false, + transports: { + [tempo.id]: http(), + }, +}) +``` + +::: + +## Next Steps + +After you have set up your Tempo with Wagmi, you can now: + +- [**Guides & Examples**](https://docs.tempo.xyz/guide/tempo-transaction) Follow guides on how to [use accounts](https://docs.tempo.xyz/guide/use-accounts), [make payments](https://docs.tempo.xyz/guide/payments), [issue stablecoins](https://docs.tempo.xyz/guide/issuance), [exchange stablecoins](https://docs.tempo.xyz/guide/stablecoin-exchange), and more! +- [**Tempo React Hooks**](/tempo/hooks/) Browse the collection of React Hooks and learn how to use them. +- [**Tempo Core Actions**](/tempo/actions/) Browse the collection of Core Actions and learn how to use them. diff --git a/site/tempo/hooks/amm.useBurn.md b/site/tempo/hooks/amm.useBurn.md new file mode 100644 index 0000000000..bebbdb9cf8 --- /dev/null +++ b/site/tempo/hooks/amm.useBurn.md @@ -0,0 +1,85 @@ +# `amm.useBurn` + +Burns liquidity tokens and receives the underlying token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"f352a044790f8cbde9e59508d0e42c0dd85e637c21507c3fb59ad6574684cfad","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKREzzipDAAGUMIkygZBHCBWS4pkAEKFktl6xwgBKOibABUvAAeADCKRivRqCX4kAA7mAAHz+ETiXQAdkXsl9yiQAA4g1odHg2k3S4l/CYzEgAMyx+yOPyIABsyeoXjTvkzAXoTBGYsrRnnEkQG63H1FHXRBvU0EM8G/Y8o3PS942vZxgUXB9MFTPR0z8LN3z0EVRm2ZhmDnD0pANVdgP9C9qGDXc9BraDT0QSjbCvRNECNM8UKfdCXw5bM9HiRJLlSOsYEbItD2sAchxHTgx0nGdgnGAUdDIOAAH4Kz4KsazhESxObRI4QABXsZgVImKSwGHapZLAccICnacuh4LS4GrAjdIbA8W3bTsix7HBLOs0c7Pk6chjAZS4HSawgT07yjyoakFn0LTYnYQ5SWIKpOBMABHOJGCgPJXhiRVlR2NgIBkBEwCGAA5CAaDKLt8EYWV2ruOAW3wRVIDrLE0uUUQuAnURpnS0hOGUIE9lEMA4ATZI6vOCBniBUxrBkOJYCga5Uh2NoZDmfh1pidggSONAmxynZTm+TI4Q5UQuSQHk+VoAUNlwKgAAN/vyWghlwsUJW/OUFSVVUxoUZhGHxGgRk1FaBKSK4AEEsCwYJomAIZOE4XMFq4CVmDpEaYBqdqjPkYqDnlABeFzDHc2svPElsca1AmrqbcF8YJzhe33HEUgFwX9v7ExrH4BngBxzgGfC1IJcFsmLhgYI8ZV1XBZE0guwEeQyhVCxaBNawLDha2OhgGIzXF3XOCKEwoBG9hDf4Y3VTNi2rZt0QOgdnWnfywriswMpVAsMAKEd3W0AgE2zZiGAYCga24VT2Bg6duVLRDgnXHj2p2sDuQoDl6naaqYuQ+V3WO2YXxOAAGUYAqipKx3e3xEXE5nAWC7r/7fpdCheSUwiqCn8zZRREz4zMpw3PH3leaLIxlguZbMrgFY0Ce113QXKRALkcikGBGMqJ3IJ4o5xLjBgxi4ITG8jWQjxHzQnwM147CIAib5n3I/awmkWY6QfgZVsHZrr+T7IOKyMk5IORnERU+AZJCkSAn6Tc24IJ6FATA+i5hbxvwQkgCwnFf4YVfDQQBilFQ4A4BgaI6sKZlEKOIRg5d4DdASq2ReykV5BV6NOGoEAsBCXUmUbeFMADy0jlpwF7NrCWZxYCkDKL9M2AASYAFRa6/QANyO31p7b2ujaAGKMYoVwpjHYuyKu7A2RswA6P0YYvYxizEhwFBABIaAsiZDcV7Dxzxej9D8RLAJQSABqYQXGJzCd7HofRzgxMFmHLukdIkZLQFkgmidPE2O8fsBQDiimZViusNALV4wLSWikDstTpF+PcJwesgIACipBFQGy8DUYhEljKmTnmIhQEjbL2UcpwAAPrZWAw4zBQGiErZ2EAir+GSngVqQIOFCViAkNGqQMCBMJvNS5MgZCcAnHkfAzseF8NlInaalQFDaCmjNTghzd7zT2lIoSYQZCvEIIYfa2woAR2WmEa5MgAQy2uMovMT0gyvRQJPUy/giiVBeZwFE+ynl4qOlsCAbQABWMBHDTTWukOAry1o/N+n8lIAAxMAv0j4TxAFPfwQKVFwhSMWOI1hYoMoJZwVqnVUZHPuTc2IjAjh3PwPIaaqrfnkyOZ1feYr4BwHiLcgFdzGAKo6JKBl6d1UHK1ctFUspTgH25Vipe/KUULSFWAPpAzJXStlLK3e8rbnDmVYwW4PzWWfESIE84qltifH6RlY1Qb1oWsyHtH5ZABnOt5diqgArUXCp0GgCuvq2r+pOXK01walVAgnKq1IEbbVXE6jAB5TxdXioNSsUFsQdC2CtRleQuYglxquVmpNYA9rmvpemzgbaZrfI1W7MQ1wpoTtIDmo4zBxCCH8CiAAkrcc5cRfmiC9pq1Y6w5CZQKvAfINRfrCtFV236JqFUhqBCkXtogYhOGtblCm+ZrAgs4CetUBzRCwFqiidGCqfkgZuYi06Aa8zgifSWF9+rfqPpSN69gOHOAYeLMWiuv1ojiCBEQLZe1UMLRqMan5G9VlPO2nW6tqbeiQCOBnF0boQC/l0CaSiF88F3gITREAhyfrPwYuQoBcZ37ODcN/VC3g6EAKCEwqRZBMDRByRHDA3QonnAwX+I0wIcGiZAtIW+hDn6d0M6QpAK4FMsQ/jQ9TPEsJaaSREaIYYZTcLY2UOxNk6gNBkJiB4HRSDOXSf0YGn4xhSnDDMDEeBlhXo2CSWUOwwuZROPAGEI1d43DuDFp4Lw3iMA+PO2g3wYR/GeICEEYIIQWChD8WEtVkRogxGUbEuICREhJGSCkVIMS0npHkXLzJUsymehi96/JBQyZBiTSUExdT5AhmVKGaoxvIyGIFvUhoTRmk4BaK0+IbQmgdA9p0x8BPETYkab01n/SBjs5J07EZZPmFc8xeCrFgQcVU1xP+mE3xaZODp1h0QSmcAGCAM2i5jRQDPKofs1hby3jPAafsFhVBniNJId7ogzxtA3AaA09ZrCSBgIuVQkhVAxAsG0HpbQ2go7M0J1QN9PtICNBJoIidnP/goaxI0nnnz/x83gbTLC9OyVCZYiJKPfYWEtg93Xev9cG4sLzk+f4zwWBE2uf0tnwKSYse4iXtngdKeF7L7i8uYeK7h8rthrHkke3cWUTX5tteG9D2H+0wJjcvcwWeW8IvcEgUs6LvAziV3+/CRL77TvKFsVd1D+hfFwBRRikCYB1UYBDFxYTPM5eyhILgOXnZGW9BEt+mXuQb7m5QBWECOHxJYB5fKCKG9sB9yfJyu32adguA6pYKa8QtLrVDAAFKiCKMWawlRpHV4WuX351K7C5DgMqPvRUrXVYnDANozxFQTlCW5LURKu89/q6KXbaAJxrWitSsNjBrDV5GG6yaC1AACpOB0YiN69y830toIhZR7llB99lBoBZRdVHkIgiNJ84RjoFAcZCM28a85A4QN08D409oCDd8iCxoixSDhouAQNUhzURIM01oJxKgaBF95pXhGpoMKVUC9gYABRaowCICFBjoARbkKCG8O9OBTB5xEhS9pIFBCwrU3k2C8hZo1pkBfo4cu1yQ0BZg6RfpnRgghs8REBCRIBYA+ChUtBJsaQZAgM0AkQiAjQDQ4RaB8RRAsB4ZdD9U4RsRmAZAABiPwhlEQQw2EMgoYbQsItyCIrNYw0wnEcwyw6AGAGw9gBQewuAfERwmgEQFwtwjwrwnw5kRUPQwIkIuIhI/peEKVDVMQ8lOFKQ6Ay5RguKOdBAwgOkWQ5LHKZlKw0oSfTvaAHvXrMAAAfRAJAIAHVxBchFAZjJiWpGjxC4VJ9rhKVqU0B7UkDCAoA8tlUzB20ppgF2oaBzhQUhhupEheoUhAlZQTAL0fk2hb9QlwCjID1XlVVXhThSRSUahuNthlUZpXhziRAYRrjIpbjbA+pHjcpGAL1QMmpVUpoeCYA4Q+DdgjgBQ3JOASMp8gRtDIAOCrg4jOAD18QFEkizCRshjMi7Dko8inCij3DPDvDfCKj/CqjgjRAkRSSYAkQUgkQ4ikRkhohzpSAhhm5Q0rJ2Ad0hIJielPo1tVcBi1jmjJCRjEAtRR4+ChgsCcD9RVUblWD2AZAoAVRIg/FrQjJ9h8hBsYAzS7kLSoAag3kIjAlBho1KDMTjSVRTTjpOAABSOAS7FUT/UgS0602027e0/oTEIM806M90xfL0ukQ0wgzEkgswCcTgfDUgfUWY8FPEGoBvZeNqA4AEPaOwLGeQdOa0m0m7TgBM84WUDdffBlF6IEY1ecJFOaWKdMgwrNXUsAa0AmQssoEsvgMs8oJUHQKshQFrWs7wnAVZFs2JLgZAGAF2Z0UCAMVQTcwWEaAkzfOpOEUgBIA9MAP1JBBhLgYIIYxAIgZgAMUnAMDcAuCck8rgBRbYxwS868288te8wIcEZ818xiCwSQRiL848gmU858/oMgSKGQcouYfVfEOgalOkZaRAZcLBBC7Ybc3csIZ0JENgtcsgO8N7Yi08simQDfLfR85C2NIsMIDCrtbC2gXCoSAi28O8Cwb827Lc+4dIxAFCji9CndUwbCl2SYsLNiM8RiLUYBLgSKMyRWVUWYjjNsclOQlIFUPxLA6gsAYIX6VEeaL5TgAxTSmAVwAAQjRGsrIEcvIzjNbIdMxCssUCeF0oVX0p6F3zAGct8q+Uco9K/xHP6SGFHi1BVK+hvTrA1KBF+igJkNgIZTHLiv+gNN9PzG9O0pDGLAEIFGLAXMIAnBxhMrzC4CzWKp0FKtxOYAqrMiqpqqzOJl+QwAyqBCZjzJ32kMxL6uCG9JqCzWbJWmYF6uzOwIgFwMDOdODKjJjKmrtO8qdJdNWrTLeW9JlNmr9PmsWuTNDPDJqEjLdNjJbLbMdKxGWpTMtKiuuEzLABmr6uIMTSLMGsLOLNLLgHLIXOUByhrKxGotWSbM8tusxGQCnM4BnKkQBvnMrJBqgzBvrNWTdEXyzTUrqvuGUm0pVACtuSCsMrAGMoOo+rMosvCqeDsuUicpcr8tIHcvWvjM2qZpsuJs4FJpCrCtcpZuepxs5X+iW25F5EyBk2QAb0LFihMLpIsPxD6GUDiDaDhFzGYHxAZNyKGL7nEKJGKM8JMDaHxCwL4MiD4xN09CNHPktxc2Tz0En0zyYkUxz2oQh1oW8w9z0GCErOgGiA+uNLMm7O0A0njQwBqEzgLTQuEWYExC4OQGdGcmoyKnBAAGpgRrgMxjooMLakpm8QBobF9foMy0A31uj7gYAJwTxMTOAss1hvoQTlCzJ2z2jU1Z104agK6ZohgQ18xmDtgfje9Kgd1SBXhg7FptAyDtgFUoMYUUg4UB6MD942gRA8g8KxYwAXYShUC59HDvktCdCHSYhggzxIhaSUjFad0wBFxbDsiTw4hPDr7RSezcjr6zxyj+gYg4QzwAi0AgiC5ggflgxWgYQjjeyFUO6WDOBtC8KaopTFS8D5aUj6T0jGTsjmT8j702SSjOTptTU/6gjgi4GEGRpSHnDgwoh4Q9S8q4AurgMY0uAmZVBaqjqAyR1zgygQyrSagOHYQoaOa+Go5nrS76Hy9jr9QhHLs+G2avLEyyghHOB1BhzIjcrfotRCSYHfo4Gs4FSRokHkjhtFbta76ciWSCjnDXD2TSj4YdHeSSG9G0ByGkRKHJSMpZSNp5TSBFTlo0UqJlsJbNoZMiArZgQ4RQQLBLbo8/wDRY8yIxNKIbcggcDnapcbwNw88NMFdHa8aRkWwIFtIPJoFRk4FuxEElCQpZl0ErakADRbwPs7bJcfsgg8mn4a6r4Xb3NnAzwv4UwvN3cHzPdmFdMfcV1RAyh1FBZNEaKiMvEwsqlzE1cA9Zmyl5nHEQ5U9XF1dSlbEfF7F1nYlm4gkQkyBtn8lolHY4lzhElXYtnlmEtMlHYDMSpjMClqkkdrFdmKkFmQ4jg2l6kpVGlFpTlWk212khh5RFkEhlkowoAm95g9kNVHD8xO19VDVe1ThqoSA9oxnJoANI0JihgiVkWuBUWGV0W/j4AsWrVcWpT8Xm0wBCWQKgQSXygsNyWe1KXpDsXagRodg6Wm0d4UgmXiWIhSX2Xu0bkuXqWcW+W8XBXSthW+dan0d4mQIcEkm8AxnUm3MQcbw6nMmvbBmfavcRmKMjnzgTnUkIkHmuAoWp07ZYXlXEADQNwrAE8vswJqIggrngklmM9IwGIwc0nnBVAZcPb+nodjWi9g6S8hry9K8F9J869sz4WUpW8Rjfkxib1T8B8uph8gRR84hx8DhNi6DZDd64Z97F8e6wBV919zzt9NizJmIj8T9FR+9z9XhL9r83iHJ78Jin9s2gQoQOBXlP9ygcB6hhx/8NbGt2ycqwARDIDsyYDkX4CHl9iUC2XbBB7MC5rjTz7H0sCSDz7p7WiqCFjaDp826mC501D2DNDw7OAMSsT+CWrhDwDOAmiJD92/S305CxAFCd9rIVDoH1COC3lYjuSGV9DIiL6jG0jrC3IsizGsHCirHcGyi4jCHqiYOGUDDvSKMp0Yij7MLYPajSAEPUita0GUOmSpt0PLHDabGuKeT/68PyOCOtE4s4QGigQf2WjM2GDU0B7uiiqNtUqiNnzM3n8iCtRpi5iFiqhljViBP1jblNjyUqVHA9i/bDiQSgQTjF0hqLioSMAbiep4SBpniiSb9+2nh0Yvih6uWAS5AgSk1QTfjTPISriLOYSrOHibOkSIHblUSnhX3sSKhBC46+PNGfkSSmov1UgKSqSaTkHEPaPkPTHMHWTMOOTsP8PcO+SBSkvhSwBRT8PxSIA3HpS3qLpZCvGfHhWErVTG6UqDgflBPtTV3F39S6GCrxGAzTqdrrrxz2b5H7rtq3SRHCPXqjSFqTSHqzqIzRvZHoatqVqZuVH9rBuiDcyq6Cyvq/rZykaKzFzUbVyMbGzIh1vvL50vquzJ7eyp1dgHBTpByn3KOxyfy4aEa5zzvgbqy0a6z1z056LSK9yDzgQjzxvVZTzmKLyrywAby7yUgHyIKJKoKwcjRPyRL4e/yALD5kfUfQL0fwKnyse3yzdYKzx4K4exK2KnA0K2OGUeK+L8LCLgRJAIeYHGKKKqL6ztFBKjQjRefGLEft9KfYBJL2KWe4j2frAN6PFFxBLbxhLeemfULOLZLxzGLFK9mFBlLVKVp1L8atKmYia9KDKQqKa9vMTqbLKBbbLgB7LGbaaWaPKbqOaPf4brfgqG9QrOa3LZueO1HWukrOipP0rV3CZ12+vaH6GuAiqmYSqyrWrKqHJOqCr6r+lGq0BmqYu2qYAOqpqzf3rsztLBqsDRrxqHu4s/FKaD3FulrpvUyxuNrJuRvtu9rXqK+2GW/TqwzVurq7uu/ludrnrdv+/hrPqBknzDvfqib/rAaUbgeruwerTbuBHJvYavrpyV/kaLv1/0bN+sa3lhak/zf+qdL/eya7eZ/xHHfff6azJ3eBbWad+F3g+ppubebA/+azNSKtjVioi0x46KcWgJjTj+BpagSUgHLUMY0dla+AVWurSVBZcMiOtdInrXJQG1rGxtU2nNXNpRNBMtTSQK5iFwEUHaQCVNoG2jA4Js8rEd2n0zwCch/A9lPACkxqYutyBarf0O62jagtasVqfWLSnCSYgw20ccPHaCdB0Cr4DA12kwMNYDNC8vtRcv7U4CB1FuE9HsmHS4KR1rY0dMILHXjpgAMAidZOjRnTqZ0XwOdNZGmzwBF03kJdObmXRNSIE8yNdPjvXWvS9ktAoDVuiJxnRwFO67gx5LWz7pcAl6Q9NICPXEDj19UPZaeqBjnqzYF6tyaIWy1XprBroQkRNmxkrbz4D6WjE4F/VPrn0MuWAK+vNFvqocH6T9eaC/W0Bv15oH9UoecG/q/0qigDYBv4Jbq7ZKMM9W5FA0XywN6QujbxvowqGIDUG2XVDrlwsY4MCutjcYfY3pDkNnGrjahitH65X8+G2lFhmIyILsNGGXDHhtXiCRj9v+ijZRp6VcFHD/SLfKRrw0YZXC7qNw0Prt3iorRNGYwghuQwMYK0kOmAnLoxzy4sc8GdjDjsQ3WGONNhWgKIHiw8aNdyGvjMWm9ECYKEcUoTcJnaBIGvZo4DTS+K/GaacCFqmeBQV003DKCo2heM3q03ATMxCmbMUSIIl8jwJby5TZBDZFQSORnWJOWzJQMAiasiEgiCkSG1qbhsWBbuWkYwlNYI5eWYgCZo7GmbaIVmXzXxIs1ObLNPm5STURsySRp5rWOzPUfs2qS+srWZzW1uaItZoAbmfuY0ec0eYhxnmeSa0Y7A+ZzNDePzCWH8zBYAsuwQLZpGACEHgswAkLJZI61WQOCW8SLMVjuy7QUs94MrRUfywygKslSWoIlnGJRYSskxmLGQDy1pbpiNUBLLMcy0Ay5i9UHLKVsmMLE0s5WArUsQyxFY5jxW1YyVhiypb1jZWq6JsTaiFaMt+RrrPgbU2oHas5BAYSkXq1DbAgaRBeOUcMwVG+t7RRoq0SZjtaRiVk6cfkaoCsyNMTQ1AlcYaLuYBsAc8giUaBF6Y/xvAbAqgBwL0BcDomugVQKr1HGWBsmIAIQTy02YpIxB8gCQe9mkEyDM88mRgTeGoT8ZcwsAD8G/nFBMjZQ8ofbMqEjIvQ4YCMUkGwGRgbZ4Jf2RCZDBQnqhmAx2HPgWDATaVvwrMTyKyLARcwVo1ofsKBhZRaoYAAHVIPdDzBPtRBwY8EJiQUB8d+4VwLaH/n4A1AEGWQuGAymWgFwGRcIaTFrAFiuijMW2VkGdlBBwhVAl2YEF+TjgqwkcpsWgOjiNCY5scuOfHITmJyk5ycqgSnNTlpz05GczOVnOzk5zc5c4qubUeEmTjB4dcwEvyQ6Hcm/j083sAyX7H8nhTgQwcVwAXAeESMVQ34kQR8UTjiDEAl2WSWMzUjuRGGlo9xAXAW6LUEpe0IKQfRSlpS2RGUrKQkhPEpJ1cBcfwMvFEBIBQAgQACctFYEIBXArgIAA==="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const burnSync = Hooks.amm.useBurnSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +burnSync.mutate({ + liquidity: parseUnits('10.5', 18), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +console.log('Received user tokens:', burnSync.data?.amountUserToken) +// @log: Received user tokens: 5250000000000000000n +console.log('Received validator tokens:', burnSync.data?.amountValidatorToken) +// @log: Received validator tokens: 5250000000000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `amm.burn` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const burn = Hooks.amm.useBurn() +const { data: receipt } = useWaitForTransactionReceipt({ hash: burn.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +burn.mutate({ + liquidity: parseUnits('10.5', 18), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +if (receipt) { + const { args: { amountUserToken, amountValidatorToken } } + = Actions.amm.burn.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `amm.burn` Return Type](/tempo/actions/amm.burn#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `amm.burn` Parameters](/tempo/actions/amm.burn#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`amm.burn`](/tempo/actions/amm.burn) diff --git a/site/tempo/hooks/amm.useLiquidityBalance.md b/site/tempo/hooks/amm.useLiquidityBalance.md new file mode 100644 index 0000000000..8412c2c6cc --- /dev/null +++ b/site/tempo/hooks/amm.useLiquidityBalance.md @@ -0,0 +1,42 @@ +# `amm.useLiquidityBalance` + +Gets the liquidity balance for an address in a specific pool. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"8ac7e459f30e286677d1cb839aa57883a14653c6b8b3bf03624ebf676bd6cacc","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: balance } = Hooks.amm.useLiquidityBalance({ + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +console.log('Liquidity balance:', balance) +// @log: Liquidity balance: 10500000000000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `amm.getLiquidityBalance` Return Type](/tempo/actions/amm.getLiquidityBalance#return-type) + +## Parameters + +See [Wagmi Action `amm.getLiquidityBalance` Parameters](/tempo/actions/amm.getLiquidityBalance#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`amm.getLiquidityBalance`](/tempo/actions/amm.getLiquidityBalance) diff --git a/site/tempo/hooks/amm.useMint.md b/site/tempo/hooks/amm.useMint.md new file mode 100644 index 0000000000..41f5dbec84 --- /dev/null +++ b/site/tempo/hooks/amm.useMint.md @@ -0,0 +1,84 @@ +# `amm.useMint` + +Mints liquidity tokens by providing a token pair. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"4fca6eaaab4d04b51aad961895f40c6a81566cafdac628c7923a2a2603d064ae","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const mintSync = Hooks.amm.useMintSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +mintSync.mutate({ + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userTokenAddress: '0x20c0000000000000000000000000000000000000', + validatorTokenAddress: '0x20c0000000000000000000000000000000000001', + validatorTokenAmount: parseUnits('100', 6), +}) + +console.log('Liquidity minted:', mintSync.data?.liquidity) +// @log: Liquidity minted: 100000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `amm.mint` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const mint = Hooks.amm.useMint() +const { data: receipt } = useWaitForTransactionReceipt({ hash: mint.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +mint.mutate({ + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userTokenAddress: '0x20c0000000000000000000000000000000000000', + validatorTokenAddress: '0x20c0000000000000000000000000000000000001', + validatorTokenAmount: parseUnits('100', 6), +}) + +if (receipt) { + const { args: { liquidity } } + = Actions.amm.mint.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `amm.mint` Return Type](/tempo/actions/amm.mint#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `amm.mint` Parameters](/tempo/actions/amm.mint#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`amm.mint`](/tempo/actions/amm.mint) + diff --git a/site/tempo/hooks/amm.usePool.md b/site/tempo/hooks/amm.usePool.md new file mode 100644 index 0000000000..c9f8217e6c --- /dev/null +++ b/site/tempo/hooks/amm.usePool.md @@ -0,0 +1,46 @@ +# `amm.usePool` + +Gets the reserves for a liquidity pool. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"a5e2597c7cc0e903cdeee24bcbbc6a915a731be45436f6ef363478a4ecfdc54e","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: pool } = Hooks.amm.usePool({ + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +console.log('User token reserve:', pool?.reserveUserToken) +// @log: User token reserve: 1000000000000000000000n +console.log('Validator token reserve:', pool?.reserveValidatorToken) +// @log: Validator token reserve: 1000000000000000000000n +console.log('Total supply:', pool?.totalSupply) +// @log: Total supply: 1000000000000000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `amm.getPool` Return Type](/tempo/actions/amm.getPool#return-type) + +## Parameters + +See [Wagmi Action `amm.getPool` Parameters](/tempo/actions/amm.getPool#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`amm.getPool`](/tempo/actions/amm.getPool) + diff --git a/site/tempo/hooks/amm.useRebalanceSwap.md b/site/tempo/hooks/amm.useRebalanceSwap.md new file mode 100644 index 0000000000..54b76e86e9 --- /dev/null +++ b/site/tempo/hooks/amm.useRebalanceSwap.md @@ -0,0 +1,84 @@ +# `amm.useRebalanceSwap` + +Performs a rebalance swap between user and validator tokens. [Learn more about the Fee AMM](https://docs.tempo.xyz/protocol/fees/spec-fee-amm) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"20c09f8cc1ff08a8faf46184bc97fb05274d872847ffff372666aabccf7c9bdd","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const rebalanceSwapSync = Hooks.amm.useRebalanceSwapSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +rebalanceSwapSync.mutate({ + amountOut: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +console.log('Amount in:', rebalanceSwapSync.data?.amountIn) +// @log: 10605000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `amm.rebalanceSwap` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const rebalanceSwap = Hooks.amm.useRebalanceSwap() +const { data: receipt } = useWaitForTransactionReceipt({ hash: rebalanceSwap.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +rebalanceSwap.mutate({ + amountOut: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + userToken: '0x20c0000000000000000000000000000000000000', + validatorToken: '0x20c0000000000000000000000000000000000001', +}) + +if (receipt) { + const { args: { amountIn } } + = Actions.amm.rebalanceSwap.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `amm.rebalanceSwap` Return Type](/tempo/actions/amm.rebalanceSwap#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `amm.rebalanceSwap` Parameters](/tempo/actions/amm.rebalanceSwap#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`amm.rebalanceSwap`](/tempo/actions/amm.rebalanceSwap) + diff --git a/site/tempo/hooks/amm.useWatchBurn.md b/site/tempo/hooks/amm.useWatchBurn.md new file mode 100644 index 0000000000..01b1bb2158 --- /dev/null +++ b/site/tempo/hooks/amm.useWatchBurn.md @@ -0,0 +1,35 @@ +# `amm.useWatchBurn` + +Watches for liquidity burn events on the Fee AMM. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"1eb67ad9a75d59810fdaf0024451c348d0f712105fb6fc09eb9c9df760ca27f0","data":"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="} +import { Hooks } from 'wagmi/tempo' + +Hooks.amm.useWatchBurn({ + onBurn: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `amm.watchBurn` Parameters](/tempo/actions/amm.watchBurn#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`amm.burn`](/tempo/actions/amm.burn) +- [`amm.watchBurn`](/tempo/actions/amm.watchBurn) + diff --git a/site/tempo/hooks/amm.useWatchMint.md b/site/tempo/hooks/amm.useWatchMint.md new file mode 100644 index 0000000000..d55ace11d2 --- /dev/null +++ b/site/tempo/hooks/amm.useWatchMint.md @@ -0,0 +1,35 @@ +# `amm.useWatchMint` + +Watches for liquidity mint events on the Fee AMM. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"dcfbe669423c1e67e1fd5bfc996004b53912d26ef3dcef6280d135f90c3df485","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.amm.useWatchMint({ + onMint: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `amm.watchMint` Parameters](/tempo/actions/amm.watchMint#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`amm.mint`](/tempo/actions/amm.mint) +- [`amm.watchMint`](/tempo/actions/amm.watchMint) + diff --git a/site/tempo/hooks/amm.useWatchRebalanceSwap.md b/site/tempo/hooks/amm.useWatchRebalanceSwap.md new file mode 100644 index 0000000000..47927c2124 --- /dev/null +++ b/site/tempo/hooks/amm.useWatchRebalanceSwap.md @@ -0,0 +1,35 @@ +# `amm.useWatchRebalanceSwap` + +Watches for rebalance swap events on the Fee AMM. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"a65363a61410810306bc28a64110f48e977141b2aff31cdee698fa19287f0ab5","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXKLMzFGaugAssUmKykj9GVo6eO2deWZIRSC29o5+iABsVdRetb4NAfR4AGYArmCOjBBgnIdwMADqomi2AEowAEaiMqInMADKAO6iWAAPABhc77RgKAB8AAosPZmDoyHAAPyITjAAA6F04OIWpgAklBUZwwIdmC8yJwAD6XMCwcFmKAAbixOJxmRRaMx2LZbKuZAAKgJ5MSAAYWWgAEmAIlIpgUrlF1M44qlMrQcsUiuQAF1laSZDJlcd6flmazeWyiO9GFB7uwhfwRWjVdLZfLFcrXerNQrRbr9YdDca6TAGTBzTzLXB/lgcKQxRK3RqPUqad73Vr/XqaQajTSTWGzSyo64Q6bGSXeftSBBmAAhGQQaz8YkvCGmLgF0PhyO884AUVItYTaOh0LII7RQ5HAEpOABeSGcIgQW3z7sViPlouVi04tiG4kaw4wHe98/F/ecQ8mRT4sBOa0yYmk8mUze77ef3tVtnnZ43g+L4/gBYlxw5NF/gefBAPeT5rB+WMADoAEEtDgChOCbBQoPuJ5XngkCUIAGQgBR5yXFc1ygDdaS3Ps+WuUhHWdThWLAQkAHlSFQqAoFIeA4EvPco2fW17RY4UwGJDjuN4/jBLgYSfyvKNrDBCFiVBMBwQUESIz/HF5FEF45CJNEXj4ORPgMqA7JLVxZzRVdbSxMB2ngOFEMua47hguDgMQ0CsH8KBmwQPQck4fZ2E4aDbHlThBKAhCzxjAFOBgEhHzgZD/DEBRIuQZAQDodosDkfxRRqtA4FoLEQladFwkMTgyxrOtOAAcn+BRmEYAB6GgWm6rEsSOE40DOC5ULjaF525HEcjyyZkP5fyCNS4iAWhJb/zAQK0pC6EOUW69cXOOAIDkZCcOhbqjq+TgMqwRBuqws7r3cC0nPG7FBLQQ5SAuQEoEYIhIU2/Akti0hksIoL0tjPLkOQwFBvByGsVcLEatFEAdQoUq4VKKYQFJzynGEgBaTgAAV4URUg8sJomQGiCREB6RJjGSIZEAKABGDRMnGPQNvw2DEeO2N/DvQpikWcpECFyoPA2Go9DqPxGj2PRYVreNMHnACZZ2rBwNOjC8IC83gpQ9CiqwnDba2oiHYBZCyIoxdl1c2i7LCiK8GBd4ZDeFtODQCBOFMVcnXi/B5E4UQEe2nzXs4ZtrGB1nhG6JB4hGORBlSIX0k0LI8DNjOkIBeX8mGJXSiWZwCnWTAtZ8eoCqaA3KYRJx50g9Fr35KSnTAF0kx9VMjJXG07Rjyf5BntVMz9BfXvjdfk19RUF/aCBjjQB9LI7R8j+YE/Hy4w40AvhRO0croYikEW+bLpAelFsYgg5I3GYiARgLFbirAo6tqjeB1jsGg+sQCwiZsPbC5E3bSzriFb25E35c0kLzUuKRm6jGrnoHCQDzCgJKGUZYBQ1gay7jA7YfcEEeQRHAbyZ4NJgGunILE1p4bcN4TANEOlhHB2sJFEAApk4qiETdGASob5QCDGeLAtYiC2ngKnF6IQ5CcFgC8Q4Chn6KE4PI/Ryh7hx2EnAFgjAPjwxjtHZOWIABSohrTfGsHKLAXALFngRAsMAjA4DMBvBorR9kXgYHiq8TgLxay/GYnlf6MjAnQFUVlWgoQ6rR1+LHDhMBrCMHBNYcxdY2BmFyogf6AAqTgqEVRiIUUqawHxlLxUYMoTgQ9CBQFsYcWwqdhKigCXdciC1RRYTGVdBRyFJzsCmanOkci5m3X+CDZZVj/G2QpL5bczjfhyhoNHWOnxYkADloAwGQgAK1sRqGA7RkJYgaU0hQTYgJrJ4a0uOPCxDPW4XpYGhzY7HO6WeZxyBRTqObEJZCIhwoP1FDqaE+A0BoCwHARAg1BqQFgA85C7AFCYwioND4NARA0yIAUHoyFaCDQBENOFiFlLIQxcwGQABiVlQkkUnzQCPOkWIYV8vZUiycqL0WYuxbi/FNyiUkrJZIil9x4BoBpXShlTKsAstrGyvKnKeXiuUmgWAw5ZzIXYrIz5EBvmzN+XINpeyzz8nsr8bphAH5xxaBwJKygzyigJSIgJSjMm3X+gAfTqXUu4IN5SxqjWidJnA7XfICdnF4dziloG6sJPp0BhLiDPGYL1lIhGhJoI+GQGAsRwAwCcfAtZIBXGwowROgaElJOYo0+m+JhKBtiUpGA5I5BYUgPDEtLiYCxMrSIeQaBa1YlEA2ptLaT7CRMIncO2dA3w2ubAe5jzBLtDypwb4MAoWyJhZAU55wInws6fiQaXFpUYqxTivFIalVaBVXANVVLNW0vpYy5lg1TUcrQFy7logaZ3pgDTc4NNTU0zOPOOGWIb6CX+XDZg9wZqvLAFiActAKr6KuAG21Xz3g/OEaKWpxGwD4weVicZ91urJ0NOC9gMgoDdVnCWPFDNNR1TRFxps8VeNQCws4gVD82PrNuRxiTscACkcAPo9QKaQPjAmhODRE52HFnBVNSd0zJs5L1zWCsU0625izSDQjML8TgM4lndRuIQCA2KsLXT6UlN49k7BxnkBGATgmsTCfpqJ4SjnelCVENoFZ9lohRw1A4KFhTzWTkY8JnE7nSBoi83wXzL06w6BhmYoLpmAQ4EZFFwzvJrHIGyu8HUaRVaqEa5aax3jfFoGQqQY4D4ZGhJ0vArgzmbmICIMwVWsQCiqwAByzh681rgXFs25qGyNsAY24ATcCJwabsBZvzdiBYSQIDVvrbZNYkNiBOxkA8jICDBqhKDToMUh+M1EDxHiKrSQd32RcFa8+HUNNjl1bIKsQWBQQepy4G1mQ/XGB+JO4957IN3jvafQB77udprnH+ysVYFg1tgHy/drgWPHwvdx/h0wX3nxRs3oLWIID/pCNp55RcPUbgOKNI8e1phrpgG6iWcZmywDQlFAAEU+NoeG0o2EwFcAAQk4IrxQZANeiki1TwzMXjNoh18rzggvgwi/bL8sAWvzd69k9li1pA8Y1X+qR8jbq7FmK7aKFpzrzEdJxf9FjcA7MiGzj6hcaadDfCee0b4FXCC/AWlLq6yPhz86yAn09zBk8IlT+nyPXBmAYED2eWPLmKn2eQpX6EgqsKTkN1hivSmJkKAemZnTenDfRdi+JmA3HzN8ed9HtAbfK+d+78PyTGmtO9Wk/pnrJuammbnzxiz4/bNgHL9PxzzmYCucKw9ErPnMLlYC9V0QwWYeMgiwZoz6/kCFeK95sr/nKuBdv7V0LjIiYrNJxudM8SQ+dY9PMhdOAbcxdzhJcp8O8Zc5dHcVdgA1dNdtclc9cDcn818xNMDdd4YrdhdRc7cHcsDSANdx9gDmMaoCoktipSprhcAqBkBrpgZEI0UP05U8Vn5lBDgXhkINJmAFVCUAMQ1BozJ7VBoQMdUTAXhBpxkHlZw2YC535VYhZP5CEBZeYq5xZ5glMKEf4W4aFnAehO5NhtZmE9YghoRC1A5p97p2E4AksYBiQLksI0ZiU/EZp3hGYyYTMLldRnJqJbQTsABqIWbOeoJsW/FQqgcKSRPAPAwdWOUUeTNAJUT1HpFzBWa1AAWSDGmkqjPEyDJEXWEmsFdRvFXWuEs2yPwBnQmkYBZi4HdRGRnQiRYHEFiWcNcJS1TmDFv3BmJ1ewOXslXRegEJEG6V+3OH4XeFPFsXsUcSszFVE32GhFiFnHfVlXlXwzAHiGJT/TvEOEZQOJQ1cIAwONiHe07H2GQliCgy5Up2hC7TKIRFylThw13ThGUjBU4BhV+xkGQjw3uCmS4NlS/VEJgF/VJUSIA0pQ1S1VA11SGmBOeJ5WBLBLQBxJpjOitTDxqlYxOFAI0lPn51UAzzrw43JMfDRDU34ywjpKFVwMHwqVPjRHUCswyMj3mVpNvkfi0xZP72N3ZJZK5PH15NoNFH+kvTPCBOmhBJxIhJlU/XlR/TymVQRMA2RNkLAz1UGgxONW5WxPYHw1xPNPuHxIwgwzimwzPFMBxMI3oKKiQBKg5lMEQn8CIAsGQiFn9IsAsFUI5kLg0OkC/iIRAT/lIWMBwWmHMF/nmGoTbiQCFg7gYUsJ7l1l2FsMHmZhHhtjHijAng4j3jnizAXnEmXgdGknLM3kPmvB3lhxVFngbNFGvkFPPgSUvjQE7NPnvkfh7NMT7JxlwV0CFkWwGCjKTL0IAQwiMO5hMNTMFlUFcHZg0lgGaFyRahWnahilrHCV6iSwGmGlHTYDGiYxWmQjWkljtkwVjD2gtFrg9nrjehOw5BdnIkomXH2kuhpMmW6kgi0y+mxB+jACcn8CHlECQFAECHkDsXODwDqhAFcFcCAA=="} +import { Hooks } from 'wagmi/tempo' + +Hooks.amm.useWatchRebalanceSwap({ + onRebalanceSwap: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `amm.watchRebalanceSwap` Parameters](/tempo/actions/amm.watchRebalanceSwap#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`amm.rebalanceSwap`](/tempo/actions/amm.rebalanceSwap) +- [`amm.watchRebalanceSwap`](/tempo/actions/amm.watchRebalanceSwap) + diff --git a/site/tempo/hooks/dex.useBalance.md b/site/tempo/hooks/dex.useBalance.md new file mode 100644 index 0000000000..9c1f248359 --- /dev/null +++ b/site/tempo/hooks/dex.useBalance.md @@ -0,0 +1,41 @@ +# `dex.useBalance` + +Gets a user's token balance on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"86f30c8b6ecfcd05a596ac74359c0fbce656e58c96f45bc8cceeb1ce8f608b07","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: balance } = Hooks.dex.useBalance({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000001', +}) + +console.log('DEX balance:', balance) +// @log: DEX balance: 1000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `dex.getBalance` Return Type](/tempo/actions/dex.getBalance#return-type) + +## Parameters + +See [Wagmi Action `dex.getBalance` Parameters](/tempo/actions/dex.getBalance#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`dex.getBalance`](/tempo/actions/dex.getBalance) diff --git a/site/tempo/hooks/dex.useBuy.md b/site/tempo/hooks/dex.useBuy.md new file mode 100644 index 0000000000..90c3694fe8 --- /dev/null +++ b/site/tempo/hooks/dex.useBuy.md @@ -0,0 +1,77 @@ +# `dex.useBuy` + +Buys a specific amount of tokens from the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"19b864958a3edb268ed55df991f577eacfa8b004aba94539562aed8b4486c2ef","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const buySync = Hooks.dex.useBuySync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +buySync.mutate({ + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('105', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) + +console.log('Transaction hash:', buySync.data?.receipt.transactionHash) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.buy` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const buy = Hooks.dex.useBuy() +const { data: receipt } = useWaitForTransactionReceipt({ hash: buy.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +buy.mutate({ + amountOut: parseUnits('100', 6), + maxAmountIn: parseUnits('105', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.buy` Return Type](/tempo/actions/dex.buy#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.buy` Parameters](/tempo/actions/dex.buy#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.buy`](/tempo/actions/dex.buy) diff --git a/site/tempo/hooks/dex.useBuyQuote.md b/site/tempo/hooks/dex.useBuyQuote.md new file mode 100644 index 0000000000..159c4d14fd --- /dev/null +++ b/site/tempo/hooks/dex.useBuyQuote.md @@ -0,0 +1,43 @@ +# `dex.useBuyQuote` + +Gets the quote for buying a specific amount of tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"cb4e5f5fb447a1a65ef7af20e203bda1f35f12b1e876616083f30b47831f53fb","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const { data: quote } = Hooks.dex.useBuyQuote({ + amountOut: parseUnits('100', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) + +console.log('Amount needed:', quote) +// @log: Amount needed: 100300000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `dex.getBuyQuote` Return Type](/tempo/actions/dex.getBuyQuote#return-type) + +## Parameters + +See [Wagmi Action `dex.getBuyQuote` Parameters](/tempo/actions/dex.getBuyQuote#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`dex.getBuyQuote`](/tempo/actions/dex.getBuyQuote) diff --git a/site/tempo/hooks/dex.useCancel.md b/site/tempo/hooks/dex.useCancel.md new file mode 100644 index 0000000000..b499cef4aa --- /dev/null +++ b/site/tempo/hooks/dex.useCancel.md @@ -0,0 +1,75 @@ +# `dex.useCancel` + +Cancels an order from the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"d99005d358f82f6b8da0b324b8d268d476741fc0146d122b7f8fb1d35c61bdc0","data":"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="} +import { Hooks } from 'wagmi/tempo' + +const cancelSync = Hooks.dex.useCancelSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +cancelSync.mutate({ + orderId: 123n, +}) + +console.log('Cancelled order ID:', cancelSync.data?.orderId) +// @log: Cancelled order ID: 123n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.cancel` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const cancel = Hooks.dex.useCancel() +const { data: receipt } = useWaitForTransactionReceipt({ hash: cancel.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +cancel.mutate({ + orderId: 123n, +}) + +if (receipt) { + const { args: { orderId } } + = Actions.dex.cancel.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.cancel` Return Type](/tempo/actions/dex.cancel#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.cancel` Parameters](/tempo/actions/dex.cancel#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.cancel`](/tempo/actions/dex.cancel) diff --git a/site/tempo/hooks/dex.useCreatePair.md b/site/tempo/hooks/dex.useCreatePair.md new file mode 100644 index 0000000000..f85112f00a --- /dev/null +++ b/site/tempo/hooks/dex.useCreatePair.md @@ -0,0 +1,75 @@ +# `dex.useCreatePair` + +Creates a new trading pair on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"30ad47475bf43802763bb99c5cf8fdf2fdf294d49b87a8e6428158f4753de2e3","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const createPairSync = Hooks.dex.useCreatePairSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +createPairSync.mutate({ + base: '0x20c0000000000000000000000000000000000001', +}) + +console.log('Base token:', createPairSync.data?.base) +console.log('Quote token:', createPairSync.data?.quote) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.createPair` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const createPair = Hooks.dex.useCreatePair() +const { data: receipt } = useWaitForTransactionReceipt({ hash: createPair.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +createPair.mutate({ + base: '0x20c0000000000000000000000000000000000001', +}) + +if (receipt) { + const { args: { base, quote } } + = Actions.dex.createPair.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.createPair` Return Type](/tempo/actions/dex.createPair#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.createPair` Parameters](/tempo/actions/dex.createPair#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.createPair`](/tempo/actions/dex.createPair) diff --git a/site/tempo/hooks/dex.useOrder.md b/site/tempo/hooks/dex.useOrder.md new file mode 100644 index 0000000000..c25dcad3ee --- /dev/null +++ b/site/tempo/hooks/dex.useOrder.md @@ -0,0 +1,40 @@ +# `dex.useOrder` + +Gets an order's details from the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"1815c3299836587ecb4ba2019dc58a529df6920eadae785fd12d0d622fd85358","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUWKQQOBwYAJScUKJiiJzAADpgnBmc7LCkAJJQSQBGjAqmaADcaZmczKL8ZEkABha0ACTAIqSmCq6NlemZhXz8ANIwGE0t7Z3dvf3VjHAAQowFnEMQcqJg85lojNb8SWAArsyFZLsZoswQJ2BoRSVlV5ykMLWm3U+lD69hMCIPxeVUyZnowL+oIyiwAYiYsEU+FsdtDOAAzBEAFQOR04p3OlzSrk4AB9OPdYOjTDAoP4oBBrAg9Fj8DBODJRCJOHATtZrPA4OiTjIZBg3vBNiQoHEEqIMexOMp2QBHE5kDAAOjSOrArPZnO5vP5guFovF7zgUtpsrECtISrZnDVGu1YF1+o5XK4xoFcCFIrFEqtMmltvl6MVyud6tIWt1aU9hp9fL9AfNwetMvidsjDujLrjbo9TuTPNTpsDFsloZtOYjUadha1/hE4l0ABZ1MZ5EoVIgOxpxNogvX/CYzEgAEw2OykBxOJAADncnhweEIJHIGkCeGsEDA3OyDWSaOPeTWxV+FTRtXqpEmbQ6aC6ijmaI2o3Gj+mL9mfTRRYVkvZEYG2V59kOY4zguUhXhuO4HkhG8Bgyd5PjAb51meKFUM4AEgWw69XnBR4iJBPC4QRJFNjA1E8MxRgsBxKD8RgokwBJclKRgakzDpKgGSZPAk29csTX9M0g0tLNw3tR1VVjFthE0XRVAARlkXtlDUIctB0PBz3HGlp1nexHD8RB1I7VdqC8DdfG3AJ6CYVh2C4AxBFbVSkAANk0ntFB0xBu00Ec8E8owJ3MGcQFsczF0QKcbI8Oz1z0Tc/B3Fy9BYNgODiOhvPbPyAHYtKC/sAGY9PCvRYFoYzJySsz5ws5wqosWzMHSnwt38GgcpAYUwEcRgDwpOAYAAeVIHIAB4AGED2pBQKFPPDz3yZDXjvE9mifGY3wAvDPzGCZOAO39Xx6E6FmWVYaJRCDcWgwk4LRBD7jIq8KOqdDRC+RQdrRAiQbw0jwfu+EmKeujXkY5jXrY97+lcAA+UJ7GYHQyDgJJIs1BrNROKbZpyTUAAVsdx0g4CWlaSnW1JNrmshtvI3Dqj2h9LqmZ8bvfU7hnOn8Bf/V4gMe9ZQPAtFILxAlYPg25vqhzIAaBhR1YyMHOZQ6pIf1yW4BhxEZdouWGOxZGlY4jHogJ4Y4CJugSbJtnSE1AAlHQTlIMAADVRBkdV5pZ6otsvHCDcyHmxaO27XjO78+cOv9jpN4C4at6oFbe5XPtVpDjbRTXMOB0u8L136ubBQIdc4KjYYt560URljFfYj7OPRtIwBueAsAcdlSZmz36UZZl9GGeSR32RROG2LJPYAcjgQqxEYGQN/RcJmAUleck/TUBtEBRmWQZAQDoG4sDkfxGiftA4FoNI8vc5IeGdzgST3iAD6rwAO7n2YIwAA9DQNyq9dQjTGhNAAglgLAwRYgR04PuQ8XBgDhnWosAAMhAUQUBui/04AAXm/oYV2tB3bjxyMEdBGQo5JHUlOKqYAKCglcNEXUMJ0ScGCAQohJDFCxHeGgf26R5okKIOjQhxDuiamUfNcBsi+4DAkVIzgMjGByPJieYAAApAAytNAAcpqROjB0QYGCPWaIrhVHqOJGkJ+jQQAAF0KDX2HvOZg/g/GDycBvAAtJwam/jaYuy8T4kAWiA5GAAIpKWDCKLgQDGDKEPueTegMd6n08d4kAbYJCIFKgFOQlVly1QMnoMeBinLRVMnFOcC5LJVRSmubwmUnKDSCKEcIkRMCxBYfrSewk9CNM4LkAAIkqCAMZXTFTKUuQcgU+xIHKtQYcdSQBRyauYGqrSEqWSnN1eyGVHIDV3HoAeOM4DDwFBgg8IYYBpCIOIF5h5aJJGWj8h+gkp4iSdI0TBbzGg1GgCKdkYRiCrHgEvHkeU5CFUKCcBQvwFDfLeY6BITcN5wBYNvL5aBFnKjSEY0QnyTHWC6FgLg4LaI1BgPFTCcAD5wqIAimUhRxRAJgIUdY4QgFTTpsWPUTpbhQBhZwOg+UX5KiAYsx5rKbEHBeW5MwDx8a6gAFScAQZdf5EKMGGg3pk7JONlDQEJXyfAS8N5gtebRTUMgIAKFQY0dazqAUwE1GQcIpAvVLzADKX1bzNQgIDiG5Q+LrDLwuJNG0ZLOBAK6DQBZobxTmOgP6gAVoSl8YFmBugNUahQ7rCgh0ukyuQkLTBtlGuyTBq1/YpsWemrJ7JU3IEaHCtMVi0AMhOGgRonjgj4DQGgLA+NwHgMgLAQtmp2AKDUVPcBnIaAiFCUQZKmpaDgNEFgCBA7BSaincwGQABiM9/oRAjrQLEbYUA0h9rvS7B9gbx2TunbOxA87F0wGXau9dTJN0JHgGgXd+7D3HtPeEQdl6b0fq/aQUg0RNScE9JWiA1aZC1pdfWjBibR5TRlJawgo6m5uQ4KQ6MjQgOIDrTASF0qYUSoAPp6r1QAdXEBXBQPHONJBw1WmtLGsiFHzaytA68WU2qgBvcQ7IzBZLZA6cFiwaAPDFGkOAGBRr4HCJAUmHJGD1EPoUEVYrDWU1yBvZU1YprnDkOtSADoVMKXFFpkQ8g0B6YHgZozJm7gbxMJZkOBGIDKgdLm2AmpC08mLTcF2nATEwB7U6PtkBM0TQ/TM8B00f1TpnXOhdeaQNaDA3ACD27oN7o7Aeo9J7wEfovWgK917RChNyzAUJB5QkftCeNWIeY0i3HeE3MAeZaj7APBKgAorQO+qLSb0adLh/DhG/WNEQLqdxha0gsbdR64Iq82Sik7ewGQUBV7RH6POiJr4X5JEu+6tNN2oDrVTQ+u4aBjtEf9e6z1F2YBXc4AAUjgKvdawCvv3ce+A57ZR8acHe9d0gt2fsquHf9wHfqA3ofYMEMwQDOCLeJ8G1evHCARDgOtK01r8CkOrTKOwyD5C0nuw9tIT3KYvY3oGxUDy4Dn3ZC+5LDh+BKjaj23HOQHx8+RxkSnQaki074LOxnACdAs8Xmz9Hx6cD8WV9UJeXBkCAhDp4kKVlVBm+qPi2l9K0CalIPcXIkrFj/P6YIpjRBmBWSqlOKyS5eFgCe07rg01pOyfd5773cBfeBH93mxAgfECdUkFn8PjvMj4qY2UMgA8ZBtcQ4KcBdBWWjvGmAcppUrKSHz9cS31uZCeNCem43DRfJJSnC3i3crPkyBd0xLgpP0/F4DiHcvjJK/V+sLXg85S+++QsBHqPBeuBF4eCX2fGEq8j844nJKVUs+6nBTvweFDOA0+3gR72eHG0HlXv0E70awDBEaLM7Y2gHTtD3IwCuAACEnAv+igZAIBjQvOkeyOAuqOSQEB/+nAvGD+nAT+xQPyYAYByBUBOOyWiubiT8uoy2q2ZGG27IjQJqtEkK1g5q+27oYAh2cABOR41GlCI4JiKWzAJiuuhAQCqC7+ryXAgat+XBPBfBOMAhQhbBXAzAGANBqKlCZOOKrqShMAwQ/260gasBE2ihQOp2oOGOn2WOd2sB/Ogub24OH2yqZhBB+OYAChGhRh52Jh0OsOd+dht2iOZuCBOq1hEO3h32WajhzhhhwuwaqhauJONOdO2uPIuuygrOxCRunO/EPOSOKOARnAyAMRvMmu9OOuzOKR7OPe/E3iWagal+Ih+IN+lC9+ooGBz+2Bb++hLhn+3+eBABwAQBoB4Bf+UBMBWR/hr2AxkBDoaBTRmBL+OB4x/+IBBB1RzBT8Z8F8SAV8JSmW/gyAVo/sAoE6pW/686pQygJwhQmo+4zAFWS6tWQG4ChQVa4CjWzWJghQ4CJ2ha0QXixSpSug6kFgxyVSmy5StSQQLGhyfkrU7SzgXUqUPUPS1y2UAyzO0AsQLhIOwQou4uAA/EkNsBgOtMoiugynXiHJEqlviWABgMgJ4o7JwEQBAKsIIgANTqRZBbjurELfFAqTIgCjGOaLKNB/ajqQqUb4gwBALRRYYACy6STEqKw4Zw/mG8Ca6QSaw8/otI604pFKM2jAdMXAY8MoXIh8YQLA4g4o2J2goaJpTRxCJC82peyaJpdqhQIgWSy+TBI+6ohKxKnI+Yiy76L26IwQVU0QJWf6AG4CtQYApUK61WE4Jwh6sZQ24utWsZVU5eZQ6ImoVUHWV6EewQ0YSpOMOqS8U2UW+EXI5GWafateMgmos2CQXqhxf65WQGVWa6QktWW6UGMGTWcGrWDZBZN6DZzZaAE5oSw4cA0QmGB2T8R2o0tR+430t+qgwhhOmJq8q5JckOd260u5T6IxVhLyasnA6gWaIpAOy5W5Z2O5iEjwnhR5Fh8Bp5R5SQl5v2eOo6xBjQuoGW7I9Z+wjZE5rZv6ZW0ZnZLsoGPZdW/ZLxQ5ECI5yG16457Ac2U5M5Y2Iu7A7IpgE5dep8Q46xKA18RKza/gRAFgmo6ktFFgFgPxKkJUVk6klS2k1UYJeAIOkJiAvk0J7Uy4FyvUvSNyQ0V+R8hiZ4nsHMtcscGQ8cac10EsH4IsqcV04smcgED0IEls9Eects3cKsj5jc5cWEcl/w7whEFlaIRsNllEps1Erc8M7cNsrEdsPcXEFIYavENIAkIAPZIKBoYkvolYGYMktY2Yco8kBYSkxFJSPkweQJHFukOy+kQQRksgJkfFAliUnUwl3gYgCg/gQB3FHqKy/xHYVgGywU1V/SeA0ysAW8O8SQOCX0JcAJDFXVDFnCNQdQJ4q8LQxJnhUsawL46oRJyiv8vFS4uVlkXUxS+4sArkCqX8kUZC/8gCICCgYCkCHwbAMCTBElOC9YSQuSJIlChMxMDSnsjCoIYybCHCXCnEEebBrq25jVOg+S+Mnh54Ee/g1qogSAoAgQ8gRKB4eAL8IArgrgQAA==="} +import { Hooks } from 'wagmi/tempo' + +const { data: order } = Hooks.dex.useOrder({ + orderId: 123n, +}) + +console.log('Order details:', order) +// @log: Order details: { amount: 100000000n, maker: '0x...', isBid: true, ... } +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `dex.getOrder` Return Type](/tempo/actions/dex.getOrder#return-type) + +## Parameters + +See [Wagmi Action `dex.getOrder` Parameters](/tempo/actions/dex.getOrder#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`dex.getOrder`](/tempo/actions/dex.getOrder) diff --git a/site/tempo/hooks/dex.usePlace.md b/site/tempo/hooks/dex.usePlace.md new file mode 100644 index 0000000000..afa7951202 --- /dev/null +++ b/site/tempo/hooks/dex.usePlace.md @@ -0,0 +1,85 @@ +# `dex.usePlace` + +Places a limit order on the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"dc89ef7c90b6e3e69c1c36d86e7178af7ac3a72d19bcb225b4b1bdc2a7afa924","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' +import { Tick } from 'viem/tempo' + +const placeSync = Hooks.dex.usePlaceSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +placeSync.mutate({ + amount: parseUnits('100', 6), + tick: Tick.fromPrice('0.99'), + token: '0x20c0000000000000000000000000000000000001', + type: 'buy', +}) + +console.log('Order ID:', placeSync.data?.orderId) +// @log: Order ID: 123n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.place` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { Tick } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const place = Hooks.dex.usePlace() +const { data: receipt } = useWaitForTransactionReceipt({ hash: place.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +place.mutate({ + amount: parseUnits('100', 6), + tick: Tick.fromPrice('0.99'), + token: '0x20c0000000000000000000000000000000000001', + type: 'buy', +}) + +if (receipt) { + const { args: { orderId } } + = Actions.dex.place.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.place` Return Type](/tempo/actions/dex.place#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.place` Parameters](/tempo/actions/dex.place#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.place`](/tempo/actions/dex.place) diff --git a/site/tempo/hooks/dex.usePlaceFlip.md b/site/tempo/hooks/dex.usePlaceFlip.md new file mode 100644 index 0000000000..9925c4fbd1 --- /dev/null +++ b/site/tempo/hooks/dex.usePlaceFlip.md @@ -0,0 +1,87 @@ +# `dex.usePlaceFlip` + +Places a flip order that automatically flips to the opposite side when filled. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"0b032ce2f26b3ba60b7d704cf92957c90fd7feb051b6dc255273d25ecb860c75","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' +import { Tick } from 'viem/tempo' + +const placeFlipSync = Hooks.dex.usePlaceFlipSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +placeFlipSync.mutate({ + amount: parseUnits('100', 6), + flipTick: Tick.fromPrice('1.01'), + tick: Tick.fromPrice('0.99'), + token: '0x20c0000000000000000000000000000000000001', + type: 'buy', +}) + +console.log('Flip order ID:', placeFlipSync.data?.orderId) +// @log: Flip order ID: 456n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.placeFlip` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { Tick } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const placeFlip = Hooks.dex.usePlaceFlip() +const { data: receipt } = useWaitForTransactionReceipt({ hash: placeFlip.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +placeFlip.mutate({ + amount: parseUnits('100', 6), + flipTick: Tick.fromPrice('1.01'), + tick: Tick.fromPrice('0.99'), + token: '0x20c0000000000000000000000000000000000001', + type: 'buy', +}) + +if (receipt) { + const { args: { orderId } } + = Actions.dex.placeFlip.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.placeFlip` Return Type](/tempo/actions/dex.placeFlip#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.placeFlip` Parameters](/tempo/actions/dex.placeFlip#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.placeFlip`](/tempo/actions/dex.placeFlip) diff --git a/site/tempo/hooks/dex.useSell.md b/site/tempo/hooks/dex.useSell.md new file mode 100644 index 0000000000..025ba3f778 --- /dev/null +++ b/site/tempo/hooks/dex.useSell.md @@ -0,0 +1,77 @@ +# `dex.useSell` + +Sells a specific amount of tokens on the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"ae5fe3560e82c82e12f7f413d98649d47715c71ac035ce263b44bcd061feddc4","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKRE5RgMhkAGUMIkygZBHDYLQ4XFMsXCyWy9Y4QAlHRxUhgAAqXgAPABhFIxXo1BL8SAAdzAAD5/CJxLoAOzL2S+5RIAAcQa0OjwmSLpcS/hMZiQAGZY/ZHH5EAA2ZPULxp3yZgL0JgjMWVoyLiSIFuO4+oom6IN6mghngv6nlGl7XvGt7OMCy5PpgqZ6OmfhZp+egiqMtR0AuHpSAa66gf6V7UMG+56DWsHnogVG2DeiaIEaF5oS+mFvhy2Z6PEiSXKk9YwI2R4tkOI5jpwE7TnOwTjAKOhkHAAD8FZ8FWNZ1g2TbHq2AAK9jMCpExSWAo7VLJYCThAM6zl0PBaXA1Z0LpYn6S27adt2fY4BZVnjrZ8mzkMYDKXA6TWEConic2J5UNSCz6FpsTsAWRZVHcUUwPUo7WNszAQAkXA3JwaACPIrlagAchANBlD2+CMLKrU5S2+CKpA9ZYmlyiiFwU6iNM6WkBV+BAnsohgHACbJGAQyVc8QKmNYMhxLAUDXKkOxtDIcz8CtMTsECRxoF2uQHDspzfJkcIcqIXJIDyfK0AKGy4FQAAGv35LQQz4WKEq/nKCpKqqw0KMwjD4jQIyaotlkJEkVwAIJYFgwTRMAQycJwuazVwErMHSg0wDUrWGfIUDZfKAC8zmGG5tZxV5iTY1q+PnZd4J4/jnD9m0dKVUjAsCykg4mNY/D08A2OcPTs6cKTFwwMEuOpOLAsCiV5wAJJgGUYYyvqoKmjU96RBQ/Payrpho8VpUAPJ0sbUrhgUKqSKoZqcFbNta3blX8PIhtlCqFi0CarZwnCwLAmatvayH8iu2gEdRzHcdwiaSdBwLriRK4yf47Tc37TAUBy1TNNVCXBdhQX+PxZwPZVbNyf9viws4ikTf45aYAN7930uhQvJKcw/hT2ZsoosZ8amU4rnj7yPPdkYywXAthzwCsaAPa67pLlIwFyBRSAJ7uUF6GzEmJcYcFMQhCZ3kaqEeM+GE+BmfG4SAQm+ZDwJWsJpZmOl76gJ8hdPyA5hyWRknJeyc5iKnwDJIMiIE/TbhvrREAICDIMXMPeV+SEkAWC4j/LC74aAAMUoqHAHAMDRFVuTMohRxCMFEJXTEhDvKL2UivQKvRZw1AgFgYS6kyjb3Js7SRC04D9k1uLI4MV1gZzbvGWa80UgdnUZIgA3EMdwnAABCgIACipBFSkH8hTTK0DBHL1UiIhQYibJ2QcpwAAPjZWAo4zBQGiErTgRAICMCgP4ZKeBmpAjYcJWIKNEkYBKgTGa6SiycCnHkfAYSuE8LkLKZaexejaHGsoeJZNEkzW2hI4SYQZCvEIIYHa2woC0waTITJMgAQy2uAovMD0gzPRQJPEy/giiVEKVsFEcT8nTN4dcNoAArPKXBlrpDgMUiAE0gTfQSQtAAYmAb6R8J4gCnv4epii4QpGLHEawMVtmcDmS1WUglUapByVk0cRxsmTVSJUlW1Td7tTgI855cB4jdNqdkxgWSOiSm2VXPZIKd4pBVLKU4B9znjKXtcwZs07lgGsbY15bd3lJKErvH53S/mrVuMCw5Vx5C5lKqpbYnwbEZThXSlayLMjbWBWQWxeLLkTKoDcoZ9ydBoDkNtN57VPmJP5QygF8g0UstSO1GAuSngQqefAaFKwmmxB0LYVFGU2V6xXlyzgoreVgG2kirZQqHX6oqZNWog0djWp5aQcVRxmDiEEP4FE+tbipLiCrUQocQWrHWHIPeABHEoIg4A1G+vcyFxrvrwt+Ywf5KQzWiBiE4NFMhyb5msI0zg0a1TxNELABEYAURoyycC2tRY+lHRVYo8E2awAPKNds76WaUhkvYOOzgQ7Gw4gVd9aI4ggThMidSr5mauXCu9RvIJ+SNpAn5Ui3okAjhQCPm6AhJF2IWCohfHBD48FBASV9J+jFSGALjG/Zwbgv7oW8DQ/+QQGESLIJgZdTsDZG2eL0foaCAJGmBFgh9YFgKQXwbrUqhtiFIDXF+1i78qGAd4jhEDYRuFRElBMXU+ROGHrKBUKoNQ6gNBkJiB4HRSBOR6H0c4gNvxjA9jKaJGI8DLETRsEksodhMYOEcE48AYSDV3uVHYnGngvDeIwD4DraDfBhH8Z4gIQRgghBYKEPxYStuRGiDEZRsS4gJESEkZIKRUgxLSekeRpPMmE9MR6ozXr8kFG+oGxNqOslGvKGIiplRqlc4jIYJs9SGjzuaIe1pbQOhy06Y+170FGiNChjc/pAzUT3KGfzEZ33mHwyxRCbFgRGmI6+P+ZG8CgaYRB+2YBHa2vTt0OD5wEO6GK+fUrV8jTPrwDDPrUG0Dp1w4BMhbEWv/u4r/bCH5yPhCoylujRQGO7H2NZVjIb2PNFaFxnjw3BjDFFEJmjntRPzHEwfJN0mcqlPk8cU4ynElqfuNdzTrwdjvE1ZZwz5UASZFM+CSE+noTnHhFqFE6J5gOZxHiRAhJ1RucpMlLzCKfNMgO0YTk3JeQhc+sKQT4pIu0dlDFuLqp8dJe1NVr2to/YWitPiG0JocuOhdFe/8Y37zTewWBcrGGqvPZE5GRiwEGs/qvo+Db1DSM7c6ycMDzDoipzAOHTgAwQBZwsNYYX1ube2+F8CM3o2kBGi3N6VD/p8Ny7wEbnDSvzDSAI41ojmuSPtZ13oLr4GWEVQ7oN035vo6W7t8nlP9ojSO5PgBC8xpyKPvQzRIIRult+6vlYQPav2KtZ4mHuhQQIqmSig4IEQCIByCGFMgmeZW+lE4AguA3fXspXmd9Fvch83FSgCsIEeviSwBk+UEUybYDCwUHxhQnfZrd4moNTg4KWAIvEDHvZQwABSogijFmsJUSRG/+/JtMixXIcBlQz8iairTU4YBtGeIqKcmQJg2a9jeoT5T56aPbFJTi7K5T5SMCFS5gjBWZNBagABUnAaMs6fe3e+a60EQsoOSygKsOghAUAsohqeSEQs6o+MAcIB0Cg2MM6I+XecgcIjqpA9B26lBTB1Bw03Y7BA0XAtaqQSKokwquyU4lQNAR+M0rw9ULaKypBewMAAoraqB6BCgB0AI3SjBm+Y+u+RMM0MUG+VkXYqKy04heQU0uyyA30euUK5IaAswdI30zowQjmOOhIkAsA8hdyWgHmNIVaNAIgSIRAxWcItA+IogWAsMthxqcI2IzAMgAAxDEdsiII4bCNukMNYSka5GkaKs4a4djs5p4TAN4ewAoH4XAPiAEfAGgMEaEeEZEdEYqHYfEUkTkXkTYvCJSkCOoRAJoZwToTANgRksIe6vgYQHSLvoJtlMCt9CUYgFQePtAFPoAQAPrIHIEADq4gV0CgmxaxTU3qfRAxVByyayjgWKhByg0AMm/yZgnqt+rUNA5wTSQwcAnU3UJUsoJg8awKbQv+/+aBhk+sxSk0rw/27QcgNQZ62w/ylSrwQCzxMIbxEUHxiQXUKQ3xnAvxQIdaDUk040sh1B8hJ2ShzArknAjYU03q1hkAkhVwORnA+s+IzsBRbhxR0ApRrk5RlR1R1adRIRBoYRERURzILRsRbRiRogSI9JMASIKQSIORSIyQ0QJ0pAQwxU/ypg6pIawkgBli70oWskcAsxxxGhYQgxd+wxiAWoo88hQwVBNBEAdBKok0RYYh7AMgUAKokQxiYA1ohk+w+QDmTYnppA3pNQy0aRJU92TptB+o7pB0nAAApHAH7CqJARGT6X6fzpwEGf0JiEmeGZGUfjGXSI6VwSwQGsEGYFOJwFOmwSqFsS0niDUP3svC1AcACNtHYJjPIFXL6bmQGQLgWecLKKwYQdsk9Hic6rsA4EdNNIYdGQ4aKraSOQLI2WUC2XwG2eUEqEQdlD2ViJETgEEnmeLDvsgDAEds6OBAGKoBeTrFwJftfofKQAkIbM1K1AgrXuCAsUQMwAGBeEaAGFuJlgLpeVwM7KsusnCB+cbkAT+SkH+bWVyYgIBUxBYJIExOBU+fjDvgsf0GQBFDIOKXMMaviHQHlHSAtIgKuBgvhdsFwNebeUiOIaeWQA+OxOnhuVBQ6kdq+Rov+ehcRd2GEORVClRbQDRcJPRfeA+BYBBdrIRaJecCRRJSGqYFRUdmsXJgoOxBeExFqEAlwPXkCIzM2Qit0m2P0aYP3mACqP6U6TwWAMEN9KiDNOUpwAACTADmWuAACEaIXlZAgVS6/pgZwZmInligTwWx1lnAtlPQm+YAwVsV5SgVUZUBq5NiQwo8WohpH0ya9YZp+ymBuhOB2y65+Vv0DpiQeYZUUxjMIYxYihAoxYB5hAU42MzljVDqNiisnArV7VzAnVpk3VvVlZRMKsGAFVFl9wMA9ZTp81wQsZNQoqw5mpc1VZCZbpYZ2SXpOZkVo50VoZHph12Z2V1wFZYAzAO1QxzprpxZqZ6ZNQmZR1vpJ1+ZZ1WIB1WZpZy0sZ21811ZtitZS1DZNZzZrZW6HZh53ZzaJ5/ZQSQ531Y5IZnAyAW5nAO5EicNB5ygR5SNfZZ5VcboR+oqJl/V5lQ1VlWSyV9lmK/p91oNrl7lGVTwflAV6VoVpA4Vw5UVhZZQnN40CVDNdlqVvNcV/N11VNpyv0gWVOBCMAb6yA/eXYMULhHJuO+IfQygcQbQcI8B+IJR8hptXJPcGhRIDR1RjAbQ+ITp8hkQoumenoFgUu7ueGM2egVBy2wIzE365ClgVeW2tC/EIQnZ0A0QoNCZDec02gGkXKGANQOc0qpFzimI0hyAzoTka620wQAA1MCNcBmAdM2i7UlGJnoBjTsrOuWWgPmhMYtVOGeNQZwBJmsJ9HCQoK0DCLKIIQKm6lXDUM3ZUkMH8vmCIdsGCdPpUCGqQK8PHTORwXWs2p0gtJadPRQRCm0CIHkLRSkO3sUFsKaTDFWhUlYTYcGTEMEBeJEOydjrrSGmAMuD4RUWeHEOES/UqTOVUS/ReOKf0DEHCBeHEWgAkUPMEMCsGH3eOXCXiVksPaIVjd9LRTIHCLqYNPQdrUUbrWbTyb4UTjUUEUKSKU0cThg1Keg1g2gLQ0iMGFEKjkjPaXANNTWrakNaoH1Y9XteyucGUCmT6TUPw7COjb9aI2UOoGWQ4cDQ1bwy6fqJI37KI4LadcLZ3qVFI9dQ3bVd9FqNSag+g5g+wHqTg4UU5vg1yWUUQ55iQ4KbbRQ8Y9Q/SLQ/Q4w2qRlFqatJZKYypikMMtREFryKaYkG+kQBYPHPHHaK7QVgBAaOVl7S/BVrfMYC6f7YHYRs4FuKHUBh1r7f1fwuWEzNpO5FAgZDApdPYm4sFF4qgm7UgAaBeG7pNitik/gkU9YBk6tneBeJxCHm1ttrXrrowlHtEFAL6mUCogLGonqpIk1NonNF8vonM2gP6fKH4gkAElGFElXW9noPMlWsArmtsjCmaqcK3iQNtBM2IGNFqqCgE1qEMIcxEFwIalCmcxCfAJc6ijczsOqfcximAIAc896kc28ycyakWF83flcz6rcwC8yg88C080AUCOC+UJC583vLC7876nc0i0C4E+Lo0waCVpfIgFgl7nRL6t0+XsHcaLk9rsMxHnrt1tHrMxogszNEs8JCsxooPrEos7oqkJy5IsSzel6GXkk57gXngGKwwCXsBT084AaDkwM9XkMxHZHgbhVMK18twBEPgGUN9FHH5fpa4Pmps86jAIElXIK3oIaxSEZkTcUvq8JE7pS6oBNhS8CBBHK3oNNDoga0a3S6rsHaoI+FermLAF+I9gzqDCzhDJmU9DDHDKSGwIjOFgzuTmDLFsm+ztTTNZ00Nb+CzB5PFAZJzEjNaIOHWgctUsMXoTi3dJYSaU8CK+CNQQoHCM8CLFcOtLAfwDULqZi20DDNsgtEPJ03CK+hrPzFhtBu7ArqlubH7AHPzHNv1i7G7Izp7PqD7Ou9bPzD7jBpHInlbqnlezbonIHPjEXru+ezHNey+zlkaPnEXEW9aU9fqD2O67vHYBSIgH7DO382pPBXlKs3CEG7ywtE6/gJXSAMvKIEgKAIENVAtN7ggK4K4EAA="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const sellSync = Hooks.dex.useSellSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +sellSync.mutate({ + amountIn: parseUnits('100', 6), + minAmountOut: parseUnits('95', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) + +console.log('Transaction hash:', sellSync.data?.receipt.transactionHash) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.sell` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const sell = Hooks.dex.useSell() +const { data: receipt } = useWaitForTransactionReceipt({ hash: sell.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +sell.mutate({ + amountIn: parseUnits('100', 6), + minAmountOut: parseUnits('95', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.sell` Return Type](/tempo/actions/dex.sell#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.sell` Parameters](/tempo/actions/dex.sell#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.sell`](/tempo/actions/dex.sell) diff --git a/site/tempo/hooks/dex.useSellQuote.md b/site/tempo/hooks/dex.useSellQuote.md new file mode 100644 index 0000000000..e6d4fb2c1e --- /dev/null +++ b/site/tempo/hooks/dex.useSellQuote.md @@ -0,0 +1,43 @@ +# `dex.useSellQuote` + +Gets the quote for selling a specific amount of tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"e032bbb5ac251a0290eacf6fd15a7b454e27c2398bf4e185fb4d8d10e5253e5b","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const { data: quote } = Hooks.dex.useSellQuote({ + amountIn: parseUnits('100', 6), + tokenIn: '0x20c0000000000000000000000000000000000001', + tokenOut: '0x20c0000000000000000000000000000000000002', +}) + +console.log('Amount received:', quote) +// @log: Amount received: 99700000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `dex.getSellQuote` Return Type](/tempo/actions/dex.getSellQuote#return-type) + +## Parameters + +See [Wagmi Action `dex.getSellQuote` Parameters](/tempo/actions/dex.getSellQuote#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`dex.getSellQuote`](/tempo/actions/dex.getSellQuote) diff --git a/site/tempo/hooks/dex.useTickLevel.md b/site/tempo/hooks/dex.useTickLevel.md new file mode 100644 index 0000000000..c3399be15d --- /dev/null +++ b/site/tempo/hooks/dex.useTickLevel.md @@ -0,0 +1,43 @@ +# `dex.useTickLevel` + +Gets the tick level information at a specific tick on the Stablecoin DEX orderbook. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"57b65b077fbeb672f0d0226a0c174adf10d17a4561575135f580ae6d087d726d","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { Tick } from 'viem/tempo' + +const { data: level } = Hooks.dex.useTickLevel({ + base: '0x20c0000000000000000000000000000000000001', + tick: Tick.fromPrice('1.001'), + isBid: true, +}) + +console.log('Tick level:', level) +// @log: Tick level: { head: 1n, tail: 5n, totalLiquidity: 1000000000n } +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `dex.getTickLevel` Return Type](/tempo/actions/dex.getTickLevel#return-type) + +## Parameters + +See [Wagmi Action `dex.getTickLevel` Parameters](/tempo/actions/dex.getTickLevel#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`dex.getTickLevel`](/tempo/actions/dex.getTickLevel) diff --git a/site/tempo/hooks/dex.useWatchFlipOrderPlaced.md b/site/tempo/hooks/dex.useWatchFlipOrderPlaced.md new file mode 100644 index 0000000000..e504554f76 --- /dev/null +++ b/site/tempo/hooks/dex.useWatchFlipOrderPlaced.md @@ -0,0 +1,34 @@ +# `dex.useWatchFlipOrderPlaced` + +Watches for flip order placed events on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"ec2db8af3c2ec972afbe7d0d286151f1c33da31056ce694679eda2d35e5d89ec","data":"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="} +import { Hooks } from 'wagmi/tempo' + +Hooks.dex.useWatchFlipOrderPlaced({ + onFlipOrderPlaced: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `dex.watchFlipOrderPlaced` Parameters](/tempo/actions/dex.watchFlipOrderPlaced#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`dex.placeFlip`](/tempo/actions/dex.placeFlip) +- [`dex.watchFlipOrderPlaced`](/tempo/actions/dex.watchFlipOrderPlaced) diff --git a/site/tempo/hooks/dex.useWatchOrderCancelled.md b/site/tempo/hooks/dex.useWatchOrderCancelled.md new file mode 100644 index 0000000000..c0fa4c2d7e --- /dev/null +++ b/site/tempo/hooks/dex.useWatchOrderCancelled.md @@ -0,0 +1,34 @@ +# `dex.useWatchOrderCancelled` + +Watches for order cancelled events on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"ee48b5f79e7f2895e840942af571c220f1e3dff682b0163666b36294801e6325","data":"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="} +import { Hooks } from 'wagmi/tempo' + +Hooks.dex.useWatchOrderCancelled({ + onOrderCancelled: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `dex.watchOrderCancelled` Parameters](/tempo/actions/dex.watchOrderCancelled#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`dex.cancel`](/tempo/actions/dex.cancel) +- [`dex.watchOrderCancelled`](/tempo/actions/dex.watchOrderCancelled) diff --git a/site/tempo/hooks/dex.useWatchOrderFilled.md b/site/tempo/hooks/dex.useWatchOrderFilled.md new file mode 100644 index 0000000000..e960d8f0f3 --- /dev/null +++ b/site/tempo/hooks/dex.useWatchOrderFilled.md @@ -0,0 +1,34 @@ +# `dex.useWatchOrderFilled` + +Watches for order filled events on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"d6ebca7ccec7392508f050d98ee570f2e62a86cf7af165696dace79303079a4f","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.dex.useWatchOrderFilled({ + onOrderFilled: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `dex.watchOrderFilled` Parameters](/tempo/actions/dex.watchOrderFilled#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`dex.buy`](/tempo/actions/dex.buy) +- [`dex.watchOrderFilled`](/tempo/actions/dex.watchOrderFilled) diff --git a/site/tempo/hooks/dex.useWatchOrderPlaced.md b/site/tempo/hooks/dex.useWatchOrderPlaced.md new file mode 100644 index 0000000000..109ac9ad92 --- /dev/null +++ b/site/tempo/hooks/dex.useWatchOrderPlaced.md @@ -0,0 +1,34 @@ +# `dex.useWatchOrderPlaced` + +Watches for order placed events on the Stablecoin DEX. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"3e7dca1cf113bef29341a671f24d7e6ec1d9eec74f78c78ceefe4f494ee9551f","data":"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="} +import { Hooks } from 'wagmi/tempo' + +Hooks.dex.useWatchOrderPlaced({ + onOrderPlaced: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `dex.watchOrderPlaced` Parameters](/tempo/actions/dex.watchOrderPlaced#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`dex.place`](/tempo/actions/dex.place) +- [`dex.watchOrderPlaced`](/tempo/actions/dex.watchOrderPlaced) diff --git a/site/tempo/hooks/dex.useWithdraw.md b/site/tempo/hooks/dex.useWithdraw.md new file mode 100644 index 0000000000..2cd2cbeb8a --- /dev/null +++ b/site/tempo/hooks/dex.useWithdraw.md @@ -0,0 +1,73 @@ +# `dex.useWithdraw` + +Withdraws tokens from the Stablecoin DEX to your wallet. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"1ba49397fce40202581f9380b2e1c849c02f8b39dbc63f623cec1edd321703c9","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const withdrawSync = Hooks.dex.useWithdrawSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +withdrawSync.mutate({ + amount: parseUnits('100', 6), + token: '0x20c0000000000000000000000000000000000001', +}) + +console.log('Transaction hash:', withdrawSync.data?.receipt.transactionHash) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `dex.withdraw` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const withdraw = Hooks.dex.useWithdraw() +const { data: receipt } = useWaitForTransactionReceipt({ hash: withdraw.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +withdraw.mutate({ + amount: parseUnits('100', 6), + token: '0x20c0000000000000000000000000000000000001', +}) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `dex.withdraw` Return Type](/tempo/actions/dex.withdraw#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `dex.withdraw` Parameters](/tempo/actions/dex.withdraw#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`dex.withdraw`](/tempo/actions/dex.withdraw) diff --git a/site/tempo/hooks/faucet.useFund.md b/site/tempo/hooks/faucet.useFund.md new file mode 100644 index 0000000000..2a8bf9a65f --- /dev/null +++ b/site/tempo/hooks/faucet.useFund.md @@ -0,0 +1,70 @@ +# `faucet.useFund` + +Hook for funding an account with testnet tokens on Tempo's testnet. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"1a95b41c202f29f8ef89605e6082e91c25c3ea600cf822463485a078a7ff5484","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const fund = Hooks.faucet.useFund() + +// Call `mutate` in response to user action (e.g. button click) +fund.mutate({ + account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', +}) + +console.log('Transaction hashes:', fund.data) +// @log: Transaction hashes: ['0x...', '0x...'] +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Synchronous Usage + +Use `useFundSync` to wait for the transactions to be included on a block before returning: + +```ts twoslash +// @twoslash-cache: {"v":1,"hash":"70c6e7579f56d5a55b4b8b81f596b6b59a686064ee970a2e241dca8d21b48c36","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6INYQYCKcAGYArmBQAMoYYNaIPHyCAHQRolHWOulRcDAAYjHxidbpAEo6UaRgACpeADwAwqERjAoUnDH8kADuYAB8/iLiugAsAMyy8koqiAAcGuLaQdGxCUn+JmZIAEw2dqQOTkgAbO6eOHiEJOQagUys7FwGgqOauqoTs4rKahWWh0eHeRl25kOwWOpz8iAAjAB2K7ULy3XwPAL0Z5sDiRbK5BjCL4XKzGOYAxDnIFrPBZHIg2SmSFHeyOOH7KYozA3PR3PyPbF6DaORihHqFEqbcqtdqdbq9AbDAAUWHszB0ZDgAH4UmDMgS8gViqUthUAArqzWkOCysAdLo9MB9CCDIYASj1aTgBoZaHyktN5SqNTqjRwdodCudSqGAB0wGBRBq4GrchKTdLtlQoBBrAg9O9IuxIqVTApOKIwJXrCEYlx+oxlJXq6Ym4xRDJK8wIPXOBAIpxClw0AJ5Mq4O6E+L6jAXgByOCcGgiMz+zjVNC1MLL/AwZcnMKnMXV0gwXKMLBoH3+MQKAvIZAgOjJrByfwAAy/19oCZYuK4YBUkMThXEiUgIGYTh536UQFGYRgAHoaAXBMExFNAT04ABBLAsGVd1OGABNOE4EIwkAzhmCiMQaG6Rg4HNeQoHLUDOAAXmAjJ6UJANMzKJICLQ6tODPLc6k4ZUSNIzgmgAIxo0cwGkmT+zAFoTGsfh2OAAiOKGKiaNEGhlSAhw6zANAUnnCxaFgUQoDkmAYAidI3PnUD3VcFSZJYuBRDkuQoB0himNictvJE0j4yimSpSgHDa17SyfKaRCFLQJSYtIqcwEir8PxAABdCgnzVE5mH8crk2tJcAFpOEtCravSYrSpAMTtyMABZIzMPFM84CiGR/WKkqQDGCQqURP55iQeF4RpEE9GNeKzR2ZkDlZE52WcKYLG5NE+QxW8nj0cjwg2ATki4n0eKNQMswqTdt3DGBI3lJ0XTdT5xnm/ZqXJf4FmWahVmWkArvWpk9kQdRoTZM5LEO3kfHuU6hRAVUIJwDgMEI6jaJgFJlSIcQO0C+AUmI2LbFEUwAEkoF1TgwCiZgnNITgAB8nVgDozCgABuHzzOSqzEosrheewqAoEGuARdizCNV7NAWbZjmyB5vmXOZBLedKPXBaV9x+yvE8dRSXqiYAeQt0JbSh4MXrqAA1TsohgboACFREKABRUgININ7uhp1S6cZ5mUk1zmdaNgWYGF0WkvrFJsLTyyddl+X4EVnyVZgNWNfZ+PDdiY3k4Tyuk5TvLo2+4Ya/5/XCPYgyiAgRgoH8XN8zweo90M2isIwrCMF7Miq2nmQu0bZsydICm5CXUcD06bQueUfdCeMrCqwSiAHaTOeME4QgQPFByWP60/Z5kOSHH4c275vFZ7yQR8QGqyqqCXle8BOANSHvuABAVV79jkgAK3PCOCAnA1RwDXggnenAPx7zvkUMAH5WolTKuqfwx837pFCHEHIuRkHAM4EPBipYkh304I2OekRGBniYXuasaDMFYToUNWs+dohdkPkwxgLCnKIP9oUBK3C+onkXKJeAw1Rr4J/oQqgxDLakLAEHEO1DaFLnHuKZhXYOjsMYIOWRo9xTyCllqFsnAyB6JESYzgEikHSN3PuJx7A8HtV/kQk+PoyE6DQEFfR+A6FGOrK4sx+5+icK8SPfe4o6EwCbHuLm/DKFwCETIc+EQdC2GriWWx4t7Ezx8VzER7ipHV3STvbew8oDGVEP2LmVS/FPjPMwcQHwqANQZoOSeUQqKiH4LvZRl45CKIAI5exEHAboH4yEUPzh+URLC4lqXyZWCITgkkyGMvALg1hOxdhGfOEgYzYDpATA1bCLC0FnLnk/LS9DRSO0kissA5CBHII/Ms0Iuj2CAvQSEzKQUPyEXEGA7uCVolLJbDI4enU6jVzJjIL2myuwSM6JAM8UA8HjUmroeEUx4ZyGBhcJaQRMG4BhuYeGdMdpIzcB4VEqN+SYhoJjbGx8yCYBhVnCWH5bIABJgAiGXooVwGyZYir7nmAsIBM5S2XAgq6rViR/QRBMQGVK5qIBmmDYEQQxb1g2rDQGLLYTOH2Cjbw3KMZBCTCmNM+4LoQDkAmJeZFHbeuJpwNoYRA1KoHnoUB6CvVyA2T2KAw19xYAgkQHuQC2lwH/DM2ACkFAKFYjG/cyhjKcD4SwMR4gNVeITAAKVEGTOI1hl5Xn9aGmZGo6ZgAYlBZNxA00JTkuffoMA5JuIgv0QoNo7nKQaMPeNibHG0AAmvfoCDUzngsYwaw/qXhmEsnARAwkABUOF0EhrgIGjZ1gjlUIXvgKiOhCBQCXPw+9/to0BrkOkGQEAFAETBR+Qt6Qqn/uRR+ttMB0iwTqKB4tpyZ4SONDIhB/Rl40CrVWc+AA5aAkHoEvrQGeZM06T3YU4AoH9T8uyAc/TADZpgxhJE9XKBQtRq7r1Q02ItCDkAfl7Tk9IIhcw0Q/EVZU+BMpYAPYhRCkBYD4dIVoRC/c4CISOSuNAdUiD7AmOkWgiFRBYCQvx/O6QJPMBkAAYhM8goTasYWxATLxmzPohNONE+JyT0nZO4YU+wBQynlVqeOSILTOm9MGaM4hFzZm0AWesxBHJbng7unSDQ4eFGIBUfAxe2N09qyIc8XetWpaXgcFYmgj8cniaFrjdARN06EwAH0j1HoAOriC7YoVrTWUhRsy9lwtUDYGOAURqZQ0AlywtZg0zJrbM0iHkGEjACY4DlHwBBSABROAmAmUkuS47J04XNAzNee5z6DTnJTboBLKzsJ3ufC6DEaCWXyQmf263Nu9iXLt/c5z+yNM4Dh25+GhyEZgMmH0nA4jOSSbxyA6HxQuc4AzRCtsPMSbQFJxAMnqt+aUyp4LGmwu6f04Z4ziXTPmas6IOqCOYB1VCHVFzdUxSEQiOwBMPZzH2nYL0u+jWdG0FfDMgoFWMuUc7Dly9h6Z0FXwwmIDP6/3zj3HPFD7AZBQHnO6JWMnGoyuvCkNXP6mGa6gN0dedmaKK9o9+39ypVcwHV5wAApHAec3QYLm513rxCBvTBG4vs703q7SBa8t2utAwm0C24g8B4O7BlRmH6JwEFpBHdtcvlJ7oF7xuRMUG4hyF9DM4EFjr3XCZ9fmkN0uKpD7kFwT+7EMHz8DwOG42D2AwdZf69IunlIWe+A56HJBR9rEn4JTsHheQycq/+9UiW5AMBMVFThgiVQ8/VKVi4I25t/pSAxAZrOhiIbeVcGT7hxARBmAIimPsBEixcp95kiW22MC4HpEP2AY/Biz+BEkmq2v1v32kkEQCmCfy30Xy4CAMDzIFPmi0p2QUQjoHPBohPGNURAREkCgNfy4GX1XzqlQ1LzICpEQH2H2FwNIhLRX07D30vAv1gMsngM7EQLzHzhQNoDQLvmNXOCpAsGfwXzwNZivzgLqFYN6VMBQMxSa2lXLHIKmHAOEguhgJqg4mgjazES7EqCywY1CHnCViA2gzAGVA/AABEqwt5OBJU3UYBXAABCTgCwxQMgew6FP3APfdFIZwqwzQlhHQuSPQsARwnw1wyPLvJxBMAqYSAOYXVgUXTNQvSrc9S9MiG9A9YSeXOAOPcIErTiNYOIcHZMOIMfQgfoAiQwx2LgJxdQgooo5gEojUMoionIrgZgDAFImZTiFPebQNdITomAZUNWboJxSvGddogY+3FXE3DXcPbXMY6vWvY3EPWYiPKtNWLnDou3ZXR3GYt3D3L3MPLXX3LfGvQPA9YPF3I4i3dYm3MACYu3EDHo9PTPbPJFPPcfQvSfEvGfcvd0BY/3M4rwzgZAAfTgIfY+d4sfZQCfYvafMvZOEqKtSImdFQ1mNQziecPw7Q3Q0NMAAwzYyY4w0w0IrmGwmqBwpwyw1w9w04pYqklwrmbEjcXEi9YIhkreew8IlEgqW8OCB8J8QoBlEAZAC9WoXIMTTHbHGTfNZQKIOSdIEIZgHzeTVTardKSjRCbTUnNTRgOSRCIDfDd0MaHVKafYCwSlCkBYE1TQWkc6WjK1cwaQBGVlOEA6DlHkJ1E6QUIIZUfPaAQiSYnYlMfybQFmTDboNyUhE+TsJqSHFITDZAIqT0TgLuHuSSAAanhH7HuB/QcmNJzGVTwCBOvCrQ/GtzQA2TvRm36AhDS16hGmmT+y0HZiWyXDOQKyTTqRuOrJ3nQjYXCCQ0rDOyTWXl6VIHPhDKbzA3+xvnbFCClyHPfSGjkhECbHQNCF9U9iAUzQQiOW3h4z40NwiGVCmHdAx0kxx0Ql6TAEREUwC12CiH0xvOZyb1UxvKmEQMD1cimFiws1ymVDQVWFbP3Tuz+xYQ8XY0PPQJkEyD52Mn/UlK8yvLx2CQJyC3UxORJwi3J0Qhgr/Ksxgo51IH52Iv5zqlWEnFS0yK/AVySCqP9T7E4lUEqPjx2PnClhSFd2126ClgBM8KD04s4HUCrQrJyL6PYs4s90Yssn4pLIuKEpEqt2jw2JwS/GEhh33F43wrIoQvPKQqx281QvvMC3zCJywu1Jwqi3wup0syIvgrQF0s00ovZxLG533FMCcpPG1TBk/hQEFNMFyH8CIAsHSHhDCosAsBNImhJHIPJVmkpBmFNTtOMF/UdKkG2jtSQEWEdXRHRh9LwDROdiSC9EMF9F4lWiDCSBDHEgaGaBDSjC+ljF+jNP2gSpBlpTpCqusHSpcEyt2gOFUFyuOnyqxF9N7VxiFU4BaTEBSGKuelDDAA9ixX3ArlbkFnDRVSjRvS4GyUEWGl2UGm9RIAShmraWIqSR4VCEFwTG2v9l2rWWQTyQu3gGOurjOuLCaUmWsTAButnX3B2qHEetyQOpetyxOumtaU+surkWuuEluuHkBr2qetBsUXBveqhouqsRSV+pat0E5GdMNUpF+GSohjOt6udNtQGvAImGGt8v8FsLwGVzxoOAmEtOpUsAKr0GqAvCvAuNQDcR/S0iwzLlIM4HhE5DAEjLclAnDkFrzH4BFq1lIBSAlqmCls4CjNAiKl6oWn6qRgOnGhCFgBxFeCIlujYgiAgighgjggQmQjnDYHnGUIYvmvUP1Hun9EqqeiEhnX1xaH+wwT6jo1LVPHgDYDCE72NGqU+RnXmvSHpVMmkgtUsmslsnskcmcgiAzqchchzqzvzrzoh0zpck9wTFcFynEq/XYp5vST5sQGkvjrOtyn8HG1ECQFAECHkEzVCDwGvBAFcFcCAA="} +import { Hooks } from 'wagmi/tempo' + +const fundSync = Hooks.faucet.useFundSync() + +// Call `mutate` in response to user action +fundSync.mutate({ + account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef', +}) + +console.log('Receipts:', fundSync.data) +// @log: Receipts: [{ blockNumber: 123n, ... }, { blockNumber: 123n, ... }] +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `faucet.fund` Return Type](/tempo/actions/faucet.fund#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `faucet.fund` Parameters](/tempo/actions/faucet.fund#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`faucet.fund`](/tempo/actions/faucet.fund) diff --git a/site/tempo/hooks/fee.useSetUserToken.md b/site/tempo/hooks/fee.useSetUserToken.md new file mode 100644 index 0000000000..cf4612c836 --- /dev/null +++ b/site/tempo/hooks/fee.useSetUserToken.md @@ -0,0 +1,92 @@ +# `fee.useSetUserToken` + +Sets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees) + +## Usage + +::: code-group + +```ts [example.ts] +import { Hooks } from 'wagmi/tempo' + +const setUserToken = Hooks.fee.useSetUserToken() + +// Call `mutate` in response to user action +setUserToken.mutate({ + token: '0x20c0000000000000000000000000000000000001', +}) +``` + +```ts [wagmi.config.ts] filename="wagmi.config.ts" +// @noErrors +import { createConfig, http } from 'wagmi' +import { tempo } from 'wagmi/chains' +import { KeyManager, webAuthn } from 'wagmi/tempo' + +export const config = createConfig({ + connectors: [ + webAuthn({ + keyManager: KeyManager.localStorage(), + }), + ], + chains: [tempo], + multiInjectedProviderDiscovery: false, + transports: { + [tempo.id]: http(), + }, +}) +``` + +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `fee.setUserToken` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const setUserToken = Hooks.fee.useSetUserToken() +const { data: receipt } = useWaitForTransactionReceipt({ hash: setUserToken.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +setUserToken.mutate({ + token: '0x20c0000000000000000000000000000000000001', +}) + +if (receipt) { + const { args } + = Actions.fee.setUserToken.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `fee.setUserToken` Return Type](/tempo/actions/fee.setUserToken#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `fee.setUserToken` Parameters](/tempo/actions/fee.setUserToken#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`fee.setUserToken`](/tempo/actions/fee.setUserToken) diff --git a/site/tempo/hooks/fee.useUserToken.md b/site/tempo/hooks/fee.useUserToken.md new file mode 100644 index 0000000000..734b58c64d --- /dev/null +++ b/site/tempo/hooks/fee.useUserToken.md @@ -0,0 +1,43 @@ +# `fee.useUserToken` + +Gets the user's default fee token preference. [Learn more about fees](https://docs.tempo.xyz/protocol/fees) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"b8231de1b5901110cbc0e94b2094ed4e055d2895dce944b0b9737724513705ec","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: userToken } = Hooks.fee.useUserToken({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', +}) + +console.log('Fee token address:', userToken?.address) +// @log: Fee token address: 0x20c0000000000000000000000000000000000000 +console.log('Fee token ID:', userToken?.id) +// @log: Fee token ID: 0n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `fee.getUserToken` Return Type](/tempo/actions/fee.getUserToken#return-type) + +## Parameters + +See [Wagmi Action `fee.getUserToken` Parameters](/tempo/actions/fee.getUserToken#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`fee.getUserToken`](/tempo/actions/fee.getUserToken) + diff --git a/site/tempo/hooks/fee.useWatchSetUserToken.md b/site/tempo/hooks/fee.useWatchSetUserToken.md new file mode 100644 index 0000000000..11fe6ee120 --- /dev/null +++ b/site/tempo/hooks/fee.useWatchSetUserToken.md @@ -0,0 +1,35 @@ +# `fee.useWatchSetUserToken` + +Watches for user token set events on the Fee Manager. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"f9462d4450dd5426fccf47a3f9f6bfcb416366af2a61b5019d81726cd9f71789","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.fee.useWatchSetUserToken({ + onUserTokenSet: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `fee.watchSetUserToken` Parameters](/tempo/actions/fee.watchSetUserToken#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`fee.setUserToken`](/tempo/actions/fee.setUserToken) +- [`fee.watchSetUserToken`](/tempo/actions/fee.watchSetUserToken) + diff --git a/site/tempo/hooks/index.md b/site/tempo/hooks/index.md new file mode 100644 index 0000000000..cef9bc7136 --- /dev/null +++ b/site/tempo/hooks/index.md @@ -0,0 +1,83 @@ +# Overview + +| Hook | Description | +|--------|-------------| +| **AMM Hooks** | | +| [`amm.useBurn`](/tempo/hooks/amm.useBurn) | Hook for burning liquidity tokens and receiving the underlying token pair | +| [`amm.useLiquidityBalance`](/tempo/hooks/amm.useLiquidityBalance) | Hook for getting the liquidity balance for an address in a specific pool | +| [`amm.useMint`](/tempo/hooks/amm.useMint) | Hook for minting liquidity tokens by providing a token pair | +| [`amm.usePool`](/tempo/hooks/amm.usePool) | Hook for getting the reserves for a liquidity pool | +| [`amm.useRebalanceSwap`](/tempo/hooks/amm.useRebalanceSwap) | Hook for performing a rebalance swap between user and validator tokens | +| [`amm.useWatchBurn`](/tempo/hooks/amm.useWatchBurn) | Hook for watching liquidity burn events | +| [`amm.useWatchMint`](/tempo/hooks/amm.useWatchMint) | Hook for watching liquidity mint events | +| [`amm.useWatchRebalanceSwap`](/tempo/hooks/amm.useWatchRebalanceSwap) | Hook for watching rebalance swap events | +| **Faucet Hooks** | | +| [`faucet.useFund`](/tempo/hooks/faucet.useFund) | Hook for funding an account with testnet tokens | +| **Fee Hooks** | | +| [`fee.useSetUserToken`](/tempo/hooks/fee.useSetUserToken) | Hook for setting the user's default fee token preference | +| [`fee.useUserToken`](/tempo/hooks/fee.useUserToken) | Hook for getting the user's default fee token preference | +| [`fee.useWatchSetUserToken`](/tempo/hooks/fee.useWatchSetUserToken) | Hook for watching user token set events | +| **Nonce Hooks** | | +| [`nonce.useNonce`](/tempo/hooks/nonce.useNonce) | Hook for getting the nonce for an account and nonce key | +| [`nonce.useWatchNonceIncremented`](/tempo/hooks/nonce.useWatchNonceIncremented) | Hook for watching nonce incremented events | +| **Policy Hooks** | | +| [`policy.useCreate`](#TODO) | Hook for creating a new transfer policy for token access control | +| [`policy.useData`](#TODO) | Hook for getting the data for a transfer policy, including its type and admin address | +| [`policy.useIsAuthorized`](#TODO) | Hook for checking if an address is authorized by a transfer policy | +| [`policy.useModifyBlacklist`](#TODO) | Hook for modifying the blacklist for a blacklist-type transfer policy | +| [`policy.useModifyWhitelist`](#TODO) | Hook for modifying the whitelist for a whitelist-type transfer policy | +| [`policy.useSetAdmin`](#TODO) | Hook for setting the admin for a transfer policy | +| [`policy.useWatchAdminUpdated`](#TODO) | Hook for watching policy admin update events | +| [`policy.useWatchBlacklistUpdated`](#TODO) | Hook for watching blacklist update events | +| [`policy.useWatchCreate`](#TODO) | Hook for watching policy creation events | +| [`policy.useWatchWhitelistUpdated`](#TODO) | Hook for watching whitelist update events | +| **Reward Hooks** | | +| [`reward.useClaim`](/tempo/hooks/reward.useClaim) | Hook for claiming accumulated rewards | +| [`reward.useSetRecipient`](/tempo/hooks/reward.useSetRecipient) | Hook for setting or changing the reward recipient for a token holder | +| [`reward.useDistribute`](/tempo/hooks/reward.useDistribute) | Hook for distributing tokens to opted-in holders | +| [`reward.useUserRewardInfo`](/tempo/hooks/reward.useUserRewardInfo) | Hook for getting reward information for a specific account | +| [`reward.useWatchRewardRecipientSet`](/tempo/hooks/reward.useWatchRewardRecipientSet) | Hook for watching reward recipient set events | +| [`reward.useWatchRewardDistributed`](/tempo/hooks/reward.useWatchRewardDistributed) | Hook for watching reward distributed events | +| **Stablecoin DEX Hooks** | | +| [`dex.useBalance`](/tempo/hooks/dex.useBalance) | Hook for getting a user's token balance on the Stablecoin DEX | +| [`dex.useBuy`](/tempo/hooks/dex.useBuy) | Hook for buying a specific amount of tokens from the Stablecoin DEX orderbook | +| [`dex.useBuyQuote`](/tempo/hooks/dex.useBuyQuote) | Hook for getting the quote for buying a specific amount of tokens | +| [`dex.useCancel`](/tempo/hooks/dex.useCancel) | Hook for canceling an order from the orderbook | +| [`dex.useCreatePair`](/tempo/hooks/dex.useCreatePair) | Hook for creating a new trading pair on the DEX | +| [`dex.useOrder`](/tempo/hooks/dex.useOrder) | Hook for getting an order's details from the orderbook | +| [`dex.usePlace`](/tempo/hooks/dex.usePlace) | Hook for placing a limit order on the orderbook | +| [`dex.usePlaceFlip`](/tempo/hooks/dex.usePlaceFlip) | Hook for placing a flip order that automatically flips when filled | +| [`dex.useTickLevel`](/tempo/hooks/dex.useTickLevel) | Hook for getting the price level information at a specific tick | +| [`dex.useSell`](/tempo/hooks/dex.useSell) | Hook for selling a specific amount of tokens from the Stablecoin DEX orderbook | +| [`dex.useSellQuote`](/tempo/hooks/dex.useSellQuote) | Hook for getting the quote for selling a specific amount of tokens | +| [`dex.useWatchFlipOrderPlaced`](/tempo/hooks/dex.useWatchFlipOrderPlaced) | Hook for watching flip order placed events | +| [`dex.useWatchOrderCancelled`](/tempo/hooks/dex.useWatchOrderCancelled) | Hook for watching order cancelled events | +| [`dex.useWatchOrderFilled`](/tempo/hooks/dex.useWatchOrderFilled) | Hook for watching order filled events | +| [`dex.useWatchOrderPlaced`](/tempo/hooks/dex.useWatchOrderPlaced) | Hook for watching order placed events | +| [`dex.useWithdraw`](/tempo/hooks/dex.useWithdraw) | Hook for withdrawing tokens from the DEX to the caller's wallet | +| **Token Hooks** | | +| [`token.useAllowance`](/tempo/hooks/token.useGetAllowance) | Hook for getting the amount of tokens that a spender is approved to transfer on behalf of an owner | +| [`token.useApprove`](/tempo/hooks/token.useApprove) | Hook for approving a spender to transfer TIP-20 tokens on behalf of the caller | +| [`token.useBalance`](/tempo/hooks/token.useGetBalance) | Hook for getting the token balance of an address | +| [`token.useBurn`](/tempo/hooks/token.useBurn) | Hook for burning TIP-20 tokens from the caller's balance | +| [`token.useBurnBlocked`](/tempo/hooks/token.useBurnBlocked) | Hook for burning TIP-20 tokens from a blocked address | +| [`token.useChangeTransferPolicy`](/tempo/hooks/token.useChangeTransferPolicy) | Hook for changing the transfer policy for a TIP-20 token | +| [`token.useCreate`](/tempo/hooks/token.useCreate) | Hook for creating a new TIP-20 token and assigning the admin role to the calling account | +| [`token.useGrantRoles`](/tempo/hooks/token.useGrantRoles) | Hook for granting one or more roles to an address | +| [`token.useHasRole`](/tempo/hooks/token.useHasRole) | Hook for checking if an address has a specific role | +| [`token.useMetadata`](/tempo/hooks/token.useGetMetadata) | Hook for getting the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply | +| [`token.useMint`](/tempo/hooks/token.useMint) | Hook for minting new TIP-20 tokens to a recipient | +| [`token.usePause`](/tempo/hooks/token.usePause) | Hook for pausing a TIP-20 token, preventing all transfers | +| [`token.useRenounceRoles`](/tempo/hooks/token.useRenounceRoles) | Hook for renouncing one or more roles from the caller's address | +| [`token.useRevokeRoles`](/tempo/hooks/token.useRevokeRoles) | Hook for revoking one or more roles from an address | +| [`token.useSetRoleAdmin`](/tempo/hooks/token.useSetRoleAdmin) | Hook for setting the admin role for another role | +| [`token.useSetSupplyCap`](/tempo/hooks/token.useSetSupplyCap) | Hook for setting the supply cap for a TIP-20 token | +| [`token.useTransfer`](/tempo/hooks/token.useTransfer) | Hook for transferring TIP-20 tokens from the caller to a recipient | +| [`token.useUnpause`](/tempo/hooks/token.useUnpause) | Hook for unpausing a TIP-20 token, allowing transfers to resume | +| [`token.useWatchAdminRole`](/tempo/hooks/token.useWatchAdminRole) | Hook for watching role admin update events | +| [`token.useWatchApprove`](/tempo/hooks/token.useWatchApprove) | Hook for watching token approval events | +| [`token.useWatchBurn`](/tempo/hooks/token.useWatchBurn) | Hook for watching token burn events | +| [`token.useWatchCreate`](/tempo/hooks/token.useWatchCreate) | Hook for watching new token creation events | +| [`token.useWatchMint`](/tempo/hooks/token.useWatchMint) | Hook for watching token mint events | +| [`token.useWatchRole`](/tempo/hooks/token.useWatchRole) | Hook for watching role membership update events | +| [`token.useWatchTransfer`](/tempo/hooks/token.useWatchTransfer) | Hook for watching token transfer events | diff --git a/site/tempo/hooks/nonce.useNonce.md b/site/tempo/hooks/nonce.useNonce.md new file mode 100644 index 0000000000..658dcac418 --- /dev/null +++ b/site/tempo/hooks/nonce.useNonce.md @@ -0,0 +1,42 @@ +# `nonce.useNonce` + +Hook for getting the nonce for an account and nonce key. This is useful for managing multiple nonce lanes for parallel transaction submission. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"0f0dff491f1f51aaa648ec0523093330756da7886231a68a5880eae563132b80","data":"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="} +import { Hooks } from 'wagmi/tempo' + +const { data: nonce } = Hooks.nonce.useNonce({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + nonceKey: 1n, +}) + +console.log('Nonce:', nonce) +// @log: Nonce: 42n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `nonce.getNonce` Return Type](/tempo/actions/nonce.getNonce#return-type) + +## Parameters + +See [Wagmi Action `nonce.getNonce` Parameters](/tempo/actions/nonce.getNonce#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`nonce.getNonce`](/tempo/actions/nonce.getNonce) + diff --git a/site/tempo/hooks/nonce.useWatchNonceIncremented.md b/site/tempo/hooks/nonce.useWatchNonceIncremented.md new file mode 100644 index 0000000000..ae7698f3b9 --- /dev/null +++ b/site/tempo/hooks/nonce.useWatchNonceIncremented.md @@ -0,0 +1,35 @@ +# `nonce.useWatchNonceIncremented` + +Hook for watching nonce incremented events. This event is emitted whenever a transaction is executed using a specific nonce key. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"3c41f7db5af5a58ed8f5640547d78b93c2c5a437602369ef24ea876941670c37","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.nonce.useWatchNonceIncremented({ + onNonceIncremented: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `nonce.watchNonceIncremented` Parameters](/tempo/actions/nonce.watchNonceIncremented#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`nonce.getNonce`](/tempo/actions/nonce.getNonce) +- [`nonce.watchNonceIncremented`](/tempo/actions/nonce.watchNonceIncremented) + diff --git a/site/tempo/hooks/policy.useCreate.md b/site/tempo/hooks/policy.useCreate.md new file mode 100644 index 0000000000..59fa3766f3 --- /dev/null +++ b/site/tempo/hooks/policy.useCreate.md @@ -0,0 +1,83 @@ +# `policy.useCreate` + +Creates a new transfer policy for token access control. [Learn more about transfer policies](https://docs.tempo.xyz/protocol/tip403/overview) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"e13be9674f34cecb6d1efe8ccab1940abeb9e94a06d019450df7b8523742032d","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const createSync = Hooks.policy.useCreateSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +createSync.mutate({ + addresses: [ + '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', + ], + type: 'whitelist', +}) + +console.log('Policy ID:', createSync.data?.policyId) +// @log: Policy ID: 1n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `policy.create` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const create = Hooks.policy.useCreate() +const { data: receipt } = useWaitForTransactionReceipt({ hash: create.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +create.mutate({ + addresses: [ + '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', + ], + type: 'whitelist', +}) + +if (receipt) { + const { args: { policyId } } + = Actions.policy.create.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `policy.create` Return Type](/tempo/actions/policy.create#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `policy.create` Parameters](/tempo/actions/policy.create#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`policy.create`](/tempo/actions/policy.create) diff --git a/site/tempo/hooks/policy.useData.md b/site/tempo/hooks/policy.useData.md new file mode 100644 index 0000000000..c6acd8f9b5 --- /dev/null +++ b/site/tempo/hooks/policy.useData.md @@ -0,0 +1,42 @@ +# `policy.useData` + +Gets the data for a transfer policy, including its type and admin address. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"a27f67c0f419f67e0995e3865a87b2d08d15ce406ed36312f2acb9580f1cc1e3","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: policyData } = Hooks.policy.useData({ + policyId: 1n, +}) + +console.log('Policy admin:', policyData?.admin) +// @log: Policy admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +console.log('Policy type:', policyData?.type) +// @log: Policy type: whitelist +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `policy.getData` Return Type](/tempo/actions/policy.getData#return-type) + +## Parameters + +See [Wagmi Action `policy.getData` Parameters](/tempo/actions/policy.getData#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`policy.getData`](/tempo/actions/policy.getData) diff --git a/site/tempo/hooks/policy.useIsAuthorized.md b/site/tempo/hooks/policy.useIsAuthorized.md new file mode 100644 index 0000000000..6d210af446 --- /dev/null +++ b/site/tempo/hooks/policy.useIsAuthorized.md @@ -0,0 +1,41 @@ +# `policy.useIsAuthorized` + +Checks if an address is authorized by a transfer policy. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"8b9aa7de863db2bb7feb28203f7e1e641e9774ded5f3aee5221a9605f2ab7693","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUWKQQOBwYAJScUKJiiJwARnxyomCcAD6cAK5gsABmpjBQ/lAQ1gh6ACr4MJwyoiKccLnW1vBwhbkyMhicpPAQMiRQcQminIXsnMoNAI65ZBgAdAA6YJubdQ1NLW0dXT19A0NwI2MTYtOz85xLKxtbL7uNzVyHnXDdvf2Dw1GpWuUxmpDm9Qey1Ia22r0h+0+7W+v1OAIuQPG8RuYIhi2hsJeOwRH1ayOOfzOgKu2NBd0hjxhq38InEugALOpjPIlCpEOyNOJtEFaf4TGYkAAmGx2UgOJxIAAc7k8ODwhBI5A0gTw1ggYBajDgAEFcsp2IwAF6lJKpEYwDLZPIFGDFMxlKgVKp4N6IslHH4nf7nS7A2m3cH3RlrFmaXSqACMsh5yiQCel1CFOiYJrNhFIVtKYpKUpl9kcfkQCfZKuoXnVvi1AXoTFY7C4BkEsbZSAAbIrk4pU4guZphXhO0ZxeYM7ZywrEABmBO1zBqvQavzalt6FhsDicNgmawYbsSRAAdgF3KHfN7gq02b0R8YJ+LEsQs9l8sri4vq/rDdG38GgdxAHowEcRh9TyOAYAASVzc0C2tKAAB4AGF9WKBQKBSNIHTAAA+UJ7GYHQyDgAB+JJJ1WF8T1WXI4MQ01kMLKBVgABTIijSDgTDsMYXD8PtDIiOiWi+EEeiRlfNZmIQpD8w41YACUdFyUgwAANVEGRljQu10mIzYwFEci4CwBwGkU1i8wtVDykqap9GkiNOFsGBrH4UwFE4RhCk4KZFPBI1goclDgWSAYpgYmNBQUapkGQEA6AsrA5H8AADXK0DgWhNj3dtOGAHhpLgThXGmcJmE4AByAB3UQFGYRgAHoaDbeq4QgqCYONLAsGCWJgE2ThPP1FoytpPCjQAGQgUQoD8qrOAAXnKwxZOPBSWOUxzSmCMbMgmw85JPeCoCSSUwAocaztCpJ6osWhVne+r7tO1xojhCbAs4YIFqWlbFFiIY0C0zI0JWogiMW5a/Pe1Y0Pa2GiIeiGoc4GHGDhtiVNQpJgHDKiGoATXgerOGegA5CB6tcVH0c2VxNly7KQAAXQoVLrLlZh/H5iy+MqgBaTgeIF0XmR51Kse0owAEUCXRXouEaxhlAi9jLQSaDMlZSG4FlnmQFZc9FSTG9eTTUcsyCOyDqij1jBLT8yzlCtnHZGsPDrdcfE1ECdT0UJwkiTBYlCmjOGy16ABJgBEAtFFcbKnXyIoSldr1XIAVTg8Flqgc5KrQCBPPqHzmWEOM0wsa25FvJBrzHJ8QFC99zEXT2f2cSUAMDzcm1AoJw4iMgo/O3artj5JhNMLgciz10c+c709C4i6BnggARWvzfrqtVC5ZvbcQAdM0fIJ4qu7vW7772pSH7wR5DsDzMs6zOkmg17U2EQcQf8MQwCSFhf+WVPQuR9JCbKepIEwAzswaAvQGhhGIIwWAlUphwD3HIOIMBki5AUAoVaCDQEQgSAFSqeC2pNEjJXeYmwABSoggEAGVrAFiwFwCh9pODkTnGAI0dUMFECwdFAYjUiEpHCI1IuJs4RvBQVANBnA6D7nynMRqlcrLeUCq+SabYzBgHyogOEAAqTgxo44QNARnaw+xKqa21uRc0UBaHtHwMFSq8Cpr2lWDICACgRrZTwv4xBqwyDhFIGE4KBQ478LkKsZq2l4nKGodYR0yRbJwXGBXTgjUCw0DmJXDIAx6awFWAAK1oWgIYFlnjWNsQoYJyR9JJICXIDOphWSQQaAgnCWlgSFOKVrBohTkDZQwSiVYIgKhmmylzYI+A0BoCwHARA7V2qQFgHU1Y7AFBoxcu1JoNARBiyIJKdkqxaDtVEFgDqsyuirDWcwGQABiF5PwFkQDNLEDIUBNjTJ+SbBZMTlmrPWZs7ZuzoAwAOUck5VQzkJHgGgK5Ny7kPKee1MFby0AfO+eEFEELSCkGiKsTgbw2kQA6TILpiDHE5LycCVxhAzQBTbBwVa9xsp7LAckpBgjUEpLhAAfUsZYgA6uIERihpUSqSLS9pnThWcHpTU7yaB6qVXcYQTxwUhicDMFreo4IKFGhoGY/omw4AYEgvgcIkBmKNEYPwSZkJkjyKLjYriiE8RUjgswZIcg8KQGLia+YAwrUiHkGgO15kHVOpdf8yqJhPXBT6Jq+Y4IqkwFqfUxpzATacA4TAL1DRpmQFKTBMFnB4LtQAPJQrWRsrZOzBVIq0CiuAaKLmYuubc+5jznmktee8r5ogxa1pgGLfUYswVi2grEMEmwUEmtMGCZg+t9TPE2AAUVoBlAhzE+WQjpQyplDiLEvA5nUzYwqgkhOCPVeofRK66NIDIKA9VogAG5Ng7MlqncxnAP3BKKewX9eFCl/LNE+7phbgmhPfTAT9nAACkcBPoNW/b+/9QGwAga4mBrZEGMNQYI1AODei0CLLQEhqJMT2DBDMI1Tgh6KVsfqjKwgEQ4B4QuAa1aHTxh2CGvIUo/7APAfaqBpelVWPgksnAFqDQgWtDED5OYXtJn0dgBSu9IGJrcdiUkfjfBNnCYgKJxQKRloQceTgd08mzoTWocgGAQCZBcxHCfdzHnqFcJ4WgVYpB8jwTAHUI0ECx6A0FYgIgzAqyLklFWRUv0SMKeC1wZtyRtWOAi1FmL+A4v6gS+xhFyXUuLgsJIJcWWgtnWoUlpeZBzIyHxROn47U6DeTNAbS8F4qySBa55rg3nfNczFsUlzZBEC9k/JKCbwUuA+f0qFxgvDEs1Y69pfSPXKhdH67QQbaBhsXmW72Cw2XTOta4O1sxnWju7tMP13zEqU5+U/IuJccIKFPZFhtBqMrGA5rUvSvp+p6rEefWksAwRsp7wyNocEScv4wFcAAQk4KjxQZAcfZTkzlxTZiKME/R5wcHkPof/zAHjqnRO6PaaM6QdmuU4THtPXki9DRsr2PtI45xd7OfZUfZBKaXB/lcE2sKDhDSHTMA4XZmAhBGojXh9LjRFLQcK6VxZVX5ENda+Yy0ZgGAhcEM2hxkBgTrcwGCLLvCMTScbqt8hl9aHINfpg3+0npHyNJF99Bn9tGymasQ2AS3jvvdvtDzhvDTV/dEfc2RpTIeqN+/D6z2XHu48qfYzATj5neNWcE7Z+z/lxPOak+6WTxGg+Z84MgMvpBLMCZs60NXygxNOck650oPNI8xMBzrrHoO+MQ8ZVDheDO4cF694j5HzOMfACx7j/HaOick6bwpjPFOkhr5pzPzgc+YeM+34T0gOPWdj7ABzECLVkqpTgrgKgyALhaU6Cs9tsKdkyFlBchkhVg9RmB4V9l+1BV2ow16V2ph0cUTBkh2pn06lohuYzYLZdAEwLxe4bZhwLwHxxw9BhUH5Lwn4FwLBX4Gxg5txx4DVoBYg49UNgg1MNNY4Kk8JkYIhLt9R9IpYLIKMKlkAuZJJOAiAIAsFAYABqBMTVTUYJZaDA6BTeEAQ/bRQpbKBDNADODlU1EvacalAAWXVh2wISFFyHIgp08lZUPGaHyTwn0OYTAGKH4i4EUnGGaDxEPALF3RhEES6A0wSS8JzRLi1gNk6U8N8TJGSBEC1iG31EAX0mWFoRYAh2ASmRmTA0KGCEXGiDbRhThV3TAAvEOV7XFFyHuRKKXQ037RKMXB6yXkKFWEXEJQ+Wy2CHuEsOsO0XEE0xzWsh+FGUrmmSGxkFWB3QSDCT/xhU7UgMRRNmRTzgHQxSxRHVxQ6nGPaK+XGKmLQH2LFiFDgGiCpThAfTgHNz4X+TMVB1UG1yiVYPqj1HyDQCSCwz/TwheLMUDwP2D0mleKSHUEjx0PN0CSeO+LeLw0hN+PJ3A0hKBNZ1BMfy5xeArWrWym2P2JmOhQ7ThW7SWN7RWPOTWMQNHTxW2KnU+T2PYF3QONpISCOK0BOI8k3QaG3QZL4LAEPjECSiQBSnNlME6H8CIAsFWATHFIsAsEwLrh7EyybhTD5HwPbiCFQ3IKIJADnC9gXGVH9jXDfmAnoN1B1yNAJkOmulEhMkzhdDdCLFUNcl9FJC+ApDRBDExBBA8ijAJEPmwKlAsHwPPmHHTGII7lNMig4nVMoN/GoL1MAkzAUH8CxzwDVNlPPElFwMHAvisGbCCEDVEHDKJj02WHIOkE1O/GfksFcDNj1FgFbC0VKi2kEDWkKFqnwxajak6hgG6nHwNC4BmkmCSDDN1mBGqk2joniiYn2jNJdmOgeiegaleivElCgEXFUAwmsF7F7EXHZAwgsFUHS0kElFUFEEXGSEVF9gACFrBJAYALxVBJBVBCgLBkhD1khkhPoHo74LSEw7pWZsswSUkni8yCybQ8MhzCZShst/B3FRAkBQBAh5A8F9Q8B8oQBXBXAgA="} +import { Hooks } from 'wagmi/tempo' + +const { data: isAuthorized } = Hooks.policy.useIsAuthorized({ + user: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + policyId: 1n, +}) + +console.log('Is authorized:', isAuthorized) +// @log: Is authorized: true +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `policy.isAuthorized` Return Type](/tempo/actions/policy.isAuthorized#return-type) + +## Parameters + +See [Wagmi Action `policy.isAuthorized` Parameters](/tempo/actions/policy.isAuthorized#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`policy.isAuthorized`](/tempo/actions/policy.isAuthorized) diff --git a/site/tempo/hooks/policy.useModifyBlacklist.md b/site/tempo/hooks/policy.useModifyBlacklist.md new file mode 100644 index 0000000000..9c6b6b29d8 --- /dev/null +++ b/site/tempo/hooks/policy.useModifyBlacklist.md @@ -0,0 +1,79 @@ +# `policy.useModifyBlacklist` + +Modifies the blacklist for a blacklist-type transfer policy. Requires policy admin role. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"8612238fb35eb7ea94d9d2808311c32ba32c9e01a54e93a2838af6a38747928f","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const modifyBlacklistSync = Hooks.policy.useModifyBlacklistSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +modifyBlacklistSync.mutate({ + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + policyId: 1n, + restricted: true, +}) + +console.log('Transaction hash:', modifyBlacklistSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `policy.modifyBlacklist` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const modifyBlacklist = Hooks.policy.useModifyBlacklist() +const { data: receipt } = useWaitForTransactionReceipt({ hash: modifyBlacklist.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +modifyBlacklist.mutate({ + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + policyId: 1n, + restricted: true, +}) + +if (receipt) { + const { args } + = Actions.policy.modifyBlacklist.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `policy.modifyBlacklist` Return Type](/tempo/actions/policy.modifyBlacklist#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `policy.modifyBlacklist` Parameters](/tempo/actions/policy.modifyBlacklist#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`policy.modifyBlacklist`](/tempo/actions/policy.modifyBlacklist) diff --git a/site/tempo/hooks/policy.useModifyWhitelist.md b/site/tempo/hooks/policy.useModifyWhitelist.md new file mode 100644 index 0000000000..576c8c88d1 --- /dev/null +++ b/site/tempo/hooks/policy.useModifyWhitelist.md @@ -0,0 +1,79 @@ +# `policy.useModifyWhitelist` + +Modifies the whitelist for a whitelist-type transfer policy. Requires policy admin role. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"7679b70c1a9955fc42af8bd9929c68a4bdb7d8b9fde73dc5c771f97554c0150a","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const modifyWhitelistSync = Hooks.policy.useModifyWhitelistSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +modifyWhitelistSync.mutate({ + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + allowed: true, + policyId: 1n, +}) + +console.log('Transaction hash:', modifyWhitelistSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `policy.modifyWhitelist` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const modifyWhitelist = Hooks.policy.useModifyWhitelist() +const { data: receipt } = useWaitForTransactionReceipt({ hash: modifyWhitelist.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +modifyWhitelist.mutate({ + address: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + allowed: true, + policyId: 1n, +}) + +if (receipt) { + const { args } + = Actions.policy.modifyWhitelist.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `policy.modifyWhitelist` Return Type](/tempo/actions/policy.modifyWhitelist#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `policy.modifyWhitelist` Parameters](/tempo/actions/policy.modifyWhitelist#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`policy.modifyWhitelist`](/tempo/actions/policy.modifyWhitelist) diff --git a/site/tempo/hooks/policy.useSetAdmin.md b/site/tempo/hooks/policy.useSetAdmin.md new file mode 100644 index 0000000000..2694452f42 --- /dev/null +++ b/site/tempo/hooks/policy.useSetAdmin.md @@ -0,0 +1,77 @@ +# `policy.useSetAdmin` + +Sets the admin for a transfer policy. Requires current policy admin role. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"fbe0fb128f663b81203c3f14323f7bbd58a2ebdc7f33ada3627157b6f722bbb1","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const setAdminSync = Hooks.policy.useSetAdminSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +setAdminSync.mutate({ + admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + policyId: 1n, +}) + +console.log('Transaction hash:', setAdminSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `policy.setAdmin` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const setAdmin = Hooks.policy.useSetAdmin() +const { data: receipt } = useWaitForTransactionReceipt({ hash: setAdmin.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +setAdmin.mutate({ + admin: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + policyId: 1n, +}) + +if (receipt) { + const { args } + = Actions.policy.setAdmin.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `policy.setAdmin` Return Type](/tempo/actions/policy.setAdmin#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `policy.setAdmin` Parameters](/tempo/actions/policy.setAdmin#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`policy.setAdmin`](/tempo/actions/policy.setAdmin) diff --git a/site/tempo/hooks/policy.useWatchAdminUpdated.md b/site/tempo/hooks/policy.useWatchAdminUpdated.md new file mode 100644 index 0000000000..5269f9d5c3 --- /dev/null +++ b/site/tempo/hooks/policy.useWatchAdminUpdated.md @@ -0,0 +1,34 @@ +# `policy.useWatchAdminUpdated` + +Watches for policy admin update events on the TIP403 Registry. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"c97041b0026ec81821f4e52786e61b498aaf99fd2e23ce80fa9483d396001836","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.policy.useWatchAdminUpdated({ + onAdminUpdated: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `policy.watchAdminUpdated` Parameters](/tempo/actions/policy.watchAdminUpdated#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`policy.setAdmin`](/tempo/actions/policy.setAdmin) +- [`policy.watchAdminUpdated`](/tempo/actions/policy.watchAdminUpdated) diff --git a/site/tempo/hooks/policy.useWatchBlacklistUpdated.md b/site/tempo/hooks/policy.useWatchBlacklistUpdated.md new file mode 100644 index 0000000000..b57aa6db68 --- /dev/null +++ b/site/tempo/hooks/policy.useWatchBlacklistUpdated.md @@ -0,0 +1,34 @@ +# `policy.useWatchBlacklistUpdated` + +Watches for blacklist update events on the TIP403 Registry. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"2b35d7c59b68fad10378a67e4629e5fec424fa0a78d71f66ebd0b164e0ee522b","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.policy.useWatchBlacklistUpdated({ + onBlacklistUpdated: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `policy.watchBlacklistUpdated` Parameters](/tempo/actions/policy.watchBlacklistUpdated#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`policy.modifyBlacklist`](/tempo/actions/policy.modifyBlacklist) +- [`policy.watchBlacklistUpdated`](/tempo/actions/policy.watchBlacklistUpdated) diff --git a/site/tempo/hooks/policy.useWatchCreate.md b/site/tempo/hooks/policy.useWatchCreate.md new file mode 100644 index 0000000000..964c033c3a --- /dev/null +++ b/site/tempo/hooks/policy.useWatchCreate.md @@ -0,0 +1,34 @@ +# `policy.useWatchCreate` + +Watches for policy creation events on the TIP403 Registry. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"410c78052455bb6978da5eacfc5719ebc1462a6449aaa6683f5090198fea83d5","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.policy.useWatchCreate({ + onPolicyCreated: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `policy.watchCreate` Parameters](/tempo/actions/policy.watchCreate#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`policy.create`](/tempo/actions/policy.create) +- [`policy.watchCreate`](/tempo/actions/policy.watchCreate) diff --git a/site/tempo/hooks/policy.useWatchWhitelistUpdated.md b/site/tempo/hooks/policy.useWatchWhitelistUpdated.md new file mode 100644 index 0000000000..63cb6e480e --- /dev/null +++ b/site/tempo/hooks/policy.useWatchWhitelistUpdated.md @@ -0,0 +1,34 @@ +# `policy.useWatchWhitelistUpdated` + +Watches for whitelist update events on the TIP403 Registry. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"2c18a2554a7d5904a09f15c11717794915bec94d2536640e09fff9a27cdf3002","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.policy.useWatchWhitelistUpdated({ + onWhitelistUpdated: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `policy.watchWhitelistUpdated` Parameters](/tempo/actions/policy.watchWhitelistUpdated#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`policy.modifyWhitelist`](/tempo/actions/policy.modifyWhitelist) +- [`policy.watchWhitelistUpdated`](/tempo/actions/policy.watchWhitelistUpdated) diff --git a/site/tempo/hooks/reward.useClaim.md b/site/tempo/hooks/reward.useClaim.md new file mode 100644 index 0000000000..810c3e581c --- /dev/null +++ b/site/tempo/hooks/reward.useClaim.md @@ -0,0 +1,70 @@ +# `reward.useClaim` + +Claims accumulated rewards for the caller. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"9473592640bf3f33afde9fa50fd54b096479002e7102d5dd65de5dc109750e9f","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const claimSync = Hooks.reward.useClaimSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +claimSync.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', claimSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `reward.claim` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const claim = Hooks.reward.useClaim() +const { data: receipt } = useWaitForTransactionReceipt({ hash: claim.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +claim.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `reward.claim` Return Type](/tempo/actions/reward.claim#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `reward.claim` Parameters](/tempo/actions/reward.claim#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`reward.claim`](/tempo/actions/reward.claim) diff --git a/site/tempo/hooks/reward.useDistribute.md b/site/tempo/hooks/reward.useDistribute.md new file mode 100644 index 0000000000..638105aaae --- /dev/null +++ b/site/tempo/hooks/reward.useDistribute.md @@ -0,0 +1,80 @@ +# `reward.useDistribute` + +Distributes tokens to opted-in holders. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"59eb218042188d5a1a816d7393c55eedf583a5a887465c49947319b9a1e69626","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseEther } from 'viem' + +const distributeSync = Hooks.reward.useDistributeSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +distributeSync.mutate({ + amount: parseEther('1000'), + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Amount:', distributeSync.data?.amount) +// @log: Amount: 1000000000000000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `reward.distribute` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseEther } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const distribute = Hooks.reward.useDistribute() +const { data: receipt } = useWaitForTransactionReceipt({ hash: distribute.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +distribute.mutate({ + amount: parseEther('1000'), + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { funder, amount } } + = Actions.reward.distribute.extractEvent(receipt.logs) +} +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `reward.distribute` Return Type](/tempo/actions/reward.distribute#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `reward.distribute` Parameters](/tempo/actions/reward.distribute#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`reward.distribute`](/tempo/actions/reward.distribute) diff --git a/site/tempo/hooks/reward.useSetRecipient.md b/site/tempo/hooks/reward.useSetRecipient.md new file mode 100644 index 0000000000..0ade1de332 --- /dev/null +++ b/site/tempo/hooks/reward.useSetRecipient.md @@ -0,0 +1,79 @@ +# `reward.useSetRecipient` + +Sets or changes the reward recipient for a token holder. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"6ec8763ed98425976535a0643a503c69b548f0ee8e4e50dad055f48586543f87","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const setRecipientSync = Hooks.reward.useSetRecipientSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +setRecipientSync.mutate({ + recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Holder:', setRecipientSync.data?.holder) +// @log: Holder: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 +console.log('Recipient:', setRecipientSync.data?.recipient) +// @log: Recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `reward.setRecipient` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const setRecipient = Hooks.reward.useSetRecipient() +const { data: receipt } = useWaitForTransactionReceipt({ hash: setRecipient.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +setRecipient.mutate({ + recipient: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { holder, recipient } } + = Actions.reward.setRecipient.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `reward.setRecipient` Return Type](/tempo/actions/reward.setRecipient#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `reward.setRecipient` Parameters](/tempo/actions/reward.setRecipient#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`reward.setRecipient`](/tempo/actions/reward.setRecipient) diff --git a/site/tempo/hooks/reward.useUserRewardInfo.md b/site/tempo/hooks/reward.useUserRewardInfo.md new file mode 100644 index 0000000000..fcc08c4730 --- /dev/null +++ b/site/tempo/hooks/reward.useUserRewardInfo.md @@ -0,0 +1,45 @@ +# `reward.useUserRewardInfo` + +Gets reward information for a specific account. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"b99d265574b0d65166a26926a44acc97a9953933b2ed8abd0b6af7abb3256072","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data } = Hooks.reward.useUserRewardInfo({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Reward recipient:', data?.rewardRecipient) +// @log: Reward recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +console.log('Reward balance:', data?.rewardBalance) +// @log: Reward balance: 1000000000000000000n +console.log('Reward per token:', data?.rewardPerToken) +// @log: Reward per token: 385802469135802469135n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `reward.getUserRewardInfo` Return Type](/tempo/actions/reward.getUserRewardInfo#return-type) + +## Parameters + +See [Wagmi Action `reward.getUserRewardInfo` Parameters](/tempo/actions/reward.getUserRewardInfo#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`reward.getUserRewardInfo`](/tempo/actions/reward.getUserRewardInfo) diff --git a/site/tempo/hooks/reward.useWatchRewardDistributed.md b/site/tempo/hooks/reward.useWatchRewardDistributed.md new file mode 100644 index 0000000000..1dc7570c85 --- /dev/null +++ b/site/tempo/hooks/reward.useWatchRewardDistributed.md @@ -0,0 +1,35 @@ +# `reward.useWatchRewardDistributed` + +Watches for reward distributed events. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"802abf398fe8f0c7b5d0b17bdfce85c29d28ef5e8d8bbd8b8bebd7ceec8598b4","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.reward.useWatchRewardDistributed({ + onRewardDistributed: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `reward.watchRewardDistributed` Parameters](/tempo/actions/reward.watchRewardDistributed#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`reward.distribute`](/tempo/actions/reward.distribute) +- [`reward.watchRewardDistributed`](/tempo/actions/reward.watchRewardDistributed) diff --git a/site/tempo/hooks/reward.useWatchRewardRecipientSet.md b/site/tempo/hooks/reward.useWatchRewardRecipientSet.md new file mode 100644 index 0000000000..157cf501b3 --- /dev/null +++ b/site/tempo/hooks/reward.useWatchRewardRecipientSet.md @@ -0,0 +1,35 @@ +# `reward.useWatchRewardRecipientSet` + +Watches for reward recipient set events when token holders change their reward recipient. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"28f0780d1d18e58ea2ba233fff27ee55459d9d43aeb92be79062c38ef7f6b813","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.reward.useWatchRewardRecipientSet({ + onRewardRecipientSet: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `reward.watchRewardRecipientSet` Parameters](/tempo/actions/reward.watchRewardRecipientSet#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`reward.setRecipient`](/tempo/actions/reward.setRecipient) +- [`reward.watchRewardRecipientSet`](/tempo/actions/reward.watchRewardRecipientSet) diff --git a/site/tempo/hooks/token.useApprove.md b/site/tempo/hooks/token.useApprove.md new file mode 100644 index 0000000000..d43f9590b0 --- /dev/null +++ b/site/tempo/hooks/token.useApprove.md @@ -0,0 +1,85 @@ +# `token.useApprove` + +Approves a spender to transfer TIP-20 tokens on behalf of the caller. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"2bf003f5493f7e541fe74b232dddbd8b378080a8e7358ad94560ea26b9b9c7a7","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKRE2ywJ18AGUMIkygZBHC0AJ5HC4pkAIKFxUkUuJOEAJR0cVIYAAKl4ADwAYRSMV6NQS/EgAHcwAA+fwicS6ADsa9kvuUSGBMeowZ0eFELZLZes/hMZiQAGZY/ZHH5EAA2ZPULxp3yZgL0JgjMWVkYK4SC4+5yIoO6IN6mghnggGXlGt73vGj7OCab6YKmejpn4Wa/noIqjJwNb8PIy4elIm4+hB/rQYeQQkWRkbXogd4gLYD6JogRqvh475YT4GYctmejxIklypA2MDNkWbbnqO46Tpw05zouwTjAKOhkHAAD8FZ8FWjFgPWTannJHYAAr2MwWkTApYATtUylgDOEDzguXQ8AZcDVrWxlSTJrYwO21hdj2faDjg9mOVOLmqQuQxgJpcDpNYQIBWZwXnv41ILPoBmxOwBayVUdwpfIsCkMREDEfGYBwDETz9gAkhZJrVaR9UImAQwAHIQDQZT9vgjCyqNZXnvgiqQA2WIFcoohcLOojTIVVXKECeyiPVCbJD15w1R0nCmNYMhxLAUDXKkOxtDIcz8M8MAxOwQJHGgva5AcOynN8mRwhyohckgPJ8rQAobLgVAAAYw/ktBDIRYoSoBcoKkqqrLQozCMPiNAjJq+1iUkVwycE0TAEMnCcLm9VcBKzB0otMA1KNFkVaV8oALxeYYvmdSZ0mZSFZNalTb0feClNU5wQ5tHSNb7dL0spCOJjWPwnPAGTnCcwunAMxcMDBBK5VgJVZQqhYtBwjbZrbMwEAJGgZSghYqSuJErhS0rUCjaIt0wFAmus+zihe6k0sJRHSuBb43sy/ics4ikUdU5aYDhzDUMuhQvIacw/j57ZsoolZ8Y2U4Pk57y4t9kYywXHthzwCsaD/a67qrruFhseBfq7gaQZaEeegZbJWWJAhLFsRxKFcTeRoYR+2FfsJ+HsXmXAnuPIX6bzRkC7H5mhd270RcOY4OUpKluYu5Fd9xFhGluNG7vuMEjyA29BSFU/mM+yEExPgsEvASOFvw0HXupRUOAOAYGiAbJmZRCjiEYP7OQmJv5nkstZYu0VegLhqBALAEldJlAbkzAA8iQvacAhwU2jtcecZAyhQytgAEmABUKorgoYAG546m3NpwNhtBOHcLDvw+OApHbnG6L0foAjGFHDSusZ2nB+x1TgLtFI3ZVEkKUe4TgAAhQEABRUgipSCRWZsVH+544Rl00pXfBChCHOVcu5TgAAfZysAJxmCgNEXWnAiAQEYFAHKGI8DDSBIgiSsQEjE1SBgR21NtrpJkDITgs48j4FCag9BWway1V6Noda+A4mMwSdtS6xCJJhBkK8QghgrrbCgL7Bp2TrCNIBOra4NC8z/SDEDFAedrL+CKJUIpJcNGVIKdMgOsoIBtAAFYwEcNVSUcBZQlI2iI+Je0ABiYAobt1ziAfO/h6m0LhCkYscRrBpR2ZwFEw1xpEwSbkrJsRGBHByZU1I+zDlXHGnAR5zyGorG2GbHJjAflHXSDswOxF5kgrACqWUpxW7nPGeXa5gyuopAsVY15cyPlJK+fC7JE5/mMFuMC6pTd5C5idtpGFnAyCktqXChFQIkWZEuvsrl7BcWXImVQG5Qz7k6DQHIS6byRqyk+U3b5NK/lAlnIC1FVTG6gtlDAPJTxwVPPgFCrJrxGpoFsCioqLLZGVw5SKqqPLEUREFZyo1FSgRQEWjsO1ljRXVxAEcZg4hBD+BRM1W4qS4j61EKRfWrd1hyGbgARxKCIOANQob3IhWaqGvL1X/JSE07YMQnA6s4DIJm+Yek/NjWqOJohYDdRRI2H5+z60yD6Q9FVeZwS5rAA801OyoY5uJYG0g46REypxPKqG0RxBAjCRExJ4laE1B5fs2ugSClnU1dSx6x0FCQCOFAduboQDAV0EaYEg9qL9xfEPWCeh4mQ2MIhZ97E4xAOcMCRefFMLeHAWvII0DiFkEwEuh2Tt5F9HOPfECRojTej7pBABB5h5BBkU7P+SAqKzz/UgQDKYQOrzwuBsIaCoiSgmLqfIKCD1lAkU5OoDQZCYgeB0UgnkegIcGMMUUYwpThhmNEpYyaNgkllDsVjzcTjwBhItJuNw7jcaeC8N4jAPictoN8GEfxniAhBGCCEFgoQ/FhN1ZEaIMRlGxLiAkRISRkgpFSDEtJ6R5Bk8yUTMoAajJBvyQUH7EZ0zo6yVa8oYiKmVGqVzBMhhhhlPqW0dsLRWnxDaE0Do8tOg7teii3Eby923P6QMWHX3ivo2J/DiBCO/tQt3UB5GhKUbwBB2B0Hyg4DNiwzgAwQBWzXMaKAN5VAjmsM+Z8N4DQjgsKoBekhUOiBvG0AAHAaA0xjrCSBgGuVQkhVAxAsG0MxbQ2hDaQ7e1QG2X5Pqoh/IIQjcKfpYvdn9nEnykf4m1t7kDwNFm6/Ajq8gyhDatiaaweXYdw/hwju013O4gRvMCND5W1Avs/kZer0gvtzx+61z87WfxBCSjZFKDggQ0zgBAOQQwpnUzzPT0onBL506FFQXKMT5lQ1p6zwtDsoArH5a2CJWw5MilTbAOWCgEMKGZ/VVnqLFrHVlHAFg8LxBbI2kMAAUqIIoxZrCVBIUrzncSNl2FyHAZUJULrPFeLOGAbRniKlnJkCYNmBxougKLvTwndmzhquVeoE5rDM5GFZpoWoABUnBGwiI54L6mNaXm5OUPrHQhAoAa8efkiIIiBdyDhHdBQZMZ385Z6X51leYWXWr8r0vy0+z14WlwHpqQjpSSFTVWclQaBbO2q8fqrbVka72DAAU3UE9J4UHdAE2Sm+W8LaYFciQaeKQUL2FFJSB95E2jVZAUMiyQvJGgWYdIobOmCI5vEiBCSQFgBPu5WgPM0hrTQEQSIiBGgNHCLQPiCeDjGfmanCNiMwDIAAMRgE7IiBX6wgN5DAn5wE+QIFco35344gP5P7QAwCv7sAKAf5wD4hf7wBoC/7/6AHAFYCgGKjn6QEwFoEYGWLwhzJAgL4rJhDF414wCFpd7Hq95wrKCOxcDhalT7JQzP6lAl78H6z+6l5agAD6ceceAA6uIJ9AoGocoUNPMlwUvhbirisuso4JitnqIXntsP8mYF6hbqNDQOcE0kMHAJNNNI7LKCYImvsm0B7l7onhZM1LspUq8KcKSAHDUGejYZtKEQ4SIDCC4UlG4YkFNCkJ4dWowImo0tcBtFVGPjAHCBPrsEcAKD5JwMWDALEUCCfpAEPlcGgZwM1PiJQlgffs5jIYQe/rlGQbWpQX/gAUASAcyAweAUwdAaIEiHUTAEiCkEiGgUiMkNEM9KQEMA7HSg5OwGGhJD7mYmDKFspJrgcPsoYTwSvoLogFqFnBPkMHIWXhABXiqJUlkv3uwDIFACqJEEotaBZPsPkA5jAC8Tkm8VADUCUggWIbcXwfcY8c8XdJwAAKRwB2wqgh6kDvGfHfHZa/H9CYhwmvHomglbIQl0hQnN6FF15mCzicAkrsD6jqEtJ4g1B04VwjQHAAiXR2CFjyCByfFfFZacA4nnAGpTrZ47KAxAg8orj9JbRpTEmX5cqXFgDWhUy0mkBlAMl8BMnlBKg56lQclYjbw8lQAClKxq7IAwBFAyDOhQQBiqCmnSxq4m5m5tykAJDNS+6jSXyA7ggyGIBEDMABgLwBgbbpwqmOlcCUJrIbKunumelwDemBC+n4H+mBk3gWCSCsShkOlUxq5+n9BkBJQyAjFzBmr4h0AbJ0h7QNZrgBiSA5nbBcAWlWnOhIgD5GnqnPjcRGgNlq6WlhDOlqLJmwCIAFl9hhAlmQrlm0CVkSQNZdnPgWBhnZZmlcD5nnCFkTlhqmDllWnKGsYlasRai05rmaQ6yqjqFHqdgrLr4pAqhKJ3Gt5gDBBQyojbTlKcCcIU4wCuAACEaI75ZAv5i6WJgpfxmIb5igTwl5Py15PQyuYA/5kF5Sv5YJoeCpliQwWcWoex4MqaDYkhfOKecgAh6ese+01xcAZJ+YYh55IYxYU+AoxYuphAs4ZMD5m8nKlidFOgDFpRzAzFNkrF7F1FXAzAGAxFQI3MVJxhpeklwQYhNQXK/J+04lklMJ+o+JwJhJmJApQp/xWIgJ8JaJ7xaF1wpJYAal0J5emlRlNUSJKJJlHxKlPx4FAJQJTlZlkJllEl0JlJMA1Jap9JjJ2aOprJ+pLahp3JgSfJoF+lmIyAapGpIVzJupygEVnJRpgSboWyXKx5nF3555KoMF2ScFt5GKSiVl5JcIT5L5yFTwX5mkf5AFUFpAwFLl2JblLVH5JVnAZVCFSFgFbVZleVpyMMgW3IvImQH6yAdOvYaUt+7Rj++IfQygcQbQcIuYzA+InRpBMhici+RI1BQBJgbQ+IdxE+kQLoV6N6t4a4z8j6kET29EOYfB9WAGgCzWlgxOK8pOgOnWrJ0A0Q6lNllO2i2gekMKGANQNsdyhKYQTizAmCYAGAyAzonkq6l0wQAA1MCNcBmHdC2lddzhJiAPFVslDCSWgIWpnvklSVeIUZwMsKsCmpKVoK0DCLKIIW6sikSbTTqkMLSvmMIUXvsicA0KQK8GDRKQ3tsD8i2p0ntDwSLfnm0CIHkFWSkIzsUFsJrtjDWutMfqfn8TEMEDeJEG0TgctWGmAGuG/sQVeHEEATbfMRKaQTbTeCMf0DEHCDeBAWgFAenMEPssGBzcKTEXLdkgKnvkbVWTIHCCsdsZXotTgR0fgV0cQT0eQT/gMTQcMXHf7VAdAXHYnYtKXZQcGFEPCFcTDDcYkJxayr8NzKoBxdVTZSqI3eogiR8TUJ3R1WBbiWUJ3WUOoPKYgdRazhpR3Q6ogHbH3XFV1cPZwKPeCZft5dhftJUTUVDAXeXcndgU5stbtfbSQb0d/v0cdbQTjAXeMSXVsWXffRXVoLRisQoRseXXtMMgeEFlNSdB+kQBYHCMCEA3aNdSjroDeBtlYI9f6GxM9ngOXu9Q9URl9Rtj9YJADiJBvLTHYtgtYHvIZH5IfELA4qfB9DYq4rFJ4nfOA0gAaBYA+uhhVu/C9XoFgsfEg59fPL9sBiTpg1AsDlBqDr6mIGUAwkrLfANqIuInsDwlIowq9uqSIhwlwrI5IkomabBnIs8AoucBo9LCooaiQkNFojomAHokY2gIYj4n4k9FGJEiTfMLzkCOnlwCapCvEBas3JziQJdCIzsK/YynqsZFqEMLEtWhEG4/mjsp42WqcPTr47UH6mtFWuij7mE/Mq4+UNE+anE/AAkyiv4yk0EypikOk77i45E9k6Ork2EfkzIIk0U4E2ikymUzdnQ8CJhkw3Q9jkEP45wwTsRogNtug6Bh1noF1kIzBjPTowJjYwkP4vY+08Myhg9hhr08eFowwMxNGMg01lxKoCAkBsvBgxAlg9+VTnKXIdrVVHIWUJJVEk43oOE+cSRQoSLqmg7pLuUNLj6q7nEPLqVHIaruIRrlrgbbrpUgbkbqIIOebsCzZBxLbvbuLo7lpi7m7n4W5F7j5FqOE8LgHlCBwMHqHjgOHowJHltQZsKUqUMHPsnnwaRe6iIfkoDdYSaoXrKK84UTZRbTmncXXhbbLdyzVVoe3nYJ3hkj3h6vvoPkflDZwAUUUZPvxbPonpwKccvnIWvrTNtFc9vrvn3jknK1sqgaMTshfogZbYfXgS/j5EQafdnRfYMVfZOWMQHcweazsmvXSEumbCgcbaWRa6wdOinTaztenfa90Z5k61QS68MWgYXZ60G965VLxnCBwRq4vmcdq+kt3ulB6rTbRRIccXzn6bmwS0oftKoRoVoVULofoZwdm90nwdcNGeYbKGy7JrYYankfEU4XKhgK4e4ekbNN4dUe7ti08I2EESETAHU5kO0HIFEUVMujqq8LTo4YkUO8kSOzNF4VkZKT8gNJUvkfgcqyUdPkjRm1vVWrUQNECA0V600S0da7gRG3ayfVnX0XG3nXQW6xa+MZMdMbMWAPMV64sRAMsewGsS9MdJsaQNsZ/ThfsRDIcYRU29wVq4y7S2NVDHXXce3VpU5bpcqZ1YPYZR5SCWZVTRPaXkR3ZYiciTUKiSCaR65RR8R9R2Pd5QK1OsEDJUFcVSlWFXqeyZFVyX1ryZEP3eTc6mKeDZKbCtKQ9LKfKyG0qeGUlZwJqcQqFSyWJ4rgaZJ8ab2U2f2dabaejmZxUabmonCG6WAB6e8gmSkD6QJymQGUGUaCGcuUrI2ZwFGWYbGU5/GYmfQMOaUF5+mZmZA356ufcCmWOUWQB6QRWdYJrWADWXWTZ82WEK2e2dyZ2d2TZxZ3C1wB5yOclxOWgdObOdWWuAuUuTZ+uU4Cl9ucqRZ/uWowoIeTePlTg4VdzMVVeTeQhfeXR4UbVa+UNZ+cAN+c1fVW1SBXpV1Utzp6N/BXTohd1UBTRxhasXhyh3hQWxhwy+SUyzsrh5RaJeZVwNzPRYxQJSxW5CJfXTg1yjxWgHxVe4JTAMJSpSefrL5eSeeTJXcfJYpVxbxkomsSD5blPVxzpbJ11Uj6ZVst5VVQjwx0CQ5SxyRyj5x4x55RjxZVj5Pf5YFfx8J1qfp2lWyUZxJ1ldJ4TzS5wIlVOslbT6leFeJ5ldFYHDlSUqNbd0NxeZt+VRNz5epdN+t41TZIt0Ne1QvRR+t71f1dt4Na1ahblZhXhxNcDFNVUf4LNY7KQAtQfe+6tfgOtZtUqB+wQXtfgQdSskdS66deddCZdWA0Vg/AaOmWs/6M9dhq9eSe9TPPs8Aug5yP4N+Qgw8cs/79A905YOMyAEfCirhto6CIc46OH1w1H8c2AhRmTgDTnkDeztZQ8cENLRDWUCPjDTbFKkWYjcjajejWUJjeCLjfjWQITUEo83lOTSUpTT69TSy/cAFQzRm8zWsGh6HTZOHdzfyu6oHDUPzXrlfBMFwCrVWuLWGpLQpzLTyjkQrT5ikMrR6kXuCmrWsO9BJNrQemC/rTriUma97WbRbWG1gNbdtHbQ647WdrbRXa2gd2ttE9ri1zgPtP2kwSDoh12ai/fIBHRyLR0jWJ+Xeo/X3pLVbWjvL9jGx/a50hi/7G+h62Lr0hy65dJEJXRk4+4bu73OtA6nPIt1JuU9Jet3TnoOpWeBlJeivXQrj16Bk9dusPQ4FOwuBmIHgft34Eb0hgt7dAfSATqYCv+lvNOp+wdbftz6v7IgdfXkG31yBj9SgdQJSbrEgQpgD+m0xGSTVr0f9SZIA2Aauwfet1YZpA0D5IQqsn8RBjs13AR9vszgNBkX3+xnN14QPdhhPHwY8xCG/MMePYg7BkNz4UUS+DFA8TxRE+qgB6inz3AbM2GJDSeJ4KDIF80IPDE5mM1L4TNBGcCaIP4zEbxxJGSjaRqo32AKBeE+jKmIo1YQqNWMTQ6RFs3gyKJ44hjNRCY22jaJkkFjNRNY18QLM7GgSQfs4wib5h3GZqWJguwKZ+NkmzTXVKUxCb7QMmlTeYTkyWHeMVhSTMQMUxabBNym4TLJgsJiYrA8mPjQpmsKKglMdioTCpnMKiY1MDh8TBpg8JOHrCk05wxPs+EYaY5hmmQkAP01yHAhvBhOZwHNlGYl9/qpQmBFMyYRmBah7Qnrrwnmb9YAkgcRPmuGT6gi6IIfPQDUPz6DMvq9DBEX9XObJRUoW+ckjc1kps4HmjjPKC8wraKExcxACXLJh+YHFZcALBXCyJBbq4BR2uQ2gLTACG5jcdneFq20RY25RoKLXkWi2dyu5J2nubSD7nxbcjA8owElr1g2T0oKWUealv8XjzqsoYklS7rKH5pdtqmnLXgm3Wr58sXRCPQVoWh5QitaqQrDvHmyEIyt+8JrEpCPkVbntiiFQK9mq3nzNsPRqedfGIE3xK5HIhrLZAfiHxv9A25+Kmm+xUG4C1B+AjQYQNdaJtxiLBMfn6xNJgAzWKbS1pgW/4FiM6jrAgZfQTZesk2sBL1iG3YLhNNWCYt5sv0OIooi2dIY6P+DWClsgQ0hFMlyI+aFEVCahTQn2HrZx49CmbAccC1MIxkLCjotdnYT7absEizhHdikVsAeEx2h7KtFi21FVQZ2wRddt4wiLLtEuLqf5BtA3Z5gt2p4oYBED3YZFx2kdXIqewjHj4VWV7core32T3t6iqQRos0VaJNij6kbPAZ/jbHxt/25Y0gcBwfagdwOKbSDtB0O7GD4OZgrYUMFwoHECK04rNlh0HH8FrutdKigIPo7V8nixPNjmIPcrGVuOq9fgYR3YlaU8eGMLiSrzZ5o8iS/E3jn5X46CdqeunbUgZ3Sp88oqUnZymIOh5FRa+SnS6Cp1qjU4x6ipB0tp0Ul09eejPfnupNy4WcbSqgO0jZ3K4Oc4yLncLhVz9JedoRPnYENmTI7+c1cQXGMs5NC6uS3OSZSrlFzTIZksy8XCMolyq4blxyxZWrul0y7ZdgQ9ZPyQlzy7Wk2y8YIri+BK5ZS4pZXeUe5KS6JSUuKUmchlznKNcXwzXYqbmTXIVS2uW5FaJ1z3IHkjQN4I8vtCB5i8RusFMbttyl6PkxWM3VqnNwW5a8UKK3PyfFTKBq8JeA1XbsNSMl69pBYAKiWhxomK4pCtotPO6iYn4cWJQPWig914pPc/uAPVuvmE+6XTvu10l7mxUB6cVyeqaaSgFRZFwhIedIJSmwVh7S8q+sJTicj3EkGVJJXlMnvD0EFCTGOIk1juDNW5E8qOhJaGYJg+kUk5J30oTmZJ56GdjMVk40rFRRls8OeViLnnpwJkqTLJak40kLxqgi96Bp5GyEVXV4jS7ylVWGS3gmly95uTVWaUBXmkcc2ey04aVtxSBCz1pwvTaeNQsGG9r0xvKgKb3mowBkJhIa3rby2oO8J8DvF3mdVLEe8LqUQBwcVgNAbgXBDWcEXIXeoPoUGXEI5mRjwAx8qAcfPQB4N94gQLZVEFPtAyREgBKEzCJRiNjGwTYpsM2ObAtiWxGgVsqgNbJtm2y7Z9sh2Y7KdnOyXY7Z+QpAE7L+x8NAh4GNlsDRBk18zUEpSGg304Cw1m+CNayG3zRoY1wkWNHvl+H77E0IRpNYfjVFH5WsJ+9NKMDPykypoF+nNQMTzUFTr88k0ooWjvyv5zs0glQA/lLTLnaBZap/DpOfyLIjjLo1/daurXv57RH+maCURC2zGQC0Aptc2m+1/620T6gA/EC7XSCgCH54Ar2lAN9pJs4B8yEeeHTXYoDV+aAnevIL3pKDsBusqNpnWLEUFNBrrEgUXTvqIcH6iCp+lyBoE11Tpt3TukwLulwzHibAnuszlEEQzxBMzXgbsAEklzp6cGEQecG4mELtGZC2jkd03pVF2eQC+FAoOQVYDU6KE1QdG3Qklj2xxAnQaQIQXbEDBz9YiW/RMEIckO5g7+pYKOJpQbBQDEBhYDNl+8NsGOV+KxHBGeyGaA8bOYgD8HOzfq/DIIMEOyFhDAIfMOsFELwZhQz4A4C+NviobJDaGUECwGBFBEZC3BOGKxVnMpFcR/8NI8xZ1jKE9ZKh4oaocHLaFiJ6hcjZocaP6wYj4lHQ+Rpoxmb8ZehyiDZJY0GE7QRheSsYUMHlATDcRSzdkbMKuH7Dbhywn4asL+FPCzhmwi4ZkyqbXDamhwhpccICbNKNhLw7YW8JqWfC6l3Sxpo8O9QAjWlrwy4R0tqVeNvhEyppVMrSbLNVA0Iq2Q+ngZ6BIR72aMPbMj5wjeIpi05mBnCUojyhyS4RHUPSU4jFm0wjxRsvxwp9g+1WRRoEodlPhjQ0fQGLH00jx8FA6yo0J9j9lp9iwfWYRKHKNDjZJs02WbPNkWzLZVs62LbDtj2wHYjsJ2M7BdjaDvVMMXy5wCAivS5hYAf4YTOKHCGygYscWDGIDGxi4xSQbAAmOFkpUpZosaMeLOqGYBJYWZuDY+OeRsUHx7Fx8EWPtGtAjgciUMd9Dq28a/R5WUkF1MknBCFEFAGbJOArDTwUt+ANQROtkzaDYwdke0dOCEJChwh30xsKWFn3UTsrGMKoUEHCFUB2xnwkQCgFLFaGqhoVsKiOQiujnIr45qKpORitTnYqM5bQM0FLCMgWwocFgGHIjnjUJr7QEajOOnBYHt0M+O87oXbFNUOJ/GOkOENavTiCTHiQc9EbPS3RWK4Qeau5MHKLWUKIVFUFhNmsrXVrFG6cfwBXFEBIBQAgQeQJrhSAuyEArgVwEAA="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const approveSync = Hooks.token.useApproveSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +approveSync.mutate({ + amount: parseUnits('10.5', 6), + spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Approved amount:', approveSync.data?.amount) +// @log: Approved amount: 10500000n +console.log('Owner:', approveSync.data?.owner) +// @log: Owner: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +console.log('Spender:', approveSync.data?.spender) +// @log: Spender: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.approve` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const approve = Hooks.token.useApprove() +const { data: receipt } = useWaitForTransactionReceipt({ hash: approve.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +approve.mutate({ + amount: parseUnits('10.5', 6), + spender: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { amount, owner, spender } } + = Actions.token.approve.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.approve` Return Type](/tempo/actions/token.approve#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.approve` Parameters](/tempo/actions/token.approve#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.approve`](/tempo/actions/token.approve) diff --git a/site/tempo/hooks/token.useBurn.md b/site/tempo/hooks/token.useBurn.md new file mode 100644 index 0000000000..a4c198f423 --- /dev/null +++ b/site/tempo/hooks/token.useBurn.md @@ -0,0 +1,81 @@ +# `token.useBurn` + +Burns TIP-20 tokens from the caller's balance. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"5b6d09a09c9cff3e14ddc9584d71dec809880c31569d5f43fb47e4d50b5f31db","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKREzzipDAAGUMIkygZBHC0AJ5HC4pkAEKFktl6xwgBKOhbABUvAAeADCKRivRqCX4kAA7mAAHz+ETiXQAdmXsl9yiQAA4g1odHg2i3S4l/CYzEgAMyx+yOPyIABsyeoXjTvkzAXoTBGYsrRkXEkQLcdx9RRN0Qb1NBDPBf1PKNL2veNb2cYFlyfTBUz0dM/CzT89BFUZOBrfh5AXD0pANddQP9CDg33PQiJIyNz0QK8QFsG9E0QI0LzQl9MLfDlsz0eJEkuVIGxgZsi2PawhxHMdOAnac52CcYBR0Mg4AAfgrPgqwYsB6ybI82zhAAFexmA0iY5LAUdqkUsBJwgGdZy6Hg9Lgata0MiSpNbRJO27Is+xwWz7PHJzlNnIYwHUuB0msIE/JMk8qGpBZ9D02J2ALIsqk4HsAEkzJNQifNlGJFWVZQgWsMI5FIFVZQBGRRESGAETAIYADkIBoMoe3wRhZRGu44DbfBFUgBssWy5RRC4KdRGmHLSEI/AgT2dq4ATZJuvOCBniBUxrBkOJYCga5Uh2NoZDmfhjpidggSONAWwKnZTm+TI4Q5UQuSQHk+VoAUNlwKgAANofyWghnwsUJV/OUFSVVVloUZhGHxGgRk1A6RKSK4AEEsCwYJomAIZOE4XMwHzCVmDpRaYBqEazPkKACvlABeDzDG84jfOM6S2wprUabeltwWpmnOH7Q8cRSWW5euwcTGsfgeeACnOB52dOCZi4YGCCUBQgBI0DKUELDAGoDLKFULFoOFXZVOVIlcFW5a53a7pgKBtfZzmqi91I5Zi8PVf873+3xRWaznWXLTAMPochl0KF5NTmH8HPrNlFELPjKynC8zPeSlosjGWC59sOeAVjQP7XXdJckBtyi/Q7mNqFooIUtFtLjDgliEITO8jTcDxnwwnwM0E3C2LzLhDyH6xdIFgyjMk1L2y7d6QoHYc7IUpSXLnUj24DSR7y7sDgMguiQDXgLrFg5i77YuMJ+cCxeLnlhd8NAl6qUVDgDgGBohGxZmUQo4hGCiH9piV+MlzKWQLuFXos4agQCwGJbSZRa4swAPL4P2nAfsVMo6o2YGUSGzsAAkwAKih0hgAbm9ubS23Rej9E4TQo4SV1hW0KvGeme0UhdmEfggR7hOCNkBAAUVIIqUgoVWZ5TfugkumCT72RwY5ZyrlOAAB9HKwFHGYKA0R9acCIBARgUB/AZTwENIEMCxKxASETVIGALa03aoEmQMhOBTjyPgexCCkFyFlDWQilQFDaHWrVQ2zMvHtSungsSDVXiEEMNdbYUAuY5NCfVEJAJNbXHIXmP6QZAYoGzpZfwRRKgxK2CidxUS2nIOuG0AAVjARw5VJRwDiUdVJkNPH7QAGJgEhi3LOIAc7+GyRQuEKRixxGsElMZnBOnDUqj4rx4SQmxEYEcMJm1UipOmVcMacBtm7LgPEUJmSwmMDOR0UZmQrq3PSftZqDdHmrEWU0kuqyan0w2WAFRaj9mFUOd40S9dTmhNHJcxgtx/l1yuPIXMltNLbE+Ko3K7y0XHR+QHDaQIyBqLBcs5pVA1m1M2ToNAcgroHLGoTE5nz0UXKBFOa5NK0m4tSGNGAESniPJ2fAF5KwZCvBiDoWw1Lcr4otucIlQS6VkrAFdb56QxnUqlbVFJm1aiLR2Bq0lpAGVHGYOIQQ/gURFVuP4uIhtRDETSasdYcgG4AEcSgiDgDUSGmynnyshh8s5GKgQpCVdsGIThRVtRoPmcpoTPVqg8aIWAXUUTEzOak7NlTHq8ooeCSNJZo1jMhhGlIcL2CNs4LW4s7LOWQ2iOIIEDinHIt8eG4lfzLVV2sVE86Qr+WUt6JAI4UAW5uhAP+XQJpvRyCokgL+T8gieIhiPT+48kJJhnuhbwQDF5BDAXgsgmBe3MC1aInofRzhXwAkaYEX8t3dwfLuKCehuHvqYuYNc38OKTwAZegSOEb1hEQVESUExdT5HgdOsorDFA1DqA0GQmIHgdFIO5V9/R4bfjGFKcMMwMR4GWP6jYJJZQ7CwwoBuJx4AwkWvXG4dxCNPBeG8RgHxOBQh+FwXjAJMggjBBCCwYmYTwi1CidE8wyjYlxASIkJIyQUipBiWk9I8hMeZFRmU/0GnA35IKQ9CMuASjDDKFGVU0Zqh0/jIYjm9SGhNGaTgForT4htCaB0oWnSt1XWRLiRoKIgT/YGPue5QxmemB/MDJ7OKgmg6+BecG8C3ogQ+8qQsygDBAM7E01hQvVZq7VurdoysfvXQaaQcWwI0SS3gAyaXtwZag+evi89sIfiCHFKyCUHB1TzBAOQQxWm02m3IMoJ84AzcPa4vQXTIZ01W3IWNT6oArCBCcYgTitgsZFIG2Ah4kkFR22tjai1OAPJYJ88QIzapDAAFKiCKMWawlR8ELfpg9qy7FchwGVCd4kl1nivCnDANozxFRTkyBMLqQwukHaO6J2gop8iESnEdBKQysWMGsAtkY4mmhagAFScGJu2lba3Y1nQiLKcJyhDY6EIFAWUsrIkRHbfduQcJ7oKApm27bi3Op6tIJL0dwuZdwmWkWBXC0uD1VSN8iSfyjpTkqDQEZ7VXh9ULf0/newYACi6vTxnCh7qtSVyDvbz36ZiA6sD+yhZqXxIN3kLaR1kCQxO888kaBZh0khs6YIGm8SIEJJAWAFuNlaH0zSDN8A0BIiIDFuEtB8SiCwNjUP8q4TYmYDIAAxKXsZIhI+wlHUMYPtevL17pdH2POJ4+J+gDAFP7AFDp7gPiTPIgc954L0Xkviow8V+r639vqj4SIqBA7iATvpcu5gKzoJOvfkfOUBbLgdmCqTKT6UEXO/DbQCOxjsAAB9WntOADq4hciKGfw/walr19O6v30oMo4ECqXLzsxpcmYNKutDtiNDQOcEqkMBNIkFNCkBbLKCYL6qkm0CjmjgzmZEVHEptK8KcKSP7DUAutsJcrVK8DASIDCAgXFEgbYNNGgZwBgUCA1NcOapwGbp1BbrsEcAKF5JwJ2ltJasHpAEblcK3pwEVPiCQp3nHlphfgPmnhlKPizOPrngaPnoXsXsyLPmXvPlXqIEiJITAEiCkEiK3kiMkNEM9KQEME+pinZOwE6mJPfkoqDDZopHAGfr/o7mEM7rtjvogFqOnBbkMFfmLhABLiqJtCEvruwDIFACqJEAItaGZPsPkOpjAIkWEskVAPbMThHsflEcruLvqAkfdJwAAKRwB+YqhE6kApFpEZFBZZH9CYjVFJEtFFEjL15lGJDK5y7BBmBTicAtry4qgv75J4g1CragEFQAhXR2BkzyABxpHpGBacCdHnCyhy7c5jIAwcEGq7AOCPTbRJQDER50phFgDWg0xTFlCzF8DzHlBKg87LEFpYhF44DWI7GqxPbIAwBFAyDOjgQBiqCAlyxPb/aA7NykAJBFRgBDQjQnwgJcBjF96IBEB0LAgXhGgBhbgpyPGwlcAkIDJDKInImomHIYmBDggX64l0IXgWCSAsQkkwk0xPbMn9BkBxQyAGFzDyr4h0BDJ0j7SICrg3zcnbBcAglgnOhIgG5/FkAPjRZylPaglhDwkiJMk4n8lFhhDCnPJim0ASliTSn3gPgWCklBZAlcB8narGlClOqmBilgkP6sZcQXgsRag7ZOnqR6yqgv6zodgb6mCrZgAqgCLRGq5gDBCQyojtTJKcDMJjYwCuAACEaIqZZA2ZPa7Rux2RmIKZigTwYZZyEZPQIOYAuZ5ZyS2ZxRuwsAqiQw6cWoXhYMgaDY/hQIkMzOrubOYy9xHZ0MkRwx7u1wdIIZIYxYVuAoxYnxhAU4FMcZK8omqic5OgC5ghzAy5Vkq5655R05zAGAQ5QIfM4xwOIRcIl5wQx+NQdK2xB055l5MRcRPRBRfRbROxexORWIeRNRzRKRLZQx75FRsRVRwFR09RjRoFqRr5mRpZuR+RiF4FdIThF5IxdqYxMAExUx+orxeCI6ixXxBwKxvx6x1iWxxZAFmIyAzxnAJF7x5Fyg3xqxap1iboIydKAZm5mZIZMx4ZkZdZsZ2FH5CZSZjZTwGZ6kOZeZFZpAhZyFHRqFSlaZVZoSNZUZKQDZ+ZKlLZ/F8y0MFm3IvImQh6yAq2hYSUMeShCe+IfQygcQbQcIuYzA+IKhI+F+8cjuRIk+o+jAbQ+I0RFukQLoK6a6l4FgP6G4/o4Ge6OYMuPWAYvc7EiEnE/8A2gCsGI2+WoB0A0QH5lR42u02gOkxKGANQrsGyUKYQxcQhZQJuyAzo7kA6V0wQAA1MCNcBmPdAWpFelLRnoAxSMpDIMVHofpEuMWeJ1JwPRmsODJQQoK0DCLKFrpSsar8jUJzpEp9qfBMFwLrtsIQcdpUE6qQK8OVScYrpwQWiUvtEEadULo8m0CIHkJKcrGAGCaGuUK9m1CkkHiHtkTEMEBeJEIod3k5U6mAMuKnkPmeHEAXnDdYScSPnDReAYf0DEHCBeOXmgJXinMEKksGOtfsZQRwWcjtb7iDZKTIHCA4e4ZLg5d3soX3qoUPuoWPtntobodPoZp8oTZXlXgzczYtBLdnsGFEEpgdBEXAKeVms+iGaoBudvp+fqASucGULUakTUNrbCPRRpYbWUOoDcQ3krWtprSqKbX5obWpSWV0WUKbZwObfElNYMKZZDFqKIZwMHgzUzW4YtKzV3ppk5T5YjcPhoZmnzUFYLYHcYeLcHWgFLUiDLfYblM4SdK4aQO4ftHUn3JZpZadIekQBYHCMCJXXaFFW3ABBeMCLFr+mBKxMlXoOLmlcCBlT/KeoBNlvxLlgVXoIGVojJJvPpD5DvP5GggfL2MfPJA5OfK5E1peBePFduoBABs/Kgm2J3d3ZBs4Gyf3UNsAkJCECdoVlAlamIGUNQqrC5nQu2kwiwnsGwgIkCU+jws8HwucO/XLEIlKvgoNOIrtL4tIoA2gHImYhYjAFYgHC4qNSAF0m1PmLKs8q8smqcDNiQFdFANamtKKncoZFqJjpaig1wGg/Khg8QfANg9Sng2IAQzitxikPfqQ0COQ+UPWgqiEjQ7tjg9fTsA4YQwCqwyQ3SRwxEBQ9w9Q8CnQ7g/g8I8wx4SvSxF6PfP6LFm3SAAw6IHvX1ofdPCmDBoPZiflhffelfcBi+j/VwOYgkJYlGM4nXboBeKoL3M3f6Luv3HgNY/oxBllXeF6MfVenlnoJmRNtcVfnNu9lfstqlSNfMG4palviEftrfoGtDmdsxgDT4ddnELdgcAARrs9vzoDe9vEodT9n9gDvqQAWDnYBDlDoqDDtSoJgjkjtgS5Gjl5FqFjhk7SnjqMHEkTuUDgPUKOBTp5d8BtWOWAHbkzjLqzigxzhEtzkfnzlw7YGdcEdbZUVDRGtEaMVDYrqk9bdJScyU1tfvnTWEoboHtVTwX3nCPwRUNbmSEMAs3/kEWc67lGR7lEwvT7nrncwHiMi3oYWMuHg3tDeHb3snl5IPtHbzRPjoVPvoa3iLQvpC2MqUXSL2gas3qDSKVC0vqQLCz3t5ZzYi2oQZii/zeizPiS15MYYvrccvnCKvpwN86Er89ftc8lAfvtcfs9hRv2e2syVfuk4dqLlqE/q/u/lUF/j/mvoEWUjLoAdSSATztAOAUCJAdwbQXARyhgIgZNCwbNOwaKl06jk8MTPgedXw6QXIOQWSlQUQbebAfQaa4wea6gZa4wL6pwf1JtOtLwS85bvucIX7akhIf1ImqkDIXIQoWzXC1Swi1HTzZoXHWi3oUy3PkTdXqYeYZYWANYTi7YRAJnY4WANnW7lLQXV2d4StX2QcKkjy7s3tnMwrVbaLpUfEbBT+a0Y7QxWhSBYUS2Z7b251P29+fBTUE0YUX+Q8epc7UBehROxbUMUc3hTeURTMXMWRZ8RxZRT8Wsf8ZsZECO6WVufCrddoIrouFUlcQ82S/cWScxaxUe0sae1xTRQHFqQqTqeCZCcCNCSu6rPKSIbU/gnCEiWACiWiXAAyfQAabACyQGIScSfaZB09pSUATSQh3SeiSkJiWh6UHiSxOyZyTh46fcIaS6YKaaaKeKdYN9WANKcuLKRB3R4qWEMqaqesaQBqUaEaIB6JmCXqUDtieh0aUx63uaZaVKcuDafeHaeJ86U4Ex+6Q8cB96a/YoL6f6QdCPUJXzCJdWWJdGRJVOXedJcmYZemcAJmYpbJSpUWf+RpW5yxaJbWdGQZcpc2RbSZZ2QdN2T4a22xpMpecs+zt2xOYrbZxJrOXzPOYuQeSuS5CeUl7ezuWgHue84eTAMea+SPZBdviGTedEQ+U+be6+ZJVBV+YO4hcuyhWu9+RhSMhBThRrbO4O/O+jEu9e+1815u/Et1x+aMXu3hQe28d+xRWxlReexsUhcN/sWUExXai8Yewsce8NL+9RRe1ALxfEiZUrUGVZMJdpZwLpeJQIuV3Z+/jJY5/JVZK54ZapcbWu959d7d/55pQWcZe2d7eZUDJZTANZbZaQPZWHZSy5fgG5R5UqOm/3r5X3v5RvoFbmyYKFeFVELXZFtfG461p40gElT48PQk0etGEaAY0gDlcY11gDP4JmXgB3S45eKoCTwlfT2EyAP5NStY9bBYKoGFp3bTwE7/PTyE/lWY3oMEEVTYpwKVdBfezAFVSbrVa7CyoKU1cwJiK1e1WUJ1eCL1f1WQINTYgg0k2NTe/EpNXi2gLGvtfcARfNZy0tQGhwVoBTQTgK1Sv0S74dRivmK9edWkJdeIDdfKnde8g9cUsZikC9Qfm9W5Z9e9GJDE9OmU1jEDeC6DbjRDVDam1gLDe1AjUi8jaje1OjdoJje1NjScLjfjViyTWTT71ZJTX2tsDTezrcwHfSEHXnSHcX7DxzRm0i1m7HaiwLfoYnYW2LfSFLWnRnXLeOZDJOSPYbarerXef267Xrfbc+mt4Ba7e7SUZbbZ3s9Bbbc+ogEf5bCf5iGf5O47+v77RD/7ZDIHVLaHY5fC6j0zZ0ts2M/RlkLUZpJ0l+KdFfloCQzCM62pgBtqw1B6NJV0pdFpBXSro2wCeMVFiPeHAyk8x4iWQDMYFiLi86efdXKiY2Gxy9l405HeuWH5gT0hYU9PeEFEPiol56p8RelFAvjzgOenJKwG1n9CPwKeL8PeOQMl690v0MvUxmfQKyWNogujW+t7Afr0Jn6rGVwBwi4Sf0da39N9JA29gAMREwDHaJIjADgMREUDexgalgZONremUZBlIy2boNFUfDeRoIyYaWoiGbDCRmwWcGUMxksjLBjIAEa6MvBHiURsQwOjsN/BqDGRm4LkahD6GijXKMo0bYxC/BnDQITw0wa0NkhCjRhko28FRDC6uAi8FuG54b0tGYg3RpIMypS8qOsgmgfIIsaQJ7C1UdQbQGYSaDY0NgxxtYlUYXhJAm6HnogBqGdZhI1UeoT3U4hr1j6nIFnupDZ5kCBBBoCwB4zGFCDaBMyToZwGdjLhjQUANxoOGsD3h7wF4A0IOBF6ElJARoVQKIAvBtAtwBoA0I2GsCSAYAy4LnqoBiAWA2gSiNoG0E7qxYGhvdf+CulzCwAvw+OcUEwNlDygH66MAGFjBxikg2A+MOzHCK8wE5ER1UVUOqGYAeYcuDAinHzF/CCw6wg8N+OLAOjWhBwnBKZOkmvymBgUP0B5hJHWjmDwQnUBQJywThXAzo5OfgDUGZpcM2gWMMZPtBTiki4QB6U2LLCF7IZWQ3mUEHCFUB+Z7wkQCgLLAdiqgKsFgKrPVmNEmj7QZoIYK4BTjTsbaAvK6ELz8yyjdGWkOENYxTjRF+2uwpUPfxqCOjrUzoh+inH8Clw9GiAUAIEHkB+EUgXWBAK4FcBAA"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const burnSync = Hooks.token.useBurnSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +burnSync.mutate({ + amount: parseUnits('10.5', 6), + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Burned amount:', burnSync.data?.amount) +// @log: Burned amount: 10500000n +console.log('From:', burnSync.data?.from) +// @log: From: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.burn` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const burn = Hooks.token.useBurn() +const { data: receipt } = useWaitForTransactionReceipt({ hash: burn.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +burn.mutate({ + amount: parseUnits('10.5', 6), + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { amount, from } } + = Actions.token.burn.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.burn` Return Type](/tempo/actions/token.burn#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.burn` Parameters](/tempo/actions/token.burn#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.burn`](/tempo/actions/token.burn) diff --git a/site/tempo/hooks/token.useBurnBlocked.md b/site/tempo/hooks/token.useBurnBlocked.md new file mode 100644 index 0000000000..6e7a9c38c2 --- /dev/null +++ b/site/tempo/hooks/token.useBurnBlocked.md @@ -0,0 +1,81 @@ +# `token.useBurnBlocked` + +Burns blocked TIP-20 tokens from a specific address. Requires appropriate permissions. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"0df2568dc9b4097277b953d5c3f9968dc9462d150265a4dbab251c23f27cd1be","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6IAAUoiaicACUnABmAK5gjowQYJxY4nAwAKpgjGhwwURhcTCInCKkpgoUnLDWLGFwZWBxzABGZJFlbYwKpmgAOrms7FzppJk5eUZQENYIegCycTJojFgm8Jyi5WiVipykMFhHmWBiaymcEDHbnC3tZJxtGHd9JKl0bGbn17dtERgnAAjBZOMFQV8UvI0JEAHRDIYAWk4ABE5k1OPg0GgsE0APT4oiMGDMOFwfD42bzfFxNYmNbwfHjSa5fL+MQKBbIZAgOiiVhyfwsNgcTjANIZbJsuCcVyxUgQZicADkxNJKsRYBZ0umwRVABYAEwWFU1SSRIaEzjGix2+0OsAgAC6zuEml0BvUxnkShUiFBGnE2iCOqm7NkpnMwJsdlIDicUncnhweEIJHIGkCeGsKREzzipDAACEZHN+DAoABlDCJMoGQRwtACeRwuKZYuFktl6wV6u16xwgBKOi7ABUvAAeADCKRivRqCX4kAA7mAAHz+ETiXQAdl3sl9yiQwO9mhDeDaXdL5crNcS/hMZiQAGZY/ZHH5EAA2ZPULxpr4mYBPQTAjGKDZGNuEguN6ciKMeiBnsGOh4JBj5Rq+77xp+zhGgaf6YKmejpn4WagXoIqjJwzYVk67o7ieFgxj6CH+shWioXotHyBhz6IG+IC2B+iYCRYhEASRQEctmejxIklypO2MCdkWN69neA4znOC6cEuq4bsE4wCjoZBwAA/PWfCNjxYBth2149n296DgACvYzCmRM2lgPO1R6WAy4QGu65dDw1lwE2LZ2cpqndre/aJMOo5FhOOA+X5i6BQZ65DGAJlwOk1hArFjkJS5/jUgs+jWbE7AFkWVScGOACSrkmjR0WyjEirKjsbROZW2xQFApyRVqAByEA0GUY74IwsoLXccADvgiqQO2WK1coohcCuojTHVpA0fgQJ7KIYBwAmyRgEMzbPECpjWDIcSwFA1ypP1TkPTE7BAkcaBdk1OynN8mRwhyohckgPJ8rQAobLgVAAAao/ktBDFRYoSpBcoKkqqr7QozCMPiNAjJqt2+QkSRXAAglgWDBNEwBDJwnC5pdXASswdK7TANQLa58hQE18oALzhYYUV0fZKllRpiXWMzWrswDXbgmz7OcJOV44ikWvax904mL24vAMznDi+unC8xcMDBBKPVKmUKoWLQcKe2a2zMBACRoGUoIWGANS2a77ue3CKpypEriG9rotXQNlbm0LItVHHqTa7lWdG3FnDqX28eTvievNhuWuWmAmeo8jLoULyxnMP4TdebKKLufGnlOJF9e8urRZGMsFw3Yc8ArGgEOugxMGggerF+ieAAcQacUEpVqYNSt8eYgnCThokvr+Hj/sRPgZjJFFCXmXBXpv5UDlZ0u2XLcWF5pSUjoDqVTrOvm6fpYKG4tweiQEaQMC9EKnlXhePQd94qKwqpGfi35sIJi/OJE+RFvCkWAjQK+RlFQ4A4BgaIdt+ZlEKOIRgohk6Ynge/JWcJO4mR7hlXo64agQCwIpCyZRh78wAPI8JunAScrNc742YGUZG7sAAkwAKgZ2RgAbnjgKP25xui9H6GoyRRxirrADs1eMl1ropBHIYnhej3AF0BAAUVIIqUgaUBYNQQc5AczCPJt3YQoThAUgohU4AAHwCrAecZgoDRGtpwIgEBGBQEqhiPAc0gTkMUrEGmmSMB+w5hdfJMgZCcBXHkfAcTqG0LkLKe6exejaGOsodJfNMkXXetwxSYQZCvEIIYD6w1RadOKdYLpAJezXBEXmCGQZoYoEbh5fwRRKhVK2CiNJFTll0OuG0AAVjARwnVJRwBqRAE6QJkYZJugAMTAMjKeDcQBN38B00RcIUhVjiNYYqxzOBrPmt1bJo9SlFNiIwI4JTTqpCabbFpo8lpwE+d8uA8RiltJKYwEFHQjmZHetCy5KQVSylOBPe58yu7PMmZdN5YBHHON+c1f5WSFJAoxcU+c4LGC3DxbCq48hcz+zMtsT4Tj6pouBcUrF6RjlDWhWQZxpLHkLKoC8qZ7ydBoDkO9P5S15K01SOK0F4KVyQrOTCkeVwlowDKU8BFXz4DIpWN02IOhbBDXqnyzRPchWcDlaKsA71JURBxT661jTTq1F2jsd1IrSAKqOMwcQgh/AoharcXJcRbaiArDC1Y6w5BjwAI4lBEHAGoyN3mIvtcjdFIL2VAhSE60QMQnCmpkPzfMIyQXprVOk0QsAERgBRHTEF0LO0yDGfwJlerZTBHLWAD5drjnIzLSkWl7Bl2cDnVWdVmrkbRHEECeJiSp28JqGi6FA8okVJekCA1WLeiQCOFAKeboQDQV0EaI0qDIH+m/eeLiIAMlI2MJhH8aDcInmPimHB0lyJBEIdwsgmB92+39tovo5wQGMUQEaF8894KLzA9QFCQQNH+x3kgee+90F4QkmfXBl94NhBoVESUExdT5CoTesoSjFA1DqA0GQmIHgdFIGFHoGHBjDFFGMKU4YZgpKWBPPNJJZQ7F4woMeJx4Awl2qPG4dwRNPBeG8RgHwfW0G+DCP4zxAQgjBBCCwUIfiwgHciNEGIyjYlxASIkJIyQUipBiWk9I8iqeZHJmUkNZmw35IKYDWNuZsdZIdeUztlRqn85TIYYYZT6ltN7C0Vp8Q2hNA6crTpp5vtAThr0h42JMRgQB3L0wKOICo3GGjTE6MwYvnBvACHiHIakWUAYIB3a7mNFAF8qhpzWG/N+F8BppwWFUC+I0kgjSqFEC+NoS8DQGmLNYSQMBdyqEkKoGIFg2j2LaG0MbWGYJGl3FYH9SADRNaCOltrK8hKdYgzhnrgE+sgXgycRDJDohh04GN92JprDlcR0j5HKO7QPZnrodbH23tIU+3gWybXpB/ZEl+I0QOpIg/wUEfKnlCoOCBJzOAEA5BDCWRzPMzPSicD/kzoUVAqqpPDcjRnnPq2+ygCsIE4PiSwDU+UEU+bYBXgUBhzTIv807S4PClgGLxCHKaUMAAUqIIoVZrCVB4ezy6nPbb7LsLkOAyppeJKGiZlcMA2jPEVCuTIEw3NgHWeLyXFmZM1JXKcwq+zOWMGsOzkYLmmhagAFScDppunnouOZtp+aU5QtvlDQFlLa8pERN3q5gHCMsChmYbuFxzuQcJfWkBr0K96dfrcN/2kWFvmv8mpCxcpXFpyVyVBoIci6rwpr9p2UXvYMABQDpT2nhQZYATFPb7zmA1bTDbkSAznSChCwyuH6Ps6pzkDI3B0i8kaBZh0mRs6YI3m8SIEJJAWAM+3laCCzSNtNARBIhED4Rwi0D4iiBYCkxX72pwjYjMAyAADEUBxyIgd+sIreQwF+SBkUKBcqD+T+OIL+b+0AMAn+7ACgP+cA+If+8AaAgBwBoB4BkBio1+sBCBWBOBTi8IDKQIK+EAa+Ze9eW+feD0ekwauehAdInAiWTU0KyM7+pQ5eYu0Aku/uAA+knkngAOriC5CKAaGqGzThq8H8Hl7bJ7KOCEr56EBQBqbgpmChpW5wALQ0DnDdJDArSJBrQpB+yygmDZrQptDe6+6p6uQtQ1KnSvCnCkjJw1CPrbDgpNKvCM7OEwhuH5QeG2DrQ+GcB+FAhdLXBNLHRT4V4z67BHACiRScDbpnThoX6QBj5XBYGcAtT4iCJ4HP6+byGkHf5VRUHtq0FAEGggFgEQHMjMHQGsHwGiBIj1EwBIgpBIhYFIjJDRC/SkBDC+wcq+TsAJqKT+72LwzxaiEyFGGr5hACEd5b6IBai1wz5DDl6V4QDV4qinRFLD7sAyBQAqiRB6LWiuT7D5BeYwBvElIfFQChwR635+xSYPFV76ivFlicAACkcA3sKo4epAnx3xvxJW/x/QmICJ7xmJ4JhyKB0J9xghjeMawQZgK4nAa6zeKomhvSeINQTO3c80BwAI70dgjM8glY3xPxxWnAeJ5wsoTetuxyUMeR/quwDgk650xUpJt+cq1xYA1o7MDJZQzJfArJ5QSoOgnJmm3JWI4BOAUSwpRsu0nAyAMARQMgzoSEAYqglp2s1pZuFuk8pACQLUAe/yf8VO4I8hiARA0iwI62AYS8VcGpbpXAgiuy+yXpPpfpC0AZgQQZxBIZ0iL4FgkgAkUZrp7M1pwZ/QZA+UMgYxcw9q+IdA+ydIN07Wu4AYkghZ2wXAtp9pzoSII+ZpZAP4OGRorZ1pdpYQHpRiGZsAiApZRYYQlZSKNZtAdZik7W34P4Fg0ZJWVpXAJZ5wZZs5CapgNZ9pqhGmOGL4AkWojO25JkVsqomhrKnAQ4fBO+BKeiDxXeYAs6qIF0DSnACiNOMArgAAhGiD+WQEBXujiSKQCZiN+YoE8PeSCk+T0NbmACBXBQ0kBRCbsLAE4kMLXFqAcQjPmu2CcechnnINWs9EGmqfhajHcYkDfNcJIZLCGFWHPgKFWAaYQCuMzG+UxXKreWxRxcwFxZ5DxXxRSVzLbBgBRUCJLLSY4ZznCHJcENCTUHKkKVTMwLJZSXCS8cCYiRiViVpX8TBUCSCcZSSfdOSWADpXJY8c8YSciaiTUOiWCdicKaKYCViIZUSZ8dhbZfZZSU3jSTAHSQyfqDqdwqWvqRyU1CabyeaQKZEKZbieZTaVqZwNFXqeyYaQlX2qaXyVEm6IcnKpeUxQBbeUyQ+chS+WACqHosFZcXCB+V+WBcdP+SZMBaBfBaQBBWldBfiWUBhQhbVc+ahehR1VhWVXhbcqjNFtyLyJkMBsgEzoWMVI/h0a/viH0MoHEG0HCLmMwPiF0ZQfIaXKvkSPQVQYwG0PiA8TPpEC6K+u+q+EvCxARohPPP+kEOXm1sCEaOBqJJgtBsDmRKDgNhydANEA5XCbTldNoJZEKhgDUJHCquWSwswJiBPsgM6GFEeu9MEAANTAjXAZhlh9rPX86KYgDeUnKbpkn37op560lPgV6cDLC5qIzxGH6eRinCGBrSokniFnJDDsr5iD7bDhFS6VAJqkCvAI3Smt7bAgp9qDI3TnFS2l4IptAiB5D1kGxgD2nFry4kxtqNLn6X4AkxDBAviRDtEEE7UJpgC7hf7kFPhxCgEu2LHSmUEu0vhjH9AxBwgvgwFoBwFVzBDQrBitAwi2F5EgpSrBr3QX71kyBwhrG7E15bUEGdHEHdHkG9HUEAGDHDGMEhYYrh1wHwHp1Z27T120HBhRDwg3H0VwBSUdqeq3mqD8UtX6X8paLIlfE1CD2whQX01lBj1lDqDKmoGd3KUD2eqIDexj2DWT3s5oacCz33RM1SYEVUzVE2nIzp2Z07G7Q534E+Y7VnXu0UF9H/4DE3UV2n2TF13n1oCN1IjN2rH1SbGPTbGkC7E3TTLEYxbLVPTAZEAWBwjAiwN2gvUY7vVE5fX+iCS/V4BV4A1A3E4HxfhLzk7nwQ1U45hMUMJbwuRPw2TRSvwKyeKfwpQB6/wH5ZRBLAJIOIAGjAjY6oMngcSwIgDkMPwPjILRg4PUYA4vgviEMMb9Z6CDZIakIRpiBlASJGzpYyLyKKJ1KKCuCqLqKoZD0Sa6LxwGJWo8KzSmJXR6qWLmNoA2KhLhIwCRKVjJLzCC5AjZ5cC2pIoopOqnDM4kDvRQCRpHSmr4p2RahDDrJePlCVrHJ+ORHwCBNDQhNiBhPcrmqRNUzRPhqxM+P2qJNjy85BPKM7BrHhM8rZNagxMRDePxMOpFJJMlOpOhMVOZN6YpCgNvWcM5n1aEbY4YN6BpOiDYPA1fgGhuBYKSREN4KyQhDg5DZKNmNGKWMXTWOKS2NGJuPVRjhWPmKpArM8LdM1YGhHz9PfV456BHMMCiMnjiP/aiSqCqAyOwaQ3yOLOKNQ77N6rcARD4CaO0AKIaZ6OOMJARJRhJI03uN6B/MUg2bKBLTnRmJ6qPaegHYXP+jQLEZrz44/OKRwsqB3MBgPMk7OCLaEOcj+AAWYNPFovvbfifVHj+ivYkN6B7PrMHOmkUhlDuyA1LaqDfi7hLySAWC0LWARL8tehCsitittASvONSuCvCuiviuSu4bSsqtysKsxAA3Y4SMg2uCvq5iwBgQybihSyCB4zpaExQwkxkykhsCUyJYWstb5DWu9SqjqjMDZaMXSVCOIIDi3mQQyytgbweIfzKxVzCnTj5EXItJCGmDFNgxn6iFPBcvBAV4KBwgFj6ypDPQx78A1BZ1xNtAkzHI3RVwBv0ODhAaOxaxkZD1usFAqighwiqDezfiRAUBawaOqgTZTYzZzYLZLYrZrYbZbY7Z7YHZHYnZnYXZXY3Z3ZmhazQ5uy0Dw6o5bvbsOgrvVzRt+ub6OX6gcsouZJ2A8vezVuRtwgjPmRwg3NNj4s3SEtVz+DdyjOICgCBDyBOEpD44ICuCuBAA="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const burnBlockedSync = Hooks.token.useBurnBlockedSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +burnBlockedSync.mutate({ + amount: parseUnits('10.5', 6), + from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', burnBlockedSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.burnBlocked` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const burnBlocked = Hooks.token.useBurnBlocked() +const { data: receipt } = useWaitForTransactionReceipt({ hash: burnBlocked.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +burnBlocked.mutate({ + amount: parseUnits('10.5', 6), + from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.burnBlocked.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.burnBlocked` Return Type](/tempo/actions/token.burnBlocked#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.burnBlocked` Parameters](/tempo/actions/token.burnBlocked#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.burnBlocked`](/tempo/actions/token.burnBlocked) diff --git a/site/tempo/hooks/token.useChangeTransferPolicy.md b/site/tempo/hooks/token.useChangeTransferPolicy.md new file mode 100644 index 0000000000..54765c7919 --- /dev/null +++ b/site/tempo/hooks/token.useChangeTransferPolicy.md @@ -0,0 +1,77 @@ +# `token.useChangeTransferPolicy` + +Changes the transfer policy for a TIP-20 token. Requires appropriate permissions. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"c50850524110b7ca9c0fc4ed621eb980504ba6bbaaa0473aa617fef54500dfa5","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6INYQYCKctqKKMAAqpFFwAGZkAAoQJtYYAMoYYNaIPHyCAHRoAvLFAK5wMADCdtFxCcmkaRnZudbFAEo6laRgMV4APLWhiYwKFJyVYPyQAO5gAHz+IuK6ACwAzLLySiqIAEybGuLaQZGN8WEtbYyZOXn+JmZIRzZ28Y5+iABs7k8ODwhBI5A0gSYrHYXAMgjWml0AHYrMZ9so1GctDo8HCjK9zB9gl8HE4kNttoDqF4Qb5wQF6FC2BxOGV+PIERskEi/ntFBjEOpqOccXo2RzZKZCZ97D9nNs3B5qcC9KC/BDGXpErNHIxQjMavUotomrdUukHh08qNxpNprN5hAlssABRYezMHRkOAAfgKeNK5TAVUNDRNNyS5vaTy6KQ9XtIcBtYAmUxmc0WKwAlP6inBA+zg9U6mHYhG7hbHp0en0BkMcMnU/aM06VgAdMBgUSeuDu6wwA0l41l5pRy0x/xQCDWBB6OGcRLsCJh0wKVn4AdoctkThsdqcACSABEF0vRJwYgeUkcLKyg8UOx2AHIQGgFGL4RhwThfzjnuCdPgpChBA1ScIQAjrqIXALKIjBoN+i6kOum4RqSepgB2ZScAARgOpjWDIlSwFAnD6ueOEyNO/C4TASEDqQtZgKuf6cIxvahDUxT+GICizsgyAgHQ3ZYHI/gAAaSQhtAdiwzJcMAhSGJwrgLsBzCcAA5LBCjMIwAD0NDQppj4pjqaAYZwACCWBYC6WacMAHacBEnEKZwzCVGINDTF+KTyFALGqQAvEpJTikWobDqakatJWVrWPZpkuYxaD9GAnAus5LmcMMOFeWUmEZTlLmhLUGT8MFwD2ZwwXLB5XnQTALqKRFBSaRYtDFN1mnTHuloHlABQAIwZa4WauNlJWBXAoiUTAUBVX5AWrpNxUucsU05Ua0ScPcmRbcM+n5WghWbcVWYdmtkniSAAC6FCCe68TMP4z3dgm34ALR7fGTj5vdj0gKl6VGAAso1Fn6uxlQyGg3F3Q9IDrBIiAABxEnI/KHEcSJYhceDFjt4ajnF0adC8UrvDK3xkogmyqFSmAqj4YI8ZCeghGEXBXCTZpk+OnS5oYBYVETpYxRW5N5DWaV1iMYwpna6aOs6nKo8NkinGi2PvNrmgE5zEvbgLVbPJKbyCjTpK/BYTM0qqdLs5qIBusBOAcBgDmed5MAFC6RDiIwc1yHABS8yO/P7QlxRxi9n2NpMyzTBAWBQ2EfqcBDvsAPJpxhSZOetMxYFATWkAU4mdQAJMAIikKt4kANxbWYCzR4NBQ4ZMphoC3xeMf2jBp++aG6qEvRD2n/fuJwABCog1AAoqQwGkPWMDTBHktjmbsZ/d6icKMnKuZvVAA+6awBMZhQA5dWcEQECMFAk7TrOIAfgOPvQZZ2p5OnTgGBQIRCiKAmQMhOALHgvgR+QcQ7wDvKyBuChtDIWUN/SGlkoikVTunUQECMDgTzGRDKogoCBXwZA6wBCZA4QcDRPBBduJnD4kgASIB3qvSoIHBuCDvoXg3HAvh81vwQBwgAKxgI4JB7o4Dfmwhgzg4kf7pwAGJgHEgjIGXD/BMM4sUUIWRKjWH7PIzgP0Py/n/uPDK0CIELkYIxKBG4MpKNUZZX8cATFmKSLDP8YBSL2MgXhXci8aikXcVg0Imlvwwzhtop6Ho9H5wMaEFea8LGCOseZSywTHHOMYIkFCDVvKWXkCEWY/0AmcDIJknBUDGAONCXIiJJS6nsESZw5JVB9FhEMWALIOg0ByFIpYz8iFcn6nyRMZxCxXElI8fqX8MAYE7m8aY+AfjCELh0LYBaZFkIVNAmAapYCOnIQaS08JBzVkYPQUIsuYhDm1NXp0wGglGLMHEPCKgP0DzFOAZUDyoh2QNThsPOQbEYAAEdKjwAQtMcSRifFbPEo0hxsyByhBkEQ0QiQnAlJkE1cINCHFAs0iQEFsAHxgB+lZBxSiyV0IYQuKZYRMrIsGai+R4kkXpLeaQPlyijHDNGeJBy4gBxPxfmygBBdpgNKUSDAYBzA5EQHPk0JkxICMSgAjJGKNdBHE1nyA4SBeTCmxEEVRuALbmCFJEWmvwjiMyVMzbwap6Q0Bdm7VOZBMAOX6pkTuuEe6nPVsa7YqIsbmvRvjUUnD4qDUppbS1TqbbOCOPbFmXrnZBD9R7QNd5CwFDbCATqN5rAWBrbWut9aG2NqbRYctka9aWtjQKIUBtE0RVTeYPGxJZR02ze6h2rN1QMiCF2HsfYBxczgOkGAHZeGuTCEugoitF1iSoFOGceAv7KIXUu9FzBoCwwHFgYCRAX6IP/HJKFsB8qoJYseqFyhoI/m/HAFgTTxBIIwR2AAUqIQOWRrANzTmu7d39pENC/BpK9xBb2kRwkQhYMAcK4WAgsGoiZaUdkPWeqAF7am0HkgohYEBOC9mkUUh4rloRmFOWHUyAAqayyit0noiMS8x0DlAeR0IQKA36TGwMXkeziS7ihUQUPZYV4k30wGKBchTATSJKek3IYosEBjqY/TzMBoTiyROowsBuNAkFRCIS+GlEjv1bhgN2WlHGrKcAUFRehkCtPrrkOi0w6w8jzttAofoBzsIWfgpuajyBxJId8cUEQU4vLiTui6fAp0sBh30vpSAsAHOGK0PpPdcB9LEpoCIL6RATjFFoPpUQWADIJa2cUTLzAZAAGIWvyOS6BNAkrAkdjiz1/MyW6lpYy1lnLeXoAwEK+wBQJX37lZJWgartX6uNea8BRL7WuujfG6vLMxRBEDk8+IghUm/MwHRTQjKJm2kCcIF5H80IOAsSUeJfLftlOnvPTp0yAB9NjbGADq4hmKKFB0D98QiLveeg0usikjpFoFiUJ5Q0BvxSs4GYNZyEF1fhoKc3FHYAJ5CAiBMCJgwVKJwjhvD1kUgHgURuIh7EYDMHmtMXVf5nEYKIUTkQ8gRkYA7IvQCwFIA08YGC2hZF7mcDsyphzNGnPdnzJwIZm4hFxcgFZ/Uo3Dz6RzpNzLaBsuIFyz9hbxXSurcq+tmrmw6sNaa/pUbbW0Adc66IL6BuYBfVCF9UbX09QOSQh2M9hSUzsG+enAjYAl60BElC6on34deau75mD4lECmRug5jsynZMQHk5pDcEDzPsBkFATSWZ+65b2g3FjBQq9USgbXqA0xsJ9a8iX7TKm5MukrzAavnAACkcBepaSo6QOvDem/6Rb73MO4Fx+d/n3X3v1H+9oEHzd1TgqXRt04Bk9go+wcQWy9MRdnplAsXoaROwtl5ALQb43jszeUit4Qq8zJHsWabQDTdXVlLcBwGLdXWAVeAvMAZvFyC/CuTga/PgW/GjCAB/T8RQXCchcCRrHAW+b/FfEqT9ZAGAdVO6QURAYaVQYgkqP8LgcDSDeGUgWYA8QYCZRWH1LgU/ObRAIgZgGg7YI4GgtGS6eAkgnKT9HOVHRwYoNgsADgqxOAbgwITKH7AQoQ6NSQRAbYcQ+g0grgTQ3uMgLsGQT3XbLZfSOgaRLyDCRAJEJEGgyQQw6Qrgcgygr6CzAgsgf4Y4I4NwlyT9CgghZg4eXgkw05MwghSw6caw2w6wew0IRwv4f4CwCQhA9wvHfg0wgYWI75UwGw9VIHeuVcY4bYPQ0yBdYwj6WqLSMHJpSBbocRQLGJfuUvPTMAF0cSI8YcZCWuGdGAVwAAQk4D6OiFIBGIlWX1Xzb3GP6JQKaM4BaO7nXTADGImLQRGN32gLqQ7BulMhTzTwHAzxwK+2438143CTgIOMkmLzyDcjIle1CguCyA12YCyEwJgEIAWHsg6KeLqXqLeI+K+M9F+P+MP3CGYAwEuIHFCjP1LzhJdH62mDqS/yKhhLhLLwrw7xrwX3rwxJ/z/3XzxK7wJN2P62j1hKHxxNHzJOn1n20m7yX3oN/zX3b033xJ3yQSpLACxNpLUzPyQKvxvzgDv2+MfxwOf3wLf1vk/1mPZPmOQCQIKFQNTnFIwKwKfzwNf0IIWgeiQX2KKhqLxzqNCk0kaIcVWLaLAE0n7gFKPy6J6K2J3EGI+lGIWMmOmKJJXyVIQgKFdOQitOaNaPWM2P6J2KNNXjuNulYX4kEhqDtRAGQEXX6H7HSwtyt1ywUBgUqBwmKBCGYFmwKzKx+2Oi830hdzdxMBwn0lLwcyzHukNURHJAsF2B1jjUHR7UuCH37SQGGlRAzTlCQDtjHVzSdg1ALSwOgAcmxJHyANEG0Ezhs2mG6kMVSXMLjk1wKBs2QDuhzEfmflIhdAAGphoyIwQqJyEmzd1348B/SFFqNxJ990Vns8cYAFgCRTsIYIVRIBxzhKhPQWNQEHtL0bke9GlBNAMlZEwuBTM/w2dL0G5vlSAiFFyQCGkFdyFKEMIrsELJNvEcIRB4Jkiip1V4Vv1f1iV0FYt4s/9EgXRtgsxzcstrd9JvkwAkQisltXhKh6tOLQ8lz4AOKohthLDe5EhihthvcOsJCXQlFALgL/9ccFdWkIs6L7CZBigkIE8FNMzpt2Lbd8xFtlsZxHcEUNtXctsPctLZKustLdLoInL1tzg4AswTtC97i4AoSeYTkuBQpVAASj8R9NJKlTkChJ968t5/LfS5iAzXIqkCh1AkF98oSZNQrwq0BEBZ8sq4rHzw5/Lkrdi0rNFJJTIddOA4s7KXL9KptLcZtjKeKzKysKtLLqybKDI7L9tOtHL49nL+rXKtB3LTxkIY98I49SAE8MIWFhQ2EUBEyCJkyiALBihho1qa1mzhBWy9DhphozUBQOyey8A5N+yaChySQRz0Yc1PVJyp08BTTt4TZo4YxhZwp7xxZopnr4oYxZZ0oN4j5mxVYVg209DtgO10QcZ9YRRLhjZSYXqKZ7UByLrh1fgKQbraQ2Ypy8BC0A0vZOAnlRACgi4SpKhS5y5K4a464txG5+4So24O4how1czTk6acpB5VkR4Lwx505J5Oa+4rpOBL5Zhr4pRX47z909BD0+MuANlfFtQdl2J0gSBSJCbRrFlolgxTJCMhEZaaMeVtlcVoVt0VaCboJzwkINaylQgk8daBw9a5atkFajalaZBTa1bLaolrataio7bOAHaDbnaOd4BlaDkPalwvbf4bbQbwb9rOyBRobrU8BCazrBzrYrrVA0YMbHYsb7q9BcbPYHIOaIjR4Eh0IJ5pF+aY6/hB1O1DhuyYa8Bi605U6UbnVnA/hNhs6J1vUOZXYkMi18aICwhy6wBuBF58BKbaBa4yjFBXB0VhbAk6Ixa35Jb9AJ6yJilH8FEeaMIY6kQhQ66Bzu1G6xRd7Qhx64AVAkbzr066YkRR0gRvBeJ/AhiTry8Y7JBMZIbRzsapbz6Mo7Ar6ChOphojhtgGYa60ZJALA5prBr4wGIHVAoGYG4GEHwHIGkRoHYGcJ4G6JEHMHsG0G6JU6iRhy6Y7YkYQhYAmQYRHIwpvxVJEh1I58ly9JDIuc2ATITSninr4afrOh6iAwIoQwhxrh+HpZEoJD6DagFcVFIZbsfwMp2I2AwgoDixLlbFMoVMFBTsTpCpeMHh+BphdL9acI9J5EMIJC+Go4BGZZbUWpspg0MBQ1RoKBso2otJK0LBq1m0/H/GG1eorppHHiQry9R8YpR78DgHcq4bbHJHihCafQFDK6IjSgAHL78AJD/AH9RAkBQBAh5Af1Qg8AEIQBXBXAgA==="} +import { Hooks } from 'wagmi/tempo' + +const changeTransferPolicySync = Hooks.token.useChangeTransferPolicySync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +changeTransferPolicySync.mutate({ + policyId: 1n, + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', changeTransferPolicySync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.changeTransferPolicy` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const changeTransferPolicy = Hooks.token.useChangeTransferPolicy() +const { data: receipt } = useWaitForTransactionReceipt({ hash: changeTransferPolicy.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +changeTransferPolicy.mutate({ + policyId: 1n, + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.changeTransferPolicy.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.changeTransferPolicy` Return Type](/tempo/actions/token.changeTransferPolicy#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.changeTransferPolicy` Parameters](/tempo/actions/token.changeTransferPolicy#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.changeTransferPolicy`](/tempo/actions/token.changeTransferPolicy) diff --git a/site/tempo/hooks/token.useCreate.md b/site/tempo/hooks/token.useCreate.md new file mode 100644 index 0000000000..fcc95675f8 --- /dev/null +++ b/site/tempo/hooks/token.useCreate.md @@ -0,0 +1,83 @@ +# `token.useCreate` + +Creates a new TIP-20 token, and assigns the admin role to the calling account. [Learn more](https://docs.tempo.xyz/protocol/tip20/overview) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"3d490a002c7e2f3cbae101c3273591aa8fdaec268e90c4041b25fc475f2316e1","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const createSync = Hooks.token.useCreateSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +createSync.mutate({ + currency: 'USD', + name: 'My Company USD', + symbol: 'CUSD', +}) + +console.log('Token address:', createSync.data?.token) +// @log: Token address: 0x20c0000000000000000000000000000000000004 +console.log('Token ID:', createSync.data?.tokenId) +// @log: Token ID: 4n +console.log('Admin:', createSync.data?.admin) +// @log: Admin: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.create` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const create = Hooks.token.useCreate() +const { data: receipt } = useWaitForTransactionReceipt({ hash: create.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +create.mutate({ + currency: 'USD', + name: 'My Company USD', + symbol: 'CUSD', +}) + +if (receipt) { + const { args: { token, tokenId, admin } } + = Actions.token.create.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.create` Return Type](/tempo/actions/token.create#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.create` Parameters](/tempo/actions/token.create#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.create`](/tempo/actions/token.create) diff --git a/site/tempo/hooks/token.useGetAllowance.md b/site/tempo/hooks/token.useGetAllowance.md new file mode 100644 index 0000000000..288c8d8ac2 --- /dev/null +++ b/site/tempo/hooks/token.useGetAllowance.md @@ -0,0 +1,42 @@ +# `token.useGetAllowance` + +Gets the amount of tokens that a spender is approved to transfer on behalf of an owner. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"b0c37f5d3bb0182fd912e817d276901fd1c5110436708118f3f541db520ed0f9","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: allowance } = Hooks.token.useGetAllowance({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + spender: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Allowance:', allowance) +// @log: Allowance: 10500000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `token.getAllowance` Return Type](/tempo/actions/token.getAllowance#return-type) + +## Parameters + +See [Wagmi Action `token.getAllowance` Parameters](/tempo/actions/token.getAllowance#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`token.getAllowance`](/tempo/actions/token.getAllowance) diff --git a/site/tempo/hooks/token.useGetBalance.md b/site/tempo/hooks/token.useGetBalance.md new file mode 100644 index 0000000000..3c2a4ce27e --- /dev/null +++ b/site/tempo/hooks/token.useGetBalance.md @@ -0,0 +1,41 @@ +# `token.useGetBalance` + +Gets the token balance of an address. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"c7528612435a35df89295a7a12ef72ca886311a30623cf9079ae2b6b2e88aefc","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: balance } = Hooks.token.useGetBalance({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Balance:', balance) +// @log: Balance: 10500000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `token.getBalance` Return Type](/tempo/actions/token.getBalance#return-type) + +## Parameters + +See [Wagmi Action `token.getBalance` Parameters](/tempo/actions/token.getBalance#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`token.getBalance`](/tempo/actions/token.getBalance) diff --git a/site/tempo/hooks/token.useGetMetadata.md b/site/tempo/hooks/token.useGetMetadata.md new file mode 100644 index 0000000000..1308116c08 --- /dev/null +++ b/site/tempo/hooks/token.useGetMetadata.md @@ -0,0 +1,48 @@ +# `token.useGetMetadata` + +Gets the metadata for a TIP-20 token, including name, symbol, decimals, currency, and total supply. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"ba0d6e59f59bb9a5429e5c8f90558913930bfe2f294f96336382a6252f972e31","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: metadata } = Hooks.token.useGetMetadata({ + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Currency:', metadata?.currency) +// @log: Currency: USD +console.log('Name:', metadata?.name) +// @log: Name: United States Dollar +console.log('Symbol:', metadata?.symbol) +// @log: Symbol: USD +console.log('Decimals:', metadata?.decimals) +// @log: Decimals: 18 +console.log('Total Supply:', metadata?.totalSupply) +// @log: Total Supply: 1000000000000000000000n +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `token.getMetadata` Return Type](/tempo/actions/token.getMetadata#return-type) + +## Parameters + +See [Wagmi Action `token.getMetadata` Parameters](/tempo/actions/token.getMetadata#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`token.getMetadata`](/tempo/actions/token.getMetadata) diff --git a/site/tempo/hooks/token.useGrantRoles.md b/site/tempo/hooks/token.useGrantRoles.md new file mode 100644 index 0000000000..6067b1d164 --- /dev/null +++ b/site/tempo/hooks/token.useGrantRoles.md @@ -0,0 +1,79 @@ +# `token.useGrantRoles` + +Grants roles to an address for a TIP-20 token. Requires appropriate permissions. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"f4391afb0618a6365e397f75dd69c90dea54e09d9cd37c91d8c93575a93d1dde","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const grantRolesSync = Hooks.token.useGrantRolesSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +grantRolesSync.mutate({ + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', grantRolesSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.grantRoles` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const grantRoles = Hooks.token.useGrantRoles() +const { data: receipt } = useWaitForTransactionReceipt({ hash: grantRoles.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +grantRoles.mutate({ + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const events + = Actions.token.grantRoles.extractEvents(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.grantRoles` Return Type](/tempo/actions/token.grantRoles#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.grantRoles` Parameters](/tempo/actions/token.grantRoles#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.grantRoles`](/tempo/actions/token.grantRoles) diff --git a/site/tempo/hooks/token.useHasRole.md b/site/tempo/hooks/token.useHasRole.md new file mode 100644 index 0000000000..1d61b53772 --- /dev/null +++ b/site/tempo/hooks/token.useHasRole.md @@ -0,0 +1,42 @@ +# `token.useHasRole` + +Checks if an address has a specific role for a TIP-20 token. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"306dac353c73a78bf54e64cd30cbda4af1447f271833545285c0d219109fa181","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const { data: hasRole } = Hooks.token.useHasRole({ + account: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + role: 'issuer', + token: '0x20c0000000000000000000000000000000000011', +}) + +console.log('Has issuer role:', hasRole) +// @log: Has issuer role: true +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Return Type + +See [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook return types. + +### data + +See [Wagmi Action `token.hasRole` Return Type](/tempo/actions/token.hasRole#return-type) + +## Parameters + +See [Wagmi Action `token.hasRole` Parameters](/tempo/actions/token.hasRole#parameters) + +### query + +See the [TanStack Query query docs](https://tanstack.com/query/v5/docs/framework/react/reference/useQuery) for more info hook parameters. + +## Action + +- [`token.hasRole`](/tempo/actions/token.hasRole) diff --git a/site/tempo/hooks/token.useMint.md b/site/tempo/hooks/token.useMint.md new file mode 100644 index 0000000000..98ccff907d --- /dev/null +++ b/site/tempo/hooks/token.useMint.md @@ -0,0 +1,83 @@ +# `token.useMint` + +Mints new TIP-20 tokens to a recipient. Requires the `ISSUER` role. [Learn more about roles](https://docs.tempo.xyz/protocol/tip20/spec#role-based-access-control) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"81309f31f44049ff315a55266231b03aaae8e5d9663c808078d1f3aa60a60d20","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const mintSync = Hooks.token.useMintSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +mintSync.mutate({ + amount: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Minted amount:', mintSync.data?.amount) +// @log: Minted amount: 10500000n +console.log('Recipient:', mintSync.data?.to) +// @log: Recipient: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.mint` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const mint = Hooks.token.useMint() +const { data: receipt } = useWaitForTransactionReceipt({ hash: mint.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +mint.mutate({ + amount: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { amount, to } } + = Actions.token.mint.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.mint` Return Type](/tempo/actions/token.mint#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.mint` Parameters](/tempo/actions/token.mint#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.mint`](/tempo/actions/token.mint) diff --git a/site/tempo/hooks/token.usePause.md b/site/tempo/hooks/token.usePause.md new file mode 100644 index 0000000000..8f9067b2ed --- /dev/null +++ b/site/tempo/hooks/token.usePause.md @@ -0,0 +1,75 @@ +# `token.usePause` + +Pauses a TIP-20 token, preventing transfers. Requires appropriate permissions. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"b185b955305cbee6f008ea6d7efc12dbee30325aec9fb62314d68f7658e4fa9c","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const pauseSync = Hooks.token.usePauseSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +pauseSync.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', pauseSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.pause` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const pause = Hooks.token.usePause() +const { data: receipt } = useWaitForTransactionReceipt({ hash: pause.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +pause.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.pause.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.pause` Return Type](/tempo/actions/token.pause#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.pause` Parameters](/tempo/actions/token.pause#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.pause`](/tempo/actions/token.pause) diff --git a/site/tempo/hooks/token.useRenounceRoles.md b/site/tempo/hooks/token.useRenounceRoles.md new file mode 100644 index 0000000000..9f64006754 --- /dev/null +++ b/site/tempo/hooks/token.useRenounceRoles.md @@ -0,0 +1,77 @@ +# `token.useRenounceRoles` + +Renounces roles from the caller for a TIP-20 token. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"b76e1df0be1a3b2792bb8c4a1ab224f7963d06a0ffa907fcd104f996453f6d0e","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const renounceRolesSync = Hooks.token.useRenounceRolesSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +renounceRolesSync.mutate({ + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', renounceRolesSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.renounceRoles` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const renounceRoles = Hooks.token.useRenounceRoles() +const { data: receipt } = useWaitForTransactionReceipt({ hash: renounceRoles.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +renounceRoles.mutate({ + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const events + = Actions.token.renounceRoles.extractEvents(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.renounceRoles` Return Type](/tempo/actions/token.renounceRoles#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.renounceRoles` Parameters](/tempo/actions/token.renounceRoles#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.renounceRoles`](/tempo/actions/token.renounceRoles) diff --git a/site/tempo/hooks/token.useRevokeRoles.md b/site/tempo/hooks/token.useRevokeRoles.md new file mode 100644 index 0000000000..399f394b24 --- /dev/null +++ b/site/tempo/hooks/token.useRevokeRoles.md @@ -0,0 +1,79 @@ +# `token.useRevokeRoles` + +Revokes roles from an address for a TIP-20 token. Requires appropriate permissions. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"feffa8dd71c04910b36e8e796cdfdc9026dde663ac6793cf3241ca53a1f00b9f","data":"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="} +import { Hooks } from 'wagmi/tempo' + +const revokeRolesSync = Hooks.token.useRevokeRolesSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +revokeRolesSync.mutate({ + from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', revokeRolesSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.revokeRoles` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const revokeRoles = Hooks.token.useRevokeRoles() +const { data: receipt } = useWaitForTransactionReceipt({ hash: revokeRoles.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +revokeRoles.mutate({ + from: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + roles: ['issuer'], + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const events + = Actions.token.revokeRoles.extractEvents(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.revokeRoles` Return Type](/tempo/actions/token.revokeRoles#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.revokeRoles` Parameters](/tempo/actions/token.revokeRoles#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.revokeRoles`](/tempo/actions/token.revokeRoles) diff --git a/site/tempo/hooks/token.useSetRoleAdmin.md b/site/tempo/hooks/token.useSetRoleAdmin.md new file mode 100644 index 0000000000..c72f5a8729 --- /dev/null +++ b/site/tempo/hooks/token.useSetRoleAdmin.md @@ -0,0 +1,79 @@ +# `token.useSetRoleAdmin` + +Sets the admin role for a specific role on a TIP-20 token. Requires appropriate permissions. [Learn more about token roles](https://docs.tempo.xyz/protocol/tip403/spec) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"c4dfbc1c2509d94e1eda6bf007b494a3199ae8c05d6345fb80ca7a05858d98eb","data":"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="} +import { Hooks } from 'wagmi/tempo' + +const setRoleAdminSync = Hooks.token.useSetRoleAdminSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +setRoleAdminSync.mutate({ + adminRole: 'defaultAdmin', + role: 'issuer', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', setRoleAdminSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.setRoleAdmin` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const setRoleAdmin = Hooks.token.useSetRoleAdmin() +const { data: receipt } = useWaitForTransactionReceipt({ hash: setRoleAdmin.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +setRoleAdmin.mutate({ + adminRole: 'defaultAdmin', + role: 'issuer', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.setRoleAdmin.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.setRoleAdmin` Return Type](/tempo/actions/token.setRoleAdmin#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.setRoleAdmin` Parameters](/tempo/actions/token.setRoleAdmin#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.setRoleAdmin`](/tempo/actions/token.setRoleAdmin) diff --git a/site/tempo/hooks/token.useSetSupplyCap.md b/site/tempo/hooks/token.useSetSupplyCap.md new file mode 100644 index 0000000000..3c30b0c8ae --- /dev/null +++ b/site/tempo/hooks/token.useSetSupplyCap.md @@ -0,0 +1,79 @@ +# `token.useSetSupplyCap` + +Sets the supply cap for a TIP-20 token. Requires appropriate permissions. [Learn more about roles](https://docs.tempo.xyz/protocol/tip20/spec#role-based-access-control) + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"d3b1cd4a14575e906a78bb7cbc3171540f904daf431667513fb951963d8d9fc1","data":"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="} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const setSupplyCapSync = Hooks.token.useSetSupplyCapSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +setSupplyCapSync.mutate({ + supplyCap: parseUnits('1000000', 6), + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', setSupplyCapSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.setSupplyCap` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const setSupplyCap = Hooks.token.useSetSupplyCap() +const { data: receipt } = useWaitForTransactionReceipt({ hash: setSupplyCap.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +setSupplyCap.mutate({ + supplyCap: parseUnits('1000000', 6), + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.setSupplyCap.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.setSupplyCap` Return Type](/tempo/actions/token.setSupplyCap#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.setSupplyCap` Parameters](/tempo/actions/token.setSupplyCap#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.setSupplyCap`](/tempo/actions/token.setSupplyCap) diff --git a/site/tempo/hooks/token.useTransfer.md b/site/tempo/hooks/token.useTransfer.md new file mode 100644 index 0000000000..6ba5029943 --- /dev/null +++ b/site/tempo/hooks/token.useTransfer.md @@ -0,0 +1,85 @@ +# `token.useTransfer` + +Transfers TIP-20 tokens from the caller to a recipient. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"7775daec2b381b6bcd7a8eff1994271be08a51ae7321b1edd956fd4293c96767","data":"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"} +import { Hooks } from 'wagmi/tempo' +import { parseUnits } from 'viem' + +const transferSync = Hooks.token.useTransferSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +transferSync.mutate({ + amount: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transfer amount:', transferSync.data?.amount) +// @log: Transfer amount: 10500000n +console.log('From:', transferSync.data?.from) +// @log: From: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +console.log('To:', transferSync.data?.to) +// @log: To: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.transfer` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { parseUnits } from 'viem' +import { useWaitForTransactionReceipt } from 'wagmi' + +const transfer = Hooks.token.useTransfer() +const { data: receipt } = useWaitForTransactionReceipt({ hash: transfer.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +transfer.mutate({ + amount: parseUnits('10.5', 6), + to: '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb', + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args: { amount, from, to } } + = Actions.token.transfer.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.transfer` Return Type](/tempo/actions/token.transfer#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.transfer` Parameters](/tempo/actions/token.transfer#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.transfer`](/tempo/actions/token.transfer) diff --git a/site/tempo/hooks/token.useUnpause.md b/site/tempo/hooks/token.useUnpause.md new file mode 100644 index 0000000000..225f7eaea6 --- /dev/null +++ b/site/tempo/hooks/token.useUnpause.md @@ -0,0 +1,75 @@ +# `token.useUnpause` + +Unpauses a TIP-20 token, allowing transfers to resume. Requires appropriate permissions. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"d93f9e8e1b5b8ad9644753f33d39aaff041fc2bd4761737cbca90bbd074879b5","data":"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"} +import { Hooks } from 'wagmi/tempo' + +const unpauseSync = Hooks.token.useUnpauseSync() + +// Call `mutate` in response to user action (e.g. button click, form submission) +unpauseSync.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) + +console.log('Transaction hash:', unpauseSync.data?.receipt.transactionHash) +// @log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +### Asynchronous Usage + +The example above uses a `*Sync` variant of the action, that will wait for the transaction to be included before returning. + +If you are optimizing for performance, you should use the non-sync `token.unpause` action and wait for inclusion manually: + +```ts +import { Hooks } from 'wagmi/tempo' +import { Actions } from 'viem/tempo' +import { useWaitForTransactionReceipt } from 'wagmi' + +const unpause = Hooks.token.useUnpause() +const { data: receipt } = useWaitForTransactionReceipt({ hash: unpause.data }) + +// Call `mutate` in response to user action (e.g. button click, form submission) +unpause.mutate({ + token: '0x20c0000000000000000000000000000000000000', +}) + +if (receipt) { + const { args } + = Actions.token.unpause.extractEvent(receipt.logs) +``` + +## Return Type + +See [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook return types. + +### data + +See [Wagmi Action `token.unpause` Return Type](/tempo/actions/token.unpause#return-type) + +### mutate/mutateAsync + +See [Wagmi Action `token.unpause` Parameters](/tempo/actions/token.unpause#parameters) + +## Parameters + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +### mutation + +See the [TanStack Query mutation docs](https://tanstack.com/query/v5/docs/framework/react/reference/useMutation) for more info hook parameters. + +## Action + +- [`token.unpause`](/tempo/actions/token.unpause) diff --git a/site/tempo/hooks/token.useWatchAdminRole.md b/site/tempo/hooks/token.useWatchAdminRole.md new file mode 100644 index 0000000000..24741775d9 --- /dev/null +++ b/site/tempo/hooks/token.useWatchAdminRole.md @@ -0,0 +1,35 @@ +# `token.useWatchAdminRole` + +Watches for role admin update events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"149a552ec742b4dd66646f0d767625b9e60928a7afe48d207c20bce63c3d7530","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXGgC8lGaugAssUmKymoamTp47fydeWZIRSC29o5+iABsVdRetb4NAfR4AGYArmCOjBBgnIdwMADqomi2AIJQzKYAShByADwAwuf7jAUAD4ABRYezMHRkOAAfkQnGAAB0LpxUQtTABJKBwzhgQ7MABGZE4AB9LmBYACzFAANzI1GozKw+FIlEMhmkT4wHEAAwstAAJMARKRTApXDzSZw+YLhWhRYoJcgALpSvEyGRS46U/K0+nshlmADuz1eYA+cl5/KFIrFEqlMpt8rtPJVasOGq1FJgVJgerZBuu3tIVtltsVkrJjrlCvFrtVZPVmrJ2p9urpAdcXp11Iz7P2nOYACEZBBrPwcQTAaYuCnvb7/ezzgBRUickPwkEgsjt+Gt9sASk4AF4gZwiBBGFAh3Wc37s2nc/rUWwNTj5YcYAuG9v08vOKuTIoMWAnERRDIcXjCcTZ4v53eG3mGecLTBTaYAKpYKD3P04rsmXhI17ieF53i5AA6R4tDgChOFLBRgNA/AP3NKCABkIAUIdR3HSdp13JcAwmeQcQAFQ6MAsQAeVIZ4oFIeA4CIv1nzRf5ARxP4wABBRWMbBl5FEAk5GxeECT4ORRAuR9dQEjNXAHeEJynZEwFESE4HBawtyuW4ULQt9/CgMsED0HJOH2dhOBAh58DFThyIxAAFAoLE4UiLk5OROFEcCLkOH8/zgSD/DEBRzOQZAQDoTSsDkfweWStA4FoZEQlaBFwkMTgswLCBmE4AByECFFeAB6GgWmK5FkSOE40DOC5HiwLAQSHVlURyUKvMg/S7nsoyuRBLqX3QuQ0O/X8aCgEEmU6/cOLAOAoMQkFirfPyAsuYLZsQYr4IW/d3H1JS6pRJi0EOUgLi+KBGCIIFBtsRzrNITgfK3fyzV2mb4EgwGvgqh6nuRVxkWSnkQGVCgYvBUpmH8BHNKhUgWIAWk4FyITR0KYdhkBogkRAemkYxkiGRAAEZEgyLQxj0AbDIC4zpkKYpFnKGmCnWTAaj0Oo/EaPY9DBTkcA4DAh1fLkpr2/9O3m2DkKG1moJgyL4MQ1WwLNN9IKwnCRzHVTCLk6kTLMvAfgvGQCQcfhPIgThTAnSZbPweQ/M+rltt+xgWKC/6oDC4RuiQeJqYGFIkGpgAOEYGaCWXJoC6a/ygfwj3Mfp5hKMpll5jwNgFnx6nCpoxZRyEnCHICEX3L74WjcM43Y3EYBNdW5Bb60YxdDug1gUg+7DZ0I0UroYikOY5EGVIeiTrI8CZbP8iQPOFlKJZnAKWI+c2QXtkr0WQDBXG64Q7DddQnuYEN7Dp5JyRE4phfN+XxnjCf9nP/zrmRc3Al35t4IWOwaBnw0lpHSW5rDnFWnIZE54PrwJWlyeEPFEG4CoKZaw5kQDkS9tKNB2DJTMGgB6LcWBORECnPAH2cAQi+VgASQ4CgFCOVIX7ZQ9xXYsSYa8GQ4hnaeS9siAAUqIc8ABlawoosBcG4b5SECwwCByKjQ4g9CoCcAJBgWyMACR6M5Eaa46NIIXSIVuChUAqGcDoKEVKnkjQu20jAawjAATWE4PAloZhTxwEQBdAAVJwR40osFcklNYYRcAWJGkYMoTgtdCBQAEYcWwfkWI8mUQ/daA4eTwVyQgqCPZ2AdUlDJXRJT0FyEgiBW6lSxF8OsDJPRelri6PaLZUUNBREyQMQAOWgA/AAVgI+UMBNKWLAGEiJChSwO01LUshrsVpiBOHAziCgbrzh6UaPpW4enIB5Fo3S8TIIiFMocNAPJlQgnwGgNAWAgkVQqpAWAEzILsAUCDMyFVhE0BEBjIgBQeiQVoBVUQWBGAVXOcxSCTzmAyAAMQIvidciAtz64UmRKcjFoVrk9nuY855rzEDvM+TAb5vz/n4MBSFNAoLwWQuhbC+FnILmhWRWiwlxK2wDkgk5YhiyIDLJIaUuQMT2lEkuF02ySTCC3Ndi0DgjllBbh5NSxAeTyGUPqRdAA+iEkJdxbpilNUa+E1jOBiolXkzg4qxkeLQMVFiqToAsXEFuMwSriSkMDjQU8MgMDIjgBgE4+BOSQCuAhRgHtNUmIgGY4kjwXIYhYpqgxTFriEjkPBSAH0fViJgAYwNIh5BoFDciUQEao0xuxSxEwHs7ZOs1R9EZsBIITM4CKaZzBQqcBkTAY5xDTmQH6ecA8XLmKcAxBVGipKnkvLeR80ZtKtD0rgIy4FzKwUQqhTCuFhKkVoBRai0QGNJ0wAxucDGhKMZnCHO9ZEFCmLrPeswe4zVZnImbLQeKvkrgatFUsi8kq6kwB5MEsAkNkoTORHkyC61ipew1C7VxpAZBQGKgODM7zsYKlSvCdDpZbLsBw/BHpWLblIalfk7CG0yMuwAKRwEOiVLDOG8MEYqkRmsQTOAsYo9hqA1G3FoBuWgejUHILlNICCY0nB+wVOKjcQgEBXnwVWqkxyDtdF2DavIP0eH8PIkIy5YjLEFMpOYqIbQfkKR9rEOWTyO9jmSZHqPCz/HUSqdHpwDTfBtN9sKjoByig9H+WEzCnA1JfMGj4cgGA54ZDKjSDTVQiX2R8LkQotAkFSDHBPEQwOPFIFcCU6MxARBmA01iAUGm8cBw5YZHwmiBIXWOCKyVsAZW4AVcCJwarsBav1diBYSQiBYgtba4yLgOqaxkA0jITlZZmIVToB425zVEDxHiDTSQ82/JcBS2l5UGNDlxbIKsRABQCgnb4ali8+XGCKJG0t08K2Lzre5Vt2gO2mrnH2ysVYFhWtgEI7lxbNXlu3V+9+0wW20tGrbvd2IM2LqkMW6jEcJUbiME9B8Ks6CwDFQzMhxpYAQQ8gACIyW0B9IU0CYCuAAIScAZ4oMg7OeTmah/xqzgn4Tc6Z0FonmoSemFWmATnYvecSZc95+DPILoAaA500DWqonSt8XEoJF0oaIZOAgrg2KuDDjtToGRUzNIyPC4QI0HVKdm4cW2fHWRbdMXt47lNLvZMiBSRgXXW4rfKeQ6HkEFv4I9gF2+kPDGUNMbQzADDomeMC8s9Z0jafyPcfE6Ii3CfQ/J4UMxvPbGOPwVKpR3DWehc5+E5XjPheenF7AMwRPcmFNKa7iptsangtabgmFvTUWDOxeM9SMzfGBOBPhMgAL8Jh+hd0xF/TMWjPxb9LDURPZsdu9Z/j9TkvODS7JxTkvSfqe04V8z4ArOOdc8Z7z/nc/hcL5fzzj6hPifipl3OHl1f1IHZyVwPzAChnCgcyihimuBwRAGQFWhul0geRXQpXeU4WUEOAJEgj8XXS+R3WpQqlEnFQqgPTZRMAJAqmQwmQHAJnDhnhpmpjnkplSDpk0BXj0DyXXhmFJk5h3m5h6EPjLnAVPiCBBE9UIlL3Wi0jgAc25HhEGXgkBh+UUWagvBxkRiE0GRVGUnwinBGwAGpqYnV6hSx/J6DcFrY9BP9nEekeRaM7lFVkljQc5hUABZD0JqBKb6LQfEKtFiNpC4OVcEeJP0eCRJZJTVeqRgdGLgfSXROtUtGdFgcQAxOQhQpzJIz0fyB6YHVbeVecZIuAHAkQJJXbc4ZBC8TcARFgInERE5M5YjfYEEWIQpNA8lSlCqb9MAeIH5LdI8Q4KFXoh9BQndXo2ITlGsfYSCWIM9FFSHEEJNTIAIwJPyD9NtMIhVJo3bGQSCL9e4SpTo1dbo6lTdP5PBHdIFeAfdVlI9DlPYhYtFPYw4tAN4jGBaIVI3BDOAQPJRbFU8fHVQV3OTVDeBY4NAeEVjXDeCCE08BvefEjXxQEqEzgdQURJwwPNaFPeEqEzjPExEuwoTPE+EDEmjKTDvKGC6EdLcU5J4t444slU4qlDdUKOlK43dW4llQ9dlOFJ43lVFV49gb9d4kU+4T42CF9Gyd9LcUwN439aAyKJAaKImUwXSfwIgCwSCamHUiwCwBgomCOHmKwd+WOGbL+IIRCXg8wJeABQQ5YFgkQsBE+EWCQmuNGeuFWRuAMZuaUfuNuCUDuY0YaXuf08eWMIM/cYeW7cMp0SMnkKeRgkmamWIPOeec0u0zg7+NeP+fg+0wuPeVQZ0rYCuN0vAcWLTMgTAIcLyCiKiWieiKARiOdC2P0K2fBPABiXNFiGyDEOnJ1fYFI5yNyDyPqZ+XQamHoFYGOKmdIbMoILyG0pAGcgs3eWYVwQmeBWAZoJxbKHqPKKyQsLjBzSqaqNgWqODMAHqSCPqZmNWfWEaMaVOd8dOBWKATsJkbWbCXCMcMaZabBMvDaICTjY6FEU6FELyeEYqfkdyawfUhCxCpC5ClC1C/Uw6cGKwkAWuUQJAUAQIeQJhc4cYBAVwVwIAA=="} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchAdminRole({ + onRoleAdminUpdated: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchAdminRole` Parameters](/tempo/actions/token.watchAdminRole#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.setRoleAdmin`](/tempo/actions/token.setRoleAdmin) +- [`token.watchAdminRole`](/tempo/actions/token.watchAdminRole) diff --git a/site/tempo/hooks/token.useWatchApprove.md b/site/tempo/hooks/token.useWatchApprove.md new file mode 100644 index 0000000000..075709c502 --- /dev/null +++ b/site/tempo/hooks/token.useWatchApprove.md @@ -0,0 +1,35 @@ +# `token.useWatchApprove` + +Watches for token approval events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"1549f2859212b937c8657167655eeec354f9caa629bbd015ce5aa6a9316baad6","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchApprove({ + onApproval: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchApprove` Parameters](/tempo/actions/token.watchApprove#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.approve`](/tempo/actions/token.approve) +- [`token.watchApprove`](/tempo/actions/token.watchApprove) diff --git a/site/tempo/hooks/token.useWatchBurn.md b/site/tempo/hooks/token.useWatchBurn.md new file mode 100644 index 0000000000..be8c2b59ab --- /dev/null +++ b/site/tempo/hooks/token.useWatchBurn.md @@ -0,0 +1,35 @@ +# `token.useWatchBurn` + +Watches for token burn events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"6bdef3454b786456322850b22fda9f6b5e83f7c766139b4da151ac51f819efe7","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXGgC8lGaugAssUmKymoamTp47fydeWZIRSC29o5+iABsVdRetb4NAfR4AGYArmCOjBBgnIdwMADqomi2AEKHpGAAPADC5/uMCgB8AAosPZmDoyHAAPyITjAAA6F04iIWpgAklAoZwwIdmAAjMicAA+lzAsB+ZigAG54YjEZlIdC4QiaTT9qQIMwMQADCy0AAkwBEpFMClcnMJnG5fIFaCFilFyAAuuKsTIZOLjqT8pTqTTXOqSTAyTBtUzOKz2Y8ZBBrPwMTjfqYuESNYatVTTecAKKkNmkDEAgFkX3Q72+gCUnAAvH9OEQIIwoBHnQajVB9Zrye7mWxVRiZYcYOnXeSi6mszScyZFCiwE4iKIZBisbj8cmM8bS26dYjzs9Xv6AXToQB3e5PF5gAB0AEEtHAKJwrQoR2P8H2pwAZCAKCPR2PxxOdzPdzgTeQYgAqHTAaIA8qRp1AoKR4HAj8by0jvr8MV8wD8FHfE1mXkUQcTkdFoRxPg5FEC422LDsELLeFXDDaE4wTeEwFEUE4GBaxCyuW5V3XfwoGtBA9ByM12E4UcHnwYVOAvFEAAUCgsU9r04HEJ04GASFrOBJ38MQFCo5BkBAOhcKwOR/E5JS0DgWh4RCVoYXCQxOD1c1mE4AByUcFGYRgAHoaBaQz4XhI4TjQM4LmnLAsABCNGURHIRLPKdiLuRj1wBTyaV7CdBznDyTy/MA4AgORJyXAFDPXRBDIXOkwxPdwdTQ2yERfNB+LeKBGCIP4AtsZj9jovjXhEydJzeczSvK1D4SUzkQAVChpOBUpmH8frcLBUg3wAWk4NiQVGkTup6kBogkRAemkYxkiGRAAEY5k0LI8H80iJ38KtCmKRZym2gp1kwGo9DqPxGj2PQgTZHAOAwCMwv7aEAyHeijteGc5wXJcV0CidJy3HcoxjTDD2QrVyMovAPgbGQcQcfhuM4Uw40mej8HkbjJlizhxELOryVE4RuiQFYVgGFJ6ZGLQxj0b6wBO/IkH6eYSjKZZro8DY7p8eoxKaF7htBJwI3+kLEX06FJX5QVhVFT9yeYCBjjQKCHVrd1XC6GIkHidI5EGVIelZ/a9DpbmZkQPmFlKJZnC2rabs2e7tkl56QCBGa5cXbdwfHIHodN5aAA4tqZza+b29njG3J3zFdgWPaQLb4h9sWHp2GhA5wvCCMLaxzjiuR4XrUhOCr2L4pgaE/xr3AqAo6wqJAC8iYlJuO7FHWoEOOROCwNkiATeByc4OAQgn2A+IUBRmKHlvTzsLhGDfRezJkcQceUGB4QAKVEesAGVrCFLAuE3ifQQWMA94MqfiFntMcQweiYBxLxNkw5rhjUnPlfuhZR7j0LHQUIKlTzDggAvHA1hGA/GsI3dkbAzDCUQPlAAVJwacEp24tzFNYI+cA3zDkYMoTgstCBQH3ocWw5M3ycifjARK253KcgXJw6uLdJxBnYHw8mJJB5CISqOV44jlD3EbnBXiRFrhpnaPRIUNAcZwT/gAOWgNwgAVvvGUMBcLgLAEQkhCgrSYzVII5ucgxSmGiCcSu34FAvA7Bo4cWjCwaOQJyT+hFqGThEBRQ4aBOQKgBPgNAaAsBwEQOZcykBYAmMnOwBQLVKLmSPjQEQ40iAFB6JOWg5lRBYAsiE18k54nMBkAAYlqdQiJus0DyxJPCIJrSRIRKDDEuJCSkkpLSYYzJ2Tck93yfceAaBimlPKZU6p5k+n1LQI0lpbJQnULQLAH0YZJwsQHrYiA9ipFOJgBQ5ReJLhqPonQwgUTcYtA4MxU+Ep0mty4SPaAMDLHwgAPoEIIXcV4wpQVAuhJAzgZyLlcM4OcoxMBHCGTfIw6Ab4KaYhgE8/EQ8940FrDIDA8I4AYBOPgNkkAriLkYATT5OJgGgOIWxFEb5T5/xfNcXEcgFyQAbjirlWDYpEvkGgUl8JRAUqpTS3Wb4TAE3Rki0+DcDGwEnCYheZjcIiU4NfGAASB5BMgNo84k8dmvk4Cicyt4hnxMSck1J3zJlaGmXAWZhSFklLKRUqpNSrVhIac00Q40zUwHGuccafTxpnAjDVUg8IdYvlxv+dgzB7hOUBWAT0tA5ITyuB805diGyXOHvgsAHUlImPhFwnhChkpE1VMgpBpAZBQEMmGd0qSpqyhUtCZtVp6LsA7QuDR7Sol1ukdwpKhkh3IIAKRwHSkZNtHau09vMn2x0yTOALpHe2qA47kGTrQNOq5IifRiLMMOTgoYxGGRuIQCASSFxxUYcxTGaY7CuXkMaLt3b4S9rYv2t8oiG54TgKIbQEi0zRBtKed2ATT37KDJW3tiIH2kGhM+vgb6F7sh0ExRQvFRA/qqTgckwHt3MkUcgQSDYFRpG2qoGjzJyZcFvvfNAk5SDHBrP3Pef4S5cABN8xARBmDbViAUbascspgEwzSRRt4cQoscHxgTYAhNwBE4ETg4nDGSek7ECwkgXYKfY3RrgEnHRkBwjINZQbPV0FRVEpyiB4jxG2pIazKmuAMfrDIBU40/GUbIKsRABQCj+dpFwRjMhuOMAfoZuztYHMNmc9aV85k3PWA8+cLzKxVgWEU8p+LmJjP2deFlzNpg8vBaBerRQ0XYgu3ykPWzI0oxGRuIwVUnAABK5zXHnEMu6etsiwAAk5AAETgtoBu/Iy4wFcAAQk4AtxQZB1uciA0p7doHd3Qm20tzg/XBsjftM3MAm2zu7ZPTqg5SawCdXynmgtqji2Fk5GQ5xjcqHJPyp1WtJxq5cA6b1rI19dXMGvkRwgw53KTYhwJH00OdCw5fLhBHoIkco4vSIBhGB/uFkjLiu99aycAg6QuIMB3k2k5nQ2ptMAW2Ho3QdkDYHB3s+Heu49OMOlM7J6z+d/Ol0roXMZUdnbudHd5/uyXnOhcaJF2AZgzPL0QfEzAO92Hkp4dffOQjn7SPfv3RF8kgGt07rwZwZA2HcMvoIx+4jX7yNW7/eSHqOMgydbR6t3rT6Btqmu2NsAE3Rcs+m7Nh7y3gCrY21txbu39t2+Ow7hPF2w/DdG7d+7afSDraewHt7SkxIwcktJa4ncQDIDii8QisTHWjNSevZQhwcSTirswcZGTPXfPMuBc55lfXLJMDicy9aTFhnmrTM2LhLYbVSIkDIbMghcIzkgW2/MLrLB6AXbwRcA5BABJiw8YukpQZgzADEuiFyNSyQ/JyDZpoDT3boxU6F9wJkMwANRbRIr1BWjkbz5dwox6BZ4IIaKchnpii0L0K3qnTHIACy48jk8khYmQ2IEqb41gtyhYwI1CxoC4SB+A28Z8/4jAY0XAxEaYMqVBlqLA4gf8t+sGcEjBg25GpUjk5wZaDB7CC83eIgdChWVaYAwWBY+8LAA2x8gSwS/a+wAIsQYYDqIyYymaYA8QWS7qVYhwFS2hMad+nq2hsQzmjo+wk4sQGyjSimAInyuBoIwk5MqaKqJBDyihHmMgk4iamaaAfCreIyzqA+MAbqOS3cnqBS8yiyfqKyFkPhdhzSPh/h9waRCymURyIONacAROj8ustYvWqgqOl6c6Vces0Ii6naC4FRtYCu9uA6WClRnA6gOMZ6ROwi5RhR+sq6dRnSmeSu/R0IbRE6+yGu72khhqhYQSSRGRQRwyTqYyrqIkUyURXqsRE+/qqySRIaTSqRGa6RhxmRkUtEkG7AhYpgGR2aVeEkSAUki0pghE/gRAFgk4W07xFgFgC+i0dM20FgfMVszMLsdsqcS4O+K0507sl0O0x+WwEsT05+Mso08sc4DIJ4ysEoPIasMoGsnIWsuEPRBs68RsqEMcugXsjM601su+oJQQjs0w5ge+bsgszgBQqgcJfsCJuwSJb0ZAmAEYvkl414d4D4T4PKb4iM5IyMPceAj4z41qdEKIc2SK+wzBrEHEXEvkNMvxS+O0a0QJm06QKcQQvkEJVJLJOc0WrgC0VcsAzQ8CWk3kukZobIBkxkMGZklkMA1k+U3kk42ph0EMciIUnMv0dIoM24u4MYisoqHc4uQ4q6mUuUFAOovk0IhkPInE1gXxuZeZ+ZBZhZRZXx6UqEEBIAssogSAoAgQ8gi85w4wCArgrgQAA==="} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchBurn({ + onBurn: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchBurn` Parameters](/tempo/actions/token.watchBurn#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.burn`](/tempo/actions/token.burn) +- [`token.watchBurn`](/tempo/actions/token.watchBurn) diff --git a/site/tempo/hooks/token.useWatchCreate.md b/site/tempo/hooks/token.useWatchCreate.md new file mode 100644 index 0000000000..9106e60c61 --- /dev/null +++ b/site/tempo/hooks/token.useWatchCreate.md @@ -0,0 +1,34 @@ +# `token.useWatchCreate` + +Watches for new TIP20 token creation events on the TIP20 Factory. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"ac42775d21c15bba9530036c843c3f7209edb0afc3fa66af279c7dfb7b6482f6","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchCreate({ + onTokenCreated: (args, log) => { + console.log('args:', args) + }, +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchCreate` Parameters](/tempo/actions/token.watchCreate#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.create`](/tempo/actions/token.create) +- [`token.watchCreate`](/tempo/actions/token.watchCreate) diff --git a/site/tempo/hooks/token.useWatchMint.md b/site/tempo/hooks/token.useWatchMint.md new file mode 100644 index 0000000000..f9681f3915 --- /dev/null +++ b/site/tempo/hooks/token.useWatchMint.md @@ -0,0 +1,35 @@ +# `token.useWatchMint` + +Watches for token mint events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"bca02bde7cbd2b13b68198315831f106355326a3a7bb259d3bedb8adc457d8c2","data":"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="} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchMint({ + onMint: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchMint` Parameters](/tempo/actions/token.watchMint#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.mint`](/tempo/actions/token.mint) +- [`token.watchMint`](/tempo/actions/token.watchMint) diff --git a/site/tempo/hooks/token.useWatchRole.md b/site/tempo/hooks/token.useWatchRole.md new file mode 100644 index 0000000000..216c763484 --- /dev/null +++ b/site/tempo/hooks/token.useWatchRole.md @@ -0,0 +1,35 @@ +# `token.useWatchRole` + +Watches for role membership update events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"2a04f664116ac7d0cf34ca591cad47cbc06e1aab303131a088a76159faf54e6c","data":"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"} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchRole({ + onRoleUpdated: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchRole` Parameters](/tempo/actions/token.watchRole#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.grantRoles`](/tempo/actions/token.grantRoles) +- [`token.watchRole`](/tempo/actions/token.watchRole) diff --git a/site/tempo/hooks/token.useWatchTransfer.md b/site/tempo/hooks/token.useWatchTransfer.md new file mode 100644 index 0000000000..f050e741bb --- /dev/null +++ b/site/tempo/hooks/token.useWatchTransfer.md @@ -0,0 +1,35 @@ +# `token.useWatchTransfer` + +Watches for token transfer events on TIP20 tokens. + +## Usage + +::: code-group +```ts twoslash [example.ts] +// @twoslash-cache: {"v":1,"hash":"f4621a5648e0a663badc09437893499eb743897952bf9f61a7fc56fc1e4f1550","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808BLAWywlLQAIAJCCAawRU4aAIYckATioAbGGADmafEgCsVMaQUwGiELwFCQMxmFyIADFQDG+caOs1yiSQF8K6bOYLEylanS6ICxsHDx8gv4i4roAzADssvJKKojq1OLaQQaRsqbmAEw2dqQOTkgW7p44eIQk5BqBTKzsXGgC8lGaugAssUmKymoamTp47fydeWZIRSC29o5+iABsVdRetb4NAfR4AGYArmCOjBBgnIdwMADqomi2ACqlYHD7ZAA8AMLn+4wKAD4ABRYezMHRkOAAfkQnGAAB0LpxkQtTABJKAwzhgQ7MABGZE4AB9LmBYH8zFAANyI5HIzLQ2EIpF0un7UgQZhYgAGFloABJgCJSKYFK5ucTOLyBUK0CLFOLkABdSU4mQySXHcn5am01l09o8vmC4Wi8WS6UmuVm7nK1WHdWaskwCkwXUsziuJ3ayk0j3szkAIRkEGs/CxeP+pi4JK1Lp1ftZ5wAoqQOaQsUCgWR07DU+mAJScAC8AM4RAgjCgRdjztdUG98d9euRbHVWLlhxgjfrPYTLc4bZMijRYCcRFEMixOPxhNrPrdfebHvOz1Er3eGdhWYZsIA7vcni83mQAHQAQS0cAonBDCn3h/wa43Z4AMhAFEXS+XK9Wl27EwNDowCxR5gIxAB5UhzygKBSHgOB/3dVlrF+f4sR+MA/gUJDAOReRRDxORMVhPE+DkdckNwxFXALWEKyrREwFEcE4FBaxuyuW5H2fE8digUMED0HJOH2dhOAPB58FFThHjRAAFAoLE4CZ5BU49N04GASDHOBT38MQFCE5BkBAOgWKwOR/G5Gy0DgWhERCVo4XCQxPVEjlmE4AByA8FGYRgAHoaBabzEURI4TjQM4LnPLAsCBItmWRHI9NUsBTy4u4pN4zcgWSulVw0sggQZJKBxRc44AgORTzvIFvNyshEG8m8yoHdw9Vo8KkXgtBDlIC4PigRgiABbLbBksTSHU9c+L009Tw+QKRrGmjERs7kQCVChTNBUpmH8faWIhUhEIAWk4eSwVOvTtp2kBogkRAemkYxkiGRAAEYVhGLQxj0LKeOKnZh0KYpFnKb6CnWTAaj0Oo/EaPY9BBDkcA4DAiyKubN0zUqrwfHKQYvK8bzvImj1xt8Py/MsGL/ecmzdfwBOsISQC+ScZDxBx+BUiBOFMCtJgk/A1PSxDxG7OVqbTN19OEbokHiKx3sGVIvrVzQsjwHGX1B/IkH6eYSjKZYYY8DZ4Z8eoDKaVHjvBJwi13OEBwDZhYUtWV5TFbk8IF73jV9m1A5YiBjjQUiozHP1XC6GIkAADhNuQNaQHo/t1vQGX8MHjYh0olmcL7VFhzYEe2e2UZAEEbpd28P0pp8SffBRE+e5O3vTlJC4yf6gjvfOjcQE2FmLqGCi+iubcRnYaFr5jWPY7tUNeGqYERCcZvX6q5FhTD99wKg2Y5x5xalPfN4lZhoAdbssA5Igq3gThRE4OAQjkThYDxQ4FAKBktfH+yh7hC0Ql/AKMhxACxUuLREAApUQE4ADK1gRRYC4CA7s4IFhgEYHALyT9iCvwbHiDAEkYB4k4HiDke5rhnVPD1C+uD74/zoKEOyKk9yCzYjAawjA/jWE4KhFoZhdKIB6gAKk4OeKUR8b6iJgXARCe5GDKE4M7QgUBIGHFsO/RC3IcF1Q/IlbkN5jFVU3qeHM7BzHvzJFfaxtUDyDQcWA7BlECSXGuA2doEkRQ0DgeuShAA5aAMBTwACtIFyhgCxZhYBZHyIUCGXmGorEbzkBKUw0QThrzQgoAai4Al7iCTLQWyBuQkI4qo08IgBKHDQNyJUQJ8BoDQFgOAiBAqBUgLAWJp52AKBWoJQKMCaAiHOkQAoPRTy0ECqILAQVakIVPB05gMgADEazVGNMjmgV2ZJETVL2XpRpOZWntM6d03p/TIlDJGWM9mEz7jwDQDMuZCylkrMCucjZaAtm7I5HU1RaBYBpgLKeWSl80kQAyc47JMAJTWG8ZxPxEkNGEGaULFoHAZLKG7NyAZMBEA4NvuwqJPUAD60jpF3EGqKelNLYSsM4PCxFODOAIuiQItA3lELaOgFLeC2IYDYsJHvQhNAxwyAwIiOAGATj4A5JAK4t5GCiyJbQ+hjC5HyTRIhIllD4LXHxHIG8kAZrS3gTASh0qRDyDQPKxEoglUqrVZHRCJhRbcx5USmaETYAxLifBFielOCoJgDLS+1TIDBPOIOUFCFOBokChBa5HSuk9L6aSp5WgXlwDeVMz5sz5mLOWaslN9TNk7NEOdBNMBzrnHOuc86ZwizTURHfMVphprMHuDFJJiJky0Asj/K4hK4XpMnEi4+3IpFgA2jZWJiITH1W8uLdUgteGkBkFAbyBY/R9KuvKOysJt0hgkuwA9N4AkHOaeulxUTN1XsFgAUjgK1Hye6D1HpPYFM90YemcHfTe/dUB718IhYc59yLbFpnsWYPcnB8z2O8jcQgEBuk3mqtomSvMGx2HivIN0R7j2IlPfJc9iE7EzVYnAUQ2hHENmiGGWaHE4GXLTEu09yJ0OkFhFhvguHP6ch0NJRQtDRDEeWTgSkVGgOsnAcgbSk4lRpG+qoJT+pwHoMwWgU8pBjijgvoQzCi8uBAlJYgIgXsvqxAKN9ZOBZdMqa4BBPEfLHDGdM2AczcBLOBE4DZyJdmvaxAsJIMern3N0nAbZ6MZBmIyH+TW4tdABHNJiogeI8RvqSHi/SLgamJwyCVOdcp8nmorEQAUAoxX35cHUzIAzjAsGhaS2OFLk50uhgQoFLL1gcvnDy3VlYFg3NgH4wlrg3WnCpcCoO0wQ3ys0tNIoersQx49T3vNk6JYfI3EYI6AASgivJ5xvJ+hMW4sAQJuQABF1zaBmoKZeMBXAAEJOAvcUGQb73JKMzaAzRkDsJ/tvc4Cd87l2N5gF+1DwH0HP4QpzCu7kPUx0ToxdO4liicnKPdT0nqm010nCqlwQ5R2sioPiSxVBEnCB7kSrdqnWk0y050PT8NzAmfghZ2z+DIgtEYEJ92Ys4rUMmIl0CQ5N4cwg57eLl9piFANXA3+w9IPqO0cvTAHdEG71wLg2AZgquENvsN9er9P7fK3p14B4DkiwM293Y71HZuLcS8Q+mGzMBUOCYaiJnD15xMEek0RsDNXKQUed+D13yBBPCew2J/DknCOyZj6RykO04EY+XZT14B3wRHcw6djUF3IwI5uyr3393HvI/e8AT7P2/uvcB8DhP+uO8A5mrDqv8PqqI772977qPC+bQMsx4yplrgnxAMgaqA0OJtOzXcvpQDlCHDxKeMRDzBnFtJYFIiCLArlp+SYPEgUTGxILPdJWSdvoWDTh9VIiQB453mC+keMwXpFzmzOA9CzzeDzw1xBBAjCp/i+71SMbMYwBYihI3iLTDJYIxSTjXQHSgahLKh0Q/hVihYADUX0PK9QIYsmD+p8gkeAie3CAS3Ij6LSWKmiKGYMMKAAsg6NFJZN2JkLiM6ohGihcD4qCKom6DeOopokShFIwGdFwFxA2O6nasmiwOIJQvASxuuEoY6LJiNNFOcHOooYYp/LviIBoqNkXuVl2JAiwKdrAgEmcuevsECLEAWFmrcvcoOmAPEMMoWsOIcIst4W2ggcWt4bEOltGPsKeLEIClstNkCDqvweCLpO/GKv6mIZio4dyDljIKeAOvcOYuvrcrmofjAAWqMmfCWh8l8hWr8kFLkXETsrkQUWgK0edGVNCmTqunACLtgpHGOEdqoOzlbmYt5KhFHLCB+oejeBMWOLrmDr3nMdHJwOoNxrBk+sXsfOrg1MsS1LMQMUcj3hDqIocbCGsQ+hsWgJjj1NGt2NUo0a0UUTcjmvcvmnpM8lUZMjUZfpWn8o0XWtsi0ewIOm0SCfcB0VeF2uJL2t2P2uCQYRlDPkZEgCZI9KYBxP4EQBYKeF9LiRYBYI/o9MrN9F9F9AMH3GPNnADMYB+H/uYFnKbJDMsF9JbNUGAdXMjJAU7KdK7ITO7P6J5MHDKJtv7IHO0MKVaH7OKOHHfJMbQrHGgPHJ3LoKyYyb3J9IyTrDSXnNMAyYASXLMOXFbHDByXbFyXgGjDhmQJgEWOlKBOBFAFBDBHBKmkzPWKzDQXoC6WaohOJGiE9jyvsCoXJIpMpOlIrMSc/o5p/hqakOkNqUEOlPSUgL9EyZPBbK4A9KhLAM0Fwi5KlO5J7L+sxgFMFDAKFD1KlKeBGUDMTHLPlHqPrHxNuAyOTLTCWGWAVJVKMRrt5LuD+u1EiJ1EiOlLCN5HyEpNYASTObOXOfOQuYuQSa1DRFQSAM7KIEgKAIEPIF/OcOMAgK4K4EAA=="} +import { Hooks } from 'wagmi/tempo' + +Hooks.token.useWatchTransfer({ + onTransfer: (args, log) => { + console.log('args:', args) + }, + token: '0x20c0000000000000000000000000000000000000', +}) +``` +<<< @/snippets/react/config-tempo.ts{ts} [config.ts] +::: + +## Parameters + +See [Wagmi Action `token.watchTransfer` Parameters](/tempo/actions/token.watchTransfer#parameters) + +### config + +`Config | undefined` + +[`Config`](https://wagmi.sh/react/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiProvider`](https://wagmi.sh/react/api/WagmiProvider). + +## Action + +- [`token.transfer`](/tempo/actions/token.transfer) +- [`token.watchTransfer`](/tempo/actions/token.watchTransfer) diff --git a/site/tempo/keyManagers/http.md b/site/tempo/keyManagers/http.md new file mode 100644 index 0000000000..8c8dcb029d --- /dev/null +++ b/site/tempo/keyManagers/http.md @@ -0,0 +1,60 @@ +# `KeyManager.http` + +Manages public key registrations remotely on a server. + +## Usage + +```ts [wagmi.config.ts] +import { createConfig, http } from 'wagmi' +import { tempoTestnet } from 'wagmi/chains' +import { KeyManager, webAuthn } from 'wagmi/tempo' // [!code focus] + +export const config = createConfig({ + connectors: [webAuthn({ + keyManager: KeyManager.http('/keys'), // [!code focus] + })], + chains: [tempoTestnet], + multiInjectedProviderDiscovery: false, + transports: { + [tempoTestnet.id]: http(), + }, +}) +``` + +::: tip +In order for the above code snippet to work, you need to have a server running at the provided URL. Below +is an example using a [Cloudflare Worker](https://developers.cloudflare.com/workers) (but can work with any server runtime). + +[See more](https://docs.tempo.xyz/sdk/typescript/server/handler.keyManager) + +```ts +import { env } from 'cloudflare:workers' +import { Handler, Kv } from 'tempo.ts/server' + +export default { + fetch(request) { + return Handler.keyManager({ + kv: Kv.cloudflare(env.KEY_STORE), + path: '/keys', + }).fetch(request) + }, +} satisfies ExportedHandler +``` +::: + +## Parameters + +### url + +- **Type:** `string` + +URL to the key manager server. + +### options + +#### options.fetch + +- **Type:** `typeof globalThis.fetch` +- **Default:** `globalThis.fetch` + +Fetch function to use for the key manager server. diff --git a/site/tempo/keyManagers/index.md b/site/tempo/keyManagers/index.md new file mode 100644 index 0000000000..d02b12636a --- /dev/null +++ b/site/tempo/keyManagers/index.md @@ -0,0 +1,11 @@ +# Overview + +WebAuthn-based accounts in Tempo require the public key to be attached to transactions and other protocol features. +However, **it is not possible to extract a public key from a WebAuthn credential after its registration**. + +To solve this, we maintain a `credentialId → publicKey` mapping that stores the public key when the credential is first created. + +Key Managers are responsible for managing this mapping, allowing users to access their accounts from any device without losing their public key. + +- [**`http`**](/tempo/keyManagers/http) Manage public key registrations remotely on a server +- [**`localStorage`**](/tempo/keyManagers/localStorage) Manage public key registrations locally on the client device diff --git a/site/tempo/keyManagers/localStorage.md b/site/tempo/keyManagers/localStorage.md new file mode 100644 index 0000000000..b0173f069f --- /dev/null +++ b/site/tempo/keyManagers/localStorage.md @@ -0,0 +1,28 @@ +# `KeyManager.localStorage` + +Manages public key registrations in local storage on the client device. + +:::warning +The `KeyManager.localStorage()` implementation is not recommended for production use as it stores public keys on the client device, meaning it cannot be re-extracted when the user's storage is cleared or if the user is on another device. + +For production, you should opt for a remote key manager such as [`KeyManager.http`](/tempo/keyManagers/http). +::: + +## Usage + +```ts [wagmi.config.ts] +import { createConfig, http } from 'wagmi' +import { tempoTestnet } from 'wagmi/chains' +import { KeyManager, webAuthn } from 'wagmi/tempo' // [!code focus] + +export const config = createConfig({ + connectors: [webAuthn({ + keyManager: KeyManager.localStorage(), // [!code focus] + })], + chains: [tempoTestnet], + multiInjectedProviderDiscovery: false, + transports: { + [tempoTestnet.id]: http(), + }, +}) +``` diff --git a/site/tsconfig.json b/site/tsconfig.json index 053a800ac2..4f6eae7c47 100644 --- a/site/tsconfig.json +++ b/site/tsconfig.json @@ -6,7 +6,7 @@ "jsx": "preserve", "lib": ["DOM", "ESNext"], "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "Bundler", "noUnusedLocals": true, "paths": { "~/*": ["src/*"] diff --git a/site/uno.config.ts b/site/uno.config.ts new file mode 100644 index 0000000000..7862ae94fa --- /dev/null +++ b/site/uno.config.ts @@ -0,0 +1,22 @@ +import { + defineConfig, + presetAttributify, + presetIcons, + presetWind3, +} from 'unocss' + +export default defineConfig({ + shortcuts: [ + [ + 'btn', + 'px-4 py-1 rounded inline-flex justify-center gap-2 text-white leading-30px children:mya !no-underline cursor-pointer disabled:cursor-default disabled:bg-gray-600 disabled:opacity-50', + ], + ], + presets: [ + presetWind3({ + dark: 'media', + }), + presetAttributify(), + presetIcons({ scale: 1.2 }), + ], +}) diff --git a/site/vercel.json b/site/vercel.json index f7abbb9989..43e7b16173 100644 --- a/site/vercel.json +++ b/site/vercel.json @@ -1,6 +1,57 @@ { "cleanUrls": true, "redirects": [ + { + "source": "/tempo/actions/reward.start", + "destination": "/tempo/actions/reward.distribute", + "permanent": true + }, + { + "source": "/tempo/actions/reward.watchRewardScheduled", + "destination": "/tempo/actions/reward.watchRewardDistributed", + "permanent": true + }, + { + "source": "/tempo/actions/nonce.getNonceKeyCount", + "destination": "/tempo/actions/nonce", + "permanent": true + }, + { + "source": "/tempo/actions/nonce.watchActiveKeyCountChanged", + "destination": "/tempo/actions/nonce", + "permanent": true + }, + { + "source": "/tempo/actions/amm.watchFeeSwap", + "destination": "/tempo/actions/amm", + "permanent": true + }, + { + "source": "/tempo/hooks/reward.useStart", + "destination": "/tempo/hooks/reward.useDistribute", + "permanent": true + }, + { + "source": "/tempo/hooks/reward.useWatchRewardScheduled", + "destination": "/tempo/hooks/reward.useWatchRewardDistributed", + "permanent": true + }, + { + "source": "/tempo/hooks/nonce.useNonceKeyCount", + "destination": "/tempo/hooks/nonce", + "permanent": true + }, + { + "source": "/tempo/hooks/nonce.useWatchActiveKeyCountChanged", + "destination": "/tempo/hooks/nonce", + "permanent": true + }, + { + "source": "/tempo/hooks/amm.useWatchFeeSwap", + "destination": "/tempo/hooks/amm", + "permanent": true + }, + { "source": "/cli", "destination": "/cli/getting-started", @@ -42,6 +93,21 @@ "destination": "/core/api/createConfig", "permanent": true }, + { + "source": "/core/api/actions/getAccount", + "destination": "/core/api/actions/getConnection", + "permanent": true + }, + { + "source": "/core/api/actions/switchAccount", + "destination": "/core/api/actions/switchConnection", + "permanent": true + }, + { + "source": "/core/api/actions/watchAccount", + "destination": "/core/api/actions/watchConnection", + "permanent": true + }, { "source": "/react", @@ -98,6 +164,49 @@ "destination": "/react/api/hooks/useEstimateFeesPerGas", "permanent": true }, + { + "source": "/react/api/actions/useAccount", + "destination": "/react/api/actions/useConnection", + "permanent": true + }, + { + "source": "/react/api/actions/useAccountEffect", + "destination": "/react/api/actions/useConnectionEffect", + "permanent": true + }, + { + "source": "/react/api/actions/useSwitchAccount", + "destination": "/react/api/actions/useSwitchConnection", + "permanent": true + }, + + { + "source": "/core", + "destination": "/core/getting-started", + "permanent": true + }, + + { + "source": "/tempo", + "destination": "/tempo/getting-started", + "permanent": true + }, + + { + "source": "/vue/api/actions/useAccount", + "destination": "/vue/api/actions/useConnection", + "permanent": true + }, + { + "source": "/vue/api/actions/useAccountEffect", + "destination": "/vue/api/actions/useConnectionEffect", + "permanent": true + }, + { + "source": "/vue/api/actions/useSwitchAccount", + "destination": "/vue/api/actions/useSwitchConnection", + "permanent": true + }, { "source": "/examples/connect-wallet", diff --git a/site/vue/api/Nuxt.md b/site/vue/api/Nuxt.md index e785cfd702..f0a5239aa2 100644 --- a/site/vue/api/Nuxt.md +++ b/site/vue/api/Nuxt.md @@ -6,6 +6,7 @@ ::: code-group ```ts twoslash [nuxt.config.ts] +// @twoslash-cache: {"v":1,"hash":"a2f343760fd46f812e97826b5b6d3f1fdddb4ec07dbbf76cb4790a6383711285","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAIBjCGDhpesAGbswMAHIBXegGEhkgOaJeAERiTp8pSvaqAOmHYBbLBFKiJU2QrTKwayiBHMbSAJxVWMMFU0fCQARgA2KjRPVRgGRBA7PUdnVz97JAAGKn58T2Z+GnJEbwBfCnRsXATCEnIouniQFg4uPiSHAxcjRiksOTQNAEkwfqdDVQAefXHu1QpeVKMAGWYMMgBZOOYAPm5h0YGlqZnjhePV9dIt6J3TCysbMR17U4m3Dy9EcIBmPwCgiFEBEojE4ngOm85m4ONIkAAmHJ5UgFIphACs5UqODwtTIbho9CYWFIEBwNgwfHM0Dk/jgAH4NIwRKQpKpeAAfXjiNhwGCc3gzDY0/yTZhgDALAAKnjQnFYYolOwWPNYfJ2AuQzLQrMCAqFIpgk2FUFpMAA8lg5UI4NLZfLjYbLdbhMrubyYBquXIwB0oNx6QtGMBTLww7xkLQNCy2QBdDTijAAblMpQFPr9AdjArAtNY6d9L2k/uQ2e9hd0MCgbigEH4CASJrNcF4nn5M14jQCcHYNt4AHd8OxcgJxZ36AEoLx2GgW4JSPzxD7Cr2wGwZxhW77W1Ap5O6S2pDRVCiXXAAHSmUwAUQK+F41NN/mnLZgM/wZFbvBjesYg+H978GOC7iJ+aAQF+WAFAA1swsQLNYvAAEb8swvBQcEvDgV+kj+NwCxoWgchYM+/bvlhH4PoarYtpIpAiN+OpsluU7BPyZJnjRX58oI24QEhABWMCFAhpBbtOYCwvyj5mtyy4upeYAdkx8BYRBC5wBArAkJ2d7TjQ5gSRR0mGi2ngopucg9nqkCwLwC4AI5yOwC7ocwmG9GAvAAAa2TAAD6Ml0t5fDiqxH5eWRrD5ih9nwFpJBTuIpKGSSEBCYUPlwKQ/CaC53nTuIPkAH4FeuXAvrwVlVueBJwQ2yDIOAEA0G4TZ0q2rl0MJAxVt+MBOQEcpsKwm6acZvDWLAYnsIeljWNEYBoOevAAGIuSICxsVRT6qX6Rm+Y4568Wo56zmVrmsBAzCwFAK0ACoRQsQWqeIEAZkZ23eS9cAAPTeaYUAucJ4GkJubbjj1NBQAR25sZuV03UZbBYHkKFykB+ZTWQtWxhQTV0Mwlj+G43lkwJcCmD9GjIKGvC/b9vAAKrWeyUH8LBsS8Gu5gwHTADkAACub0BTv3MLQvZwPzFB0wzvAAEowKw7nsDp2EYO9YlpRlojZblLkC8Vv0/eL/bxbz54UzLcuM1KpJEOwQN6hxq6U15EZCyLaBi6oEAQKo/gALTimwGAY9LCzAFVzAaPzAAaoTwj8AAs6LhAA7PzvClHjtu8CMUnPLoM6rnTS5gCuQi8IwfDAKUpixqYZPeSAsZ4+40RfAAHCn/yBMESAZ6CpCxE0P0whkiB/CAuT5IU+KIPCuc5NA1QgA8C28NHkIpBMOfcilvD897v0nUY/NXtItCPLYOjMLSd+VlCajBnT1Oe4L/ZweY7C/UQcgYC/W9vzPOYBSjcDcLzaISBQBdmEKuPAs4QClFKEAA"} import { defineNuxtConfig } from 'nuxt/config' export default defineNuxtConfig({ @@ -14,12 +15,12 @@ export default defineNuxtConfig({ ``` ```vue [index.vue] ``` <<< @/snippets/vue/config.ts[config.ts] diff --git a/site/vue/api/composables.md b/site/vue/api/composables.md index 8d1babb981..b3c3f265cd 100644 --- a/site/vue/api/composables.md +++ b/site/vue/api/composables.md @@ -13,7 +13,7 @@ Vue Composables for accounts, wallets, contracts, transactions, signing, ENS, an ## Import ```ts -import { useAccount } from '@wagmi/vue' +import { useConnection } from '@wagmi/vue' ``` ## Available Composables diff --git a/site/vue/api/composables/useAccount.md b/site/vue/api/composables/useAccount.md deleted file mode 100644 index 41bf8727c3..0000000000 --- a/site/vue/api/composables/useAccount.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: useAccount -description: Composable for getting current account. ---- - -# useAccount - -Composable for getting current account. - -## Import - -```ts -import { useAccount } from '@wagmi/vue' -``` - -## Usage - -::: code-group -```vue twoslash [index.vue] - - - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - -## Parameters - -```ts twoslash -import { type UseAccountParameters } from '@wagmi/vue' -``` - -### config - -`Config | undefined` - -[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiPlugin`](/vue/api/WagmiPlugin). - -::: code-group -```vue [index.vue] - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - -## Return Type - -```ts twoslash -import { type UseAccountReturnType } from '@wagmi/vue' -``` - - - -## Action - -- [`getAccount`](/core/api/actions/getAccount) diff --git a/site/vue/api/composables/useBalance.md b/site/vue/api/composables/useBalance.md index a84f6ba886..ee558d11e6 100644 --- a/site/vue/api/composables/useBalance.md +++ b/site/vue/api/composables/useBalance.md @@ -1,19 +1,19 @@ --- title: useBalance -description: Composable for fetching native currency or token balance. +description: Composable for fetching native currency balance. --- # useBalance -Composable for fetching native currency or token balance. +Composable for fetching native currency balance. ## Import @@ -168,47 +168,6 @@ const result = useBalance({ <<< @/snippets/vue/config.ts[config.ts] ::: -### token - -`Address | undefined` - -ERC-20 token address to get balance for. - -::: code-group -```vue [index.vue] - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - -### unit - -`'ether' | 'gwei' | 'wei' | number | undefined` - -- Units to use when formatting result. -- Defaults to `'ether'`. - -::: code-group -```vue [index.vue] - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - ## Return Type diff --git a/site/vue/api/composables/useClient.md b/site/vue/api/composables/useClient.md index 18b3ca91fc..322fcced71 100644 --- a/site/vue/api/composables/useClient.md +++ b/site/vue/api/composables/useClient.md @@ -5,7 +5,7 @@ description: Composable for getting Viem `Client` instance. # useClient -Composable for getting Viem [`Client`](https://viem.sh/docs/clients/custom.html) instance. +Composable for getting Viem [`Client`](https://viem.sh/docs/clients/custom) instance. ## Import @@ -81,7 +81,7 @@ import { type UseClientReturnType } from '@wagmi/vue' `Client | undefined` -Viem [`Client`](https://viem.sh/docs/clients/custom.html) instance. +Viem [`Client`](https://viem.sh/docs/clients/custom) instance. ## Action diff --git a/site/vue/api/composables/useConnect.md b/site/vue/api/composables/useConnect.md index d1d586c561..4b4dabd558 100644 --- a/site/vue/api/composables/useConnect.md +++ b/site/vue/api/composables/useConnect.md @@ -10,7 +10,7 @@ const typeName = 'Connect' const mutate = 'connect' const TData = '{ accounts: readonly [Address, ...Address[]]; chainId: number; }' const TError = 'ConnectErrorType' -const TVariables = '{ chainId?: number | undefined; connector?: CreateConnectorFn | Connector | undefined; }' +const TVariables = '{ chainId?: number | undefined; connector?: CreateConnectorFn | Connector | undefined; withCapabilities?: boolean | undefined }' # useConnect @@ -31,11 +31,11 @@ import { useConnect } from '@wagmi/vue' import { useConnect } from '@wagmi/vue' import { injected } from '@wagmi/connectors' -const { connect } = useConnect() +const connect = useConnect() @@ -61,7 +61,7 @@ import { type UseConnectParameters } from '@wagmi/vue' import { useConnect } from '@wagmi/vue' import { config } from './config' // [!code focus] -const result = useConnect({ +const connect = useConnect({ config, // [!code focus] }) @@ -77,31 +77,6 @@ const result = useConnect({ import { type UseConnectReturnType } from '@wagmi/vue' ``` -### connectors - -`readonly Connector[]` - -Globally configured connectors via [`createConfig`](/vue/api/createConfig#connectors). Useful for rendering a list of available connectors. - -::: code-group -```vue [index.vue] - - - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - ::: tip diff --git a/site/vue/api/composables/useConnection.md b/site/vue/api/composables/useConnection.md new file mode 100644 index 0000000000..1bd5e7972c --- /dev/null +++ b/site/vue/api/composables/useConnection.md @@ -0,0 +1,83 @@ +--- +title: useConnection +description: Composable for getting current connection. +--- + +# useConnection + +Composable for getting current connection. + +## Import + +```ts +import { useConnection } from '@wagmi/vue' +``` + +## Usage + +::: code-group +```vue twoslash [index.vue] +// @twoslash-cache: {"v":1,"hash":"13c71d856a5988592573d4377882b1c1fa1e1a07a6da8a54925e9753a897fb69","data":"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"} + + + +``` +<<< @/snippets/vue/config.ts[config.ts] +::: + +## Parameters + +```ts twoslash +// @twoslash-cache: {"v":1,"hash":"7e300c04b97782c39df43713d56b7a3f066187bfbb69ba67cfe1b4d60e143b11","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAKpwYAYQhgwMAMZp2kgArNSzALYwapOAB4ZkgGbsA5rzo0wUOLwlgjpgLw3DJgHy8nwADphef3vp2JgD8iAEupgA+zkFRvACuljBG0lAA3D4Avj7salgQpGjCorbScgpgyqoaWghUcGgqDIgAjAAsVKwwYMZo+EgATADMVI2kxpp4IuKSZfJKKuqaZHUgHNJIAAxUMviLcmRI7ZkAujvQuIggufmFvMD82DDFM1Ky85WLNSu8mbwGpAgal4AHIAAIAd2YxjU7AA9ER4jAQZQQDVmEhQOZunAKng0AhMpkgA=="} +import { type UseConnectionParameters } from '@wagmi/vue' +``` + +### config + +`Config | undefined` + +[`Config`](/vue/api/createConfig#config) to use instead of retrieving from the nearest [`WagmiPlugin`](/vue/api/WagmiPlugin). + +::: code-group +```vue [index.vue] + +``` +<<< @/snippets/vue/config.ts[config.ts] +::: + +## Return Type + +```ts twoslash +// @twoslash-cache: {"v":1,"hash":"b6f1971287fb7adb77e1a5d5dc952329e6dd516b560ac655f5064dcb9d4b925c","data":"N4Igdg9gJgpgziAXAbVAFwJ4AcZJACwgDcYAnEAGhDRgA808AKAQwBsBLZuASgAJMcvAKpwYAYQhgwMAMZp2kgEow0AV1JgAKthgAeGZIBm7AOa86NMFDi8JYY2YC8to6YB8vZ5ojLDcXcAAOmC8obzMUFCk8HCIvKpWMMbSUADcwWHhkdFworHxickwaRlhMvjM7GBxCbBFJSFlFVUAklA1hVXF6Y2hBlKyaBCkHXVdDZnscHbScsVxhmyiPZNwyv2z8mAmC0swK2FTM4NVO7yLrMuloVMAIlMbg/P8pKr717xwaMxq+YEgUAekk2xX+PQAvh4AD68by+fxBXpZKIxOIAQWyMQOoQiKNy8Di0QiklYGF4yAxeLgFF4ADp6ZScnBkABdFnY3jlSrVXiMOwOcz0GBWGz9AUAflszRCcTFpmQ/y5VTg/xZyDAqgAtgAjMgsvgw2pJcYcpVgNpxDU6sim4GDYZxY5yYYco52ubtF5vV3Td1bM4XK5Iu5AgYe3aXd7BtayP2nCNBzJfH6qP4gR4esHBSG8GFwpL+em06GwnwF3RFtzBdiarDDNDCURO+RKFTqLQ6SggZOkBiIACMABYqKxhSY0PgkAAmADMVG+pBMKjwInEcdbag02hwXY40iQAAYqFzSMw5uQB4PwSzj9BcIgQDW673eMB+DpG2uwy2wMpNx3BHBc5SAgTVeAAcgAAQAd2YExNXYAB6Ig3nArtNRUZgkFACxhTgBQwDwNAEHBcEgA=="} +import { type UseConnectionReturnType } from '@wagmi/vue' +``` + + + +## Action + +- [`getConnection`](/core/api/actions/getConnection) diff --git a/site/vue/api/composables/useAccountEffect.md b/site/vue/api/composables/useConnectionEffect.md similarity index 65% rename from site/vue/api/composables/useAccountEffect.md rename to site/vue/api/composables/useConnectionEffect.md index 8f42d593d2..1446fd9474 100644 --- a/site/vue/api/composables/useAccountEffect.md +++ b/site/vue/api/composables/useConnectionEffect.md @@ -1,16 +1,16 @@ --- -title: useAccountEffect -description: Composable for listening to account lifecycle events. +title: useConnectionEffect +description: Composable for listening to connection lifecycle events. --- -# useAccountEffect +# useConnectionEffect -Composable for listening to account lifecycle events. +Composable for listening to connection lifecycle events. ## Import ```ts -import { useAccountEffect } from '@wagmi/vue' +import { useConnectionEffect } from '@wagmi/vue' ``` ## Usage @@ -18,9 +18,9 @@ import { useAccountEffect } from '@wagmi/vue' ::: code-group ```vue [index.vue] @@ -60,7 +60,7 @@ import { type UseDisconnectParameters } from '@wagmi/vue' import { useDisconnect } from '@wagmi/vue' import { config } from './config' // [!code focus] -const result = useDisconnect({ +const disconnect = useDisconnect({ config, // [!code focus] }) @@ -76,32 +76,6 @@ const result = useDisconnect({ import { type UseDisconnectReturnType } from '@wagmi/vue' ``` -### connectors - -`readonly Connector[]` - -Connectors that are currently connected. Useful for rendering a list of connectors to disconnect. - -::: code-group -```vue [index.vue] - - - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - diff --git a/site/vue/api/composables/useEstimateGas.md b/site/vue/api/composables/useEstimateGas.md index 4c05fa7674..45a0e26866 100644 --- a/site/vue/api/composables/useEstimateGas.md +++ b/site/vue/api/composables/useEstimateGas.md @@ -189,7 +189,7 @@ const result = useEstimateGas({ `bigint | undefined` -The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms.html#legacy-transaction). +The price in wei to pay per gas. Only applies to [Legacy Transactions](https://viem.sh/docs/glossary/terms#legacy-transaction). ::: code-group ```vue [index.vue] @@ -212,7 +212,7 @@ const result = useEstimateGas({ `bigint | undefined` -Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Total fee per gas in wei, inclusive of [`maxPriorityFeePerGas`](#maxPriorityFeePerGas). Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```vue [index.vue] @@ -235,7 +235,7 @@ const result = useEstimateGas({ `bigint | undefined` -Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms.html#eip-1559-transaction). +Max priority fee per gas in wei. Only applies to [EIP-1559 Transactions](https://viem.sh/docs/glossary/terms#eip-1559-transaction). ::: code-group ```vue [index.vue] diff --git a/site/vue/api/composables/useReadContract.md b/site/vue/api/composables/useReadContract.md index 98e44af8c1..f113479701 100644 --- a/site/vue/api/composables/useReadContract.md +++ b/site/vue/api/composables/useReadContract.md @@ -314,6 +314,7 @@ With [`abi`](#abi) setup correctly, TypeScript will infer the correct types for ::: code-group ```ts twoslash [Inline] +// @twoslash-cache: {"v":1,"hash":"c9cd30cf155368eb52dff62473381dfcdf7018daabaed2ca4c58019bdbc995a3","data":"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"} import { createConfig, http, useReadContract } from '@wagmi/vue' import { mainnet, sepolia } from 'wagmi/chains' @@ -359,6 +360,7 @@ result.data ``` ```ts twoslash [Const-Asserted] +// @twoslash-cache: {"v":1,"hash":"b21638ef6d0df571da0457691c07531820bda58a8bf70cddee1ce9852f692ff4","data":"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"} import { createConfig, http, useReadContract } from '@wagmi/vue' import { mainnet, sepolia } from 'wagmi/chains' diff --git a/site/vue/api/composables/useReconnect.md b/site/vue/api/composables/useReconnect.md index 56316fee5f..6d4a2b470b 100644 --- a/site/vue/api/composables/useReconnect.md +++ b/site/vue/api/composables/useReconnect.md @@ -31,9 +31,9 @@ import { useReconnect } from '@wagmi/vue' import { useReconnect } from '@wagmi/vue' import { useEffect } from 'react' -const { reconnect } = useReconnect() +const reconnect = useReconnect() -reconnect() +reconnect.mutate() ``` @@ -61,7 +61,7 @@ import { type UseReconnectParameters } from '@wagmi/vue' import { useReconnect } from '@wagmi/vue' import { config } from './config' // [!code focus] -const result = useReconnect({ +const reconnect = useReconnect({ config, // [!code focus] }) @@ -77,26 +77,6 @@ const result = useReconnect({ import { type UseReconnectReturnType } from '@wagmi/vue' ``` -### connectors - -`readonly Connector[]` - -Globally configured connectors via [`createConfig`](/vue/api/createConfig#connectors). - -::: code-group -```vue [index.vue] - -``` -<<< @/snippets/vue/config.ts[config.ts] -::: - diff --git a/site/vue/api/composables/useSendTransaction.md b/site/vue/api/composables/useSendTransaction.md index 62f581143a..8913dc1a43 100644 --- a/site/vue/api/composables/useSendTransaction.md +++ b/site/vue/api/composables/useSendTransaction.md @@ -31,12 +31,12 @@ import { useSendTransaction } from '@wagmi/vue' import { useSendTransaction } from '@wagmi/vue' import { parseEther } from 'viem' -const { sendTransaction } = useSendTransaction() +const sendTransaction = useSendTransaction()